From dcb343d3debd01c141ed96d29cb15bcc2d9882c1 Mon Sep 17 00:00:00 2001 From: Aleksander <170264518+t-aleksander@users.noreply.github.com> Date: Thu, 31 Oct 2024 13:28:40 +0100 Subject: [PATCH] merge dev -> main (#349) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * After configuring the client with enrollment go to the instance and not adding new instance (#255) * change redirect from addInstant to instantPage * del wireguard-go binary * add app handle for opening app icon from dock in macOS (#260) * Delete wireguard-go-aarch64-apple-darwin accidentally added binaries for macOS * Detail view and grid view (#256) * store ClientView preference into database + if single location with no preference then choose detail view * impl ClientView preference in frontend * swap default value in .envrc * delete attribute from SelectedInstance * Fixes in the enrollment process (#262) * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * X64 on lint.yml * first version of toaster for token expiration * add toaster for token expiration * change type of res.data when receiving data from pxoy * Client should remember last instance (#263) * X64 on lint.yml * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * fix active instance bugs (#268) * set new activeLocationId after deleting instance * fix closing modals after deleting instance * del unecessary import * Carousel defguard instances (#261) * 'defguard Instances' now redirect to carousel page * navigate to carousel if instances and tunnels lists are empty * add X64 compile options * prerelease 0.5.0 (#269) * After configuring the client with enrollment go to the instance and not adding new instance (#255) * change redirect from addInstant to instantPage * del wireguard-go binary * add app handle for opening app icon from dock in macOS (#260) * Delete wireguard-go-aarch64-apple-darwin accidentally added binaries for macOS * Detail view and grid view (#256) * store ClientView preference into database + if single location with no preference then choose detail view * impl ClientView preference in frontend * swap default value in .envrc * delete attribute from SelectedInstance * Fixes in the enrollment process (#262) * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * X64 on lint.yml * first version of toaster for token expiration * add toaster for token expiration * change type of res.data when receiving data from pxoy * Client should remember last instance (#263) * X64 on lint.yml * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * fix active instance bugs (#268) * set new activeLocationId after deleting instance * fix closing modals after deleting instance * del unecessary import * Carousel defguard instances (#261) * 'defguard Instances' now redirect to carousel page * navigate to carousel if instances and tunnels lists are empty * add X64 compile options * prerelease 0.5.0 * Version pre 0.5.0 (#270) * prerelease 0.5.0 * update external packages * update rust version from 1.74 to 1.75 --------- Co-authored-by: Aleksander <170264518+t-aleksander@users.noreply.github.com> * Version pre 0.5.0 (#271) * prerelease 0.5.0 * update external packages * update rust version from 1.74 to 1.75 * undo migration file --------- Co-authored-by: Aleksander <170264518+t-aleksander@users.noreply.github.com> * Logs in critical places (#273) * set new activeLocationId after deleting instance * fix closing modals after deleting instance * del unecessary import * add logs about network error * del wireguard-go * add networkError type * Client should remember last instance (#277) * X64 on lint.yml * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * fix None occurence if there are no any type of errors * Update src/pages/client/pages/ClientInstancePage/components/StatsLayoutSelect/StatsLayoutSelect.tsx Co-authored-by: Aleksander <170264518+t-aleksander@users.noreply.github.com> --------- Co-authored-by: Aleksander <170264518+t-aleksander@users.noreply.github.com> * Client should remember last instance (#278) * X64 on lint.yml * save selectedInstance view after closing client * save last selected location from instance after closing client * fix tunnel pages * add X64 * fix None occurence if there are no any type of errors * del cargo.lock * remove None from selected view * Code cleanup; service: log dir is a hidden option * Handle quit in AppState * Bump vite * Install Ctrl-C handler; remove unwrap()s * Bump pnpm to v9 * Add known issue to readme * impl tray menu instance submenu (#289) * impl tray menu instance submenu * refactor handle_tray_event * Apply suggestions from code review Co-authored-by: Adam * Apply suggestions from code review part 2 Co-authored-by: Adam * Apply suggestions from code review part 3 * add mfa trigger event --------- Co-authored-by: Adam * Fix: connect location from tray menu (#291) * del preshared_key from event tray menu * cargo fmt && cargo clippy * enhance ux when the desktop configuration session expires (#292) * fixes * fix tests * feat: config polling (#283) * Update protos * Change log level * add reload tray menu in commands: update_instance & delete_instance * update reload tray menu * swap maybe_update with reload_tray_menu * chore: more logs for enrollment process (#296) * chore: database::models module refactoring (#295) * Typestate for Connection * Typestate for `Tunnel` * Refactor `Settings::init_default` method * Typestate for `WireguardKeys` * Typestate for LocationStats & TunnelStats * Typestate for `InstanceInfo` * Working transaction in polling * All models transaction-ready * Remove superfluous FromRow; code cleanup --------- Co-authored-by: Adam Ciarciński * CI: stick to X64 self-hosted runner * Fix update_tunnel (#300) * feat: add option to prevent routing all traffic through the vpn (#297) * handle disabling route all traffic option on client * cargo fmt * disable_route_all_traffic -> disable_all_traffic * update protobufs * cleanup, fix dev merge conflict errors * Bump defguard_wireguard_rs to v0.4.8 * Handle gRPC connection loss (#288) * fix: fix locked db issue (#298) * Bump defguard_wireguard_rs to 0.4.9 * Rework instance config fetching (#301) * disconnect all traffic when the option changes * sqlx prepare * rework instance settings fetching * cleanup * fix misleading log * update protos * cargo prepare * fix: failed polling request shouldn't make disconnect fail (#303) * Generate polling token on instance update (#304) * set token on update * emit event after commiting * sqlx prepare * multiple dns servers and search domains (#306) * multiple dns and search domains * capitalize * bump wireguard rs (#307) * bump wireguard version (#308) * Updated wireguard-rs dependency * Build deb packages for arm, remove AppImage (#316) * try building client for both architectures * attempt 2 * add dependency * Revert "add dependency" This reverts commit 77204eb5a521a6cdee4f48db2d8b0e2551a9289e. * Revert "attempt 2" This reverts commit 01948b0f8c2d09a21cc793c92edb5e9e78def551. * trigger ci * trigger ci 2 * build only for arm * trigger ci 3 * protobuf compiler * finish arm building * attempt 2 * fix * cleanup * WGApi and route cleanup (#318) * wg-rs version bump to 0.5.1 (#322) * Restart defgaurd-service on re-installation (#321) * fix: fix minor bugs (#323) * fix saving a new tunnel * fix font * allow number input * add messages to error toasts * rephrase * New log watcher (#324) * New log watcher * fix inifnite loop, don't parse empty lines * change logs --------- Co-authored-by: Aleksander <170264518+t-aleksander@users.noreply.github.com> * move config polling to enterprise (#328) * feat: Display all logs in settings (#327) * fix number input * New log watcher * fix inifnite loop, don't parse empty lines * global log watcher 1 * cleanup * fix * fix --------- Co-authored-by: Adam Ciarciński * Align dev branch with main (#336) * Update README.md * move pre/post command functionality to client (#331) * move command functionality to client * fix builds * fix linter * update workflow * change version to 0.4.1 * fmt * command cleanup --------- Co-authored-by: Robert Olejnik * Change some logs, update wireguard-rs to 0.5.2 (#337) * change logs 1 * don't poll instance that has no token * check if thread is cancelled before executing the loop code * change logs * fix log levels * change some logs * cleanup * bump wireguard-rs * sqlx prepare * fix config polling comparison bug (#338) * Log improvements (#340) * some log improvements, also updates the documentation url * cleanup * cleanup 2 * sqlx prepare * bump wireguard-rs to 0.5.5 * feat: Sync system's connection state on windows (#346) * sync client connections on windows * add target_os to imports * add target_os to more imports * change log message * Bump client version, move more enterprise logic to enterprise folder (#348) * move the disable enterprise function to the enterprise folder * bump version --------- Co-authored-by: Cyprian <46838495+cpprian@users.noreply.github.com> Co-authored-by: Adam Ciarciński Co-authored-by: Robert Olejnik Co-authored-by: Jacek Chmielewski Co-authored-by: cpprian --- .editorconfig | 5 + .github/pull_request_template.md | 6 +- .github/workflows/lint.yaml | 5 +- .gitignore | 4 + README.md | 42 +- package.json | 18 +- pnpm-lock.yaml | 10479 +++++++++------- resources-linux/defguard-service.service | 2 +- src-tauri/.envrc | 1 - ...187d1b7d5692ce7e0ca467465e78f873e0901.json | 68 + ...73a6a3b08c8d615b404f9917c5158d4857dd.json} | 10 +- ...17eadddbc843e42545860afdd8ad6951b4ee.json} | 10 +- ...bb5148296157f00ef39610c18fc290da384bf.json | 20 + ...84ec7803dd0e9db5b7326a67b864d1f47410.json} | 8 +- ...a0732064face52dbebc0f5679af357c262a98.json | 32 + ...34948a042acdb8363f7735642da642420bfe6.json | 56 - ...1301e06c48260f003893a27ed283f943551f.json} | 10 +- ...b87fa1e942627ce93fbb97d61d8854e555880.json | 56 + ...3072d183075951f3ebe6c17f27a5e92a3e4b6.json | 56 - ...0cebf2afc3ad798638db9ea0aabcd506192b.json} | 14 +- ...494c2471bf7180483796d1ff4419a5e9b488d.json | 62 - ...333d32a45eee6b9a70bb74713bee2f6283321.json | 12 - ...91ba1687e05e1ca265965b8e0adcf42f21bc.json} | 6 +- ...b7f10eb86c8341e3cc0bc081e5c4dcbcee44.json} | 26 +- ...8241f97d604243f387ca9f1a12264b79fb16.json} | 14 +- ...60be3da33c4d1ca49e56b08154aa2ad7b8a0.json} | 8 +- ...5996902572e5ca3d365235a86e3464215cc1.json} | 10 +- ...d87614e9b7c018b83107d97e48ee2713808b8.json | 62 - ...53814e7930c5387f785ba2cdb0d08c43f4d11.json | 32 + ...a59d947ae38b9ddf85a12e6c7bc9a6767f08.json} | 8 +- ...e2cc7673709453d011e627930d6c184966d36.json | 20 + ...034d4babc9e3fd18236fd1c18e3c3abefd10.json} | 10 +- ...5d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a.json} | 14 +- ...0150e028179c78faf340ae3cd2f60b6c7e772.json | 62 + ...b24e04caad767c088dd490dc38663494c22d.json} | 4 +- ...47e9d7c7062bc43c84d3405a19c94006b8f8.json} | 10 +- ...e37c97a45f123d0fd59029b13ac4488cbaf67.json | 2 +- ...394fbc68b54cf5ebf36764becbc42c89ad21.json} | 14 +- ...001d5554b4a33fd0d48dbd2d3303aecb4fca2.json | 62 + ...32e5422db84d0d110f2068419131947f07db3.json | 56 + ...c0e87d3a54d536ef96a923a6b949e16b9746e.json | 12 + ...966d29003dd126f4ac0f8c5236d00891b31c5.json | 68 + ...c652fc89286481300450763a7a9b66d146f9.json} | 26 +- ...d217b7e37fb90d7d343637bf7d00845fcfdf2.json | 10 +- ...833962b82c95d4b98993264cb55f9e96c81c0.json | 12 + ...6df117d179fb4e52dfb9d5ff5be9b41518d8.json} | 10 +- ...cae78c3c8f3395a7e594aa696c4f63e55d5b.json} | 10 +- ...e68ace8457b4983724957092db618b2535d4.json} | 10 +- ...5b0afed84e572ef3e514212fa1b4cf8ccff2.json} | 6 +- ...b6d3641667119ee0f817cc510f12ee9643bd.json} | 8 +- ...2c98246ccc4b567f869140d859b3e196f46e.json} | 8 +- ...81479f26da26e445a636d7cf6690a9d7a720f.json | 32 - ...014713157173b1c8e9f3f3ad81c10ff674744.json | 32 - ...bfafdb61c86b0e9486ff0561a7bd80fd6ba8.json} | 10 +- src-tauri/Cargo.lock | 2997 +++-- src-tauri/Cargo.toml | 77 +- src-tauri/build.rs | 8 +- ...0240717141723_add_selected_view_column.sql | 1 + .../20240828072527_add_polling_token.sql | 1 + ...09092543_add_disable_route_all_traffic.sql | 1 + ...0912084922_add_enterprise_enabled_flag.sql | 1 + src-tauri/proto | 2 +- .../resources/net.defguard.plist | 4 +- src-tauri/resources-macos/scripts/postinstall | 3 +- .../resources/icons/tray-32x32-black.png | Bin 1029 -> 945 bytes .../resources/icons/tray-32x32-color.png | Bin 1251 -> 992 bytes src-tauri/resources/icons/tray-32x32-gray.png | Bin 1244 -> 1001 bytes .../resources/icons/tray-32x32-white.png | Bin 1049 -> 980 bytes src-tauri/src/appstate.rs | 102 +- src-tauri/src/bin/defguard-client.rs | 201 +- src-tauri/src/bin/defguard-service.rs | 4 +- src-tauri/src/commands.rs | 822 +- src-tauri/src/database/mod.rs | 128 +- src-tauri/src/database/models/connection.rs | 161 +- src-tauri/src/database/models/instance.rs | 245 +- src-tauri/src/database/models/location.rs | 374 +- .../src/database/models/location_stats.rs | 177 + src-tauri/src/database/models/mod.rs | 8 + src-tauri/src/database/models/settings.rs | 85 +- src-tauri/src/database/models/tunnel.rs | 586 +- .../src/database/models/wireguard_keys.rs | 69 +- src-tauri/src/enterprise/mod.rs | 2 + src-tauri/src/enterprise/models/instance.rs | 24 + src-tauri/src/enterprise/models/mod.rs | 1 + src-tauri/src/enterprise/periodic/config.rs | 248 + src-tauri/src/enterprise/periodic/mod.rs | 1 + src-tauri/src/error.rs | 15 +- src-tauri/src/events.rs | 6 + src-tauri/src/lib.rs | 48 +- .../src/log_watcher/global_log_watcher.rs | 492 + src-tauri/src/log_watcher/mod.rs | 64 + .../service_log_watcher.rs} | 258 +- src-tauri/src/periodic/mod.rs | 1 + .../version.rs} | 17 +- src-tauri/src/service/config.rs | 9 + src-tauri/src/service/mod.rs | 176 +- src-tauri/src/service/utils.rs | 28 +- src-tauri/src/service/windows.rs | 119 + src-tauri/src/service/windows_service.rs | 120 - src-tauri/src/tray.rs | 208 +- src-tauri/src/utils.rs | 979 +- src-tauri/src/wg_config.rs | 14 +- src-tauri/tauri.conf.json | 5 +- src/components/App/App.tsx | 8 + src/i18n/en/index.ts | 25 +- src/i18n/formatters.ts | 11 +- src/i18n/i18n-types.ts | 94 +- src/pages/client/ClientPage.tsx | 26 +- src/pages/client/clientAPI/clientApi.ts | 16 +- src/pages/client/clientAPI/types.ts | 11 +- .../ClientSideBar/ClientSideBar.tsx | 8 +- .../ClientBarItem/ClientBarItem.tsx | 20 +- src/pages/client/hooks/useClientFlags.tsx | 6 + src/pages/client/hooks/useClientStore.tsx | 15 +- .../CarouselPage/cards/CarouselCards.tsx | 4 +- .../AddInstanceDeviceForm.tsx | 74 +- .../AddInstanceDeviceForm/style.scss | 4 + .../AddInstanceInitForm.tsx | 63 +- .../AddTunnelFormCard/AddTunnelFormCard.tsx | 5 +- .../components/EditTunnelFormCard.tsx | 6 +- .../DeleteTunnelModal/DeleteTunnelModal.tsx | 6 +- .../ClientInstancePage/ClientInstancePage.tsx | 37 +- .../LocationsList/LocationsList.tsx | 68 +- .../LocationCardConnectButton.tsx | 24 +- .../LocationCardRoute/LocationCardRoute.tsx | 14 +- .../LocationsDetailView.tsx | 39 +- .../LocationDetailCard/LocationDetailCard.tsx | 244 +- .../components/LocationLogs/LocationLogs.tsx | 4 +- .../LocationsGridView/LocationsGridView.tsx | 23 +- .../StatsLayoutSelect/StatsLayoutSelect.tsx | 46 +- .../DeleteInstanceModal.tsx | 16 +- .../components/UpdateInstanceModalForm.tsx | 12 +- .../ClientSettingsPage/ClientSettingsPage.tsx | 10 +- .../components/GlobalLogs/GlobalLogs.tsx | 182 + .../GlobalLogs/GlobalLogsSelect.tsx | 71 + .../GlobalLogs/GlobalLogsSourceSelect.tsx | 71 + .../components/GlobalLogs/style.scss | 62 + .../pages/ClientSettingsPage/style.scss | 7 + src/pages/client/types.ts | 7 +- .../enrollment/hooks/useEnrollmentApi.tsx | 4 +- .../components/DesktopSetup/DesktopSetup.tsx | 29 +- src/shared/hooks/api/types.ts | 10 +- 142 files changed, 13784 insertions(+), 8140 deletions(-) delete mode 100644 src-tauri/.envrc create mode 100644 src-tauri/.sqlx/query-09eaf7503256da688c9eaeebb2b187d1b7d5692ce7e0ca467465e78f873e0901.json rename src-tauri/.sqlx/{query-31cce786a98f42f93bef6beb172aff153682182940f382d977a59ebf8cf7def0.json => query-149bfe6602e397dc79a956f33e2373a6a3b08c8d615b404f9917c5158d4857dd.json} (81%) rename src-tauri/.sqlx/{query-15653b6cff48d598efc8bf6b40ea414580a236b351ad7818ee75d7efe2833882.json => query-17a3b10441e63bde5b97c861747617eadddbc843e42545860afdd8ad6951b4ee.json} (58%) create mode 100644 src-tauri/.sqlx/query-2e752bd9e60b5ddd0c9eeeabb6cbb5148296157f00ef39610c18fc290da384bf.json rename src-tauri/.sqlx/{query-e40e496b783090e9b52fa793a74b009f77982f1198a187f54624c36fcada68fd.json => query-2fecdb6bd008790da557f2ad050d84ec7803dd0e9db5b7326a67b864d1f47410.json} (68%) create mode 100644 src-tauri/.sqlx/query-30181be5c9c6c5347de3d300ffba0732064face52dbebc0f5679af357c262a98.json delete mode 100644 src-tauri/.sqlx/query-3fe0268bce98cbce7cbf4ce8a4134948a042acdb8363f7735642da642420bfe6.json rename src-tauri/.sqlx/{query-a66970ffacbd60cf2f97d9fba3e747bd8567edde53ccbd90dc92cc925aa1a548.json => query-48cbbca02294eb342b4040b315c71301e06c48260f003893a27ed283f943551f.json} (55%) create mode 100644 src-tauri/.sqlx/query-49a4b21b78cc2096138907538e8b87fa1e942627ce93fbb97d61d8854e555880.json delete mode 100644 src-tauri/.sqlx/query-5305ab3080d10cbd6f4de24e5493072d183075951f3ebe6c17f27a5e92a3e4b6.json rename src-tauri/.sqlx/{query-ce950c602d6620d98bc4c3518e2520e028bc2609b39578f1ccd5bfa9df2240e8.json => query-5953a81f34f906e34aabec089dfe0cebf2afc3ad798638db9ea0aabcd506192b.json} (77%) delete mode 100644 src-tauri/.sqlx/query-5c28754680e92a81a74ced06551494c2471bf7180483796d1ff4419a5e9b488d.json delete mode 100644 src-tauri/.sqlx/query-68772513090d1bd3fbf58546971333d32a45eee6b9a70bb74713bee2f6283321.json rename src-tauri/.sqlx/{query-db268d84f76585abcbd482c6ff2eebbfd9e57e6e8b216cf55a206e9ef1a41c77.json => query-75dd44538a3c01b20f75f8ddb5dd91ba1687e05e1ca265965b8e0adcf42f21bc.json} (50%) rename src-tauri/.sqlx/{query-d364b350070c789f0d7e33fb1789dde7717aca865f082f24b500214814c4a3ef.json => query-76998bbd9e0096deb957c8e60df4b7f10eb86c8341e3cc0bc081e5c4dcbcee44.json} (53%) rename src-tauri/.sqlx/{query-8dfaa1c23af01a966442b52412eaa3a58f804f5d59d14fa70a65dba68c079b01.json => query-7b6cba2ce07597ff499b692055f18241f97d604243f387ca9f1a12264b79fb16.json} (75%) rename src-tauri/.sqlx/{query-827b70bc272ec1b731a6af60d77e65680370ff4b01600138ebdca569ee1b4248.json => query-7f83ec88f699dd2d15e40dfb023a60be3da33c4d1ca49e56b08154aa2ad7b8a0.json} (64%) rename src-tauri/.sqlx/{query-3ed7616493993dbd3e9f5c52da1524020d8de92ef857028f1099d8fc0b2b72c6.json => query-88160affcd4bcd0d74ac816b7a975996902572e5ca3d365235a86e3464215cc1.json} (53%) delete mode 100644 src-tauri/.sqlx/query-8b1ed48665635fa226cdcbe20a5d87614e9b7c018b83107d97e48ee2713808b8.json create mode 100644 src-tauri/.sqlx/query-913813b9d72042d77652eda92b953814e7930c5387f785ba2cdb0d08c43f4d11.json rename src-tauri/.sqlx/{query-2519ee530137aff4f6d567cfd0732227ab0ed2df1a05397890de3a55d62d27ab.json => query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json} (52%) create mode 100644 src-tauri/.sqlx/query-979d26af5b82c1a991402203707e2cc7673709453d011e627930d6c184966d36.json rename src-tauri/.sqlx/{query-294b2d391d5cf01a2e756ae357869b9fb274d4254b479816b3892c9593f76b13.json => query-98c6d082f2b635afa998eefa1624034d4babc9e3fd18236fd1c18e3c3abefd10.json} (82%) rename src-tauri/.sqlx/{query-ccb326ab9b3ebd336c0fd9aed0da8e991f091f17e25583bd251347c207d8ff5c.json => query-9d946237727089451a9bfc7ce2015d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a.json} (75%) create mode 100644 src-tauri/.sqlx/query-a78fe32403d40abac3af1127bba0150e028179c78faf340ae3cd2f60b6c7e772.json rename src-tauri/.sqlx/{query-999106a981d0e33990bb03479da7d594750c967d6d30c3da7ce0e56fb089ea06.json => query-a9ca7a4f46ce92ab02a213479797b24e04caad767c088dd490dc38663494c22d.json} (73%) rename src-tauri/.sqlx/{query-288899ef3160db5fba8a2e91a2580803a080daea4ab09cc67e7a492a5b3b2d3d.json => query-abded0999cc848a4baaad2e57a3247e9d7c7062bc43c84d3405a19c94006b8f8.json} (70%) rename src-tauri/.sqlx/{query-368814ed137d486c51e412c386ccd82ebaa96f1d438388521b4761da5bb93ce4.json => query-afab9e8172fcd2187e99f7222eb1394fbc68b54cf5ebf36764becbc42c89ad21.json} (75%) create mode 100644 src-tauri/.sqlx/query-b130d533efa93e32e6c8288a19c001d5554b4a33fd0d48dbd2d3303aecb4fca2.json create mode 100644 src-tauri/.sqlx/query-b994873e3036f8f7152d790b47b32e5422db84d0d110f2068419131947f07db3.json create mode 100644 src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json create mode 100644 src-tauri/.sqlx/query-be25a82798d12394363f3379f2b966d29003dd126f4ac0f8c5236d00891b31c5.json rename src-tauri/.sqlx/{query-99e819c9e4d77ea568cb60f07e49ca8c407ab7b15ac505968c66924df3563ff8.json => query-c688e91a89197793b2a63dcefc41c652fc89286481300450763a7a9b66d146f9.json} (53%) create mode 100644 src-tauri/.sqlx/query-db3aa093e5e74398f5b921ddb6e833962b82c95d4b98993264cb55f9e96c81c0.json rename src-tauri/.sqlx/{query-d5b66ca8ce77e041dacbd21493608350c2337834690cef9f89ef1906f31fd4c4.json => query-db41fbabf52faec38ccb768a01a56df117d179fb4e52dfb9d5ff5be9b41518d8.json} (54%) rename src-tauri/.sqlx/{query-501754dcc5d012c155b1881f8f623ea7028fc6c0b4184d81a922c11d73779dd9.json => query-deaba004e57c25d7d8cace0455a0cae78c3c8f3395a7e594aa696c4f63e55d5b.json} (64%) rename src-tauri/.sqlx/{query-ba6d72e4ed26ebce7f1c1aa8147d81a7011ca163d2511fdebf95d8cb79c17d7a.json => query-e034dbe839ed5cd19a8430ac5786e68ace8457b4983724957092db618b2535d4.json} (66%) rename src-tauri/.sqlx/{query-44a0d1740d6a566f55faf25f4839aaf3d6dd41baa587381c50b0387e1a707938.json => query-e143c6df30e53bdc954cc14636ed5b0afed84e572ef3e514212fa1b4cf8ccff2.json} (51%) rename src-tauri/.sqlx/{query-19c18356163baa6db88272f09d83768b2658406575d325fb273f152fe15465c4.json => query-e584f3f1c8cfa7c840907612b632b6d3641667119ee0f817cc510f12ee9643bd.json} (67%) rename src-tauri/.sqlx/{query-5476f3c222bfd9a65ec67af7f7224f0ca29a6ed2a9c328b2232c9cd90f0b3c04.json => query-e84763c1777a1e43655b1faba5c42c98246ccc4b567f869140d859b3e196f46e.json} (64%) delete mode 100644 src-tauri/.sqlx/query-ea81679acb33913c851077e7a2681479f26da26e445a636d7cf6690a9d7a720f.json delete mode 100644 src-tauri/.sqlx/query-f0851883988e5cdf219b90562f2014713157173b1c8e9f3f3ad81c10ff674744.json rename src-tauri/.sqlx/{query-25e253a71c188be173e3dce3c640e3028e88be06d10c112e4b4a16b1599f8657.json => query-f76a3953576d685d4057541b04aabfafdb61c86b0e9486ff0561a7bd80fd6ba8.json} (82%) create mode 100644 src-tauri/migrations/20240717141723_add_selected_view_column.sql create mode 100644 src-tauri/migrations/20240828072527_add_polling_token.sql create mode 100644 src-tauri/migrations/20240909092543_add_disable_route_all_traffic.sql create mode 100644 src-tauri/migrations/20240912084922_add_enterprise_enabled_flag.sql create mode 100644 src-tauri/src/database/models/location_stats.rs create mode 100644 src-tauri/src/enterprise/mod.rs create mode 100644 src-tauri/src/enterprise/models/instance.rs create mode 100644 src-tauri/src/enterprise/models/mod.rs create mode 100644 src-tauri/src/enterprise/periodic/config.rs create mode 100644 src-tauri/src/enterprise/periodic/mod.rs create mode 100644 src-tauri/src/events.rs create mode 100644 src-tauri/src/log_watcher/global_log_watcher.rs create mode 100644 src-tauri/src/log_watcher/mod.rs rename src-tauri/src/{service/log_watcher.rs => log_watcher/service_log_watcher.rs} (54%) create mode 100644 src-tauri/src/periodic/mod.rs rename src-tauri/src/{latest_app_version.rs => periodic/version.rs} (65%) create mode 100644 src-tauri/src/service/windows.rs delete mode 100644 src-tauri/src/service/windows_service.rs create mode 100644 src/pages/client/pages/ClientSettingsPage/components/GlobalLogs/GlobalLogs.tsx create mode 100644 src/pages/client/pages/ClientSettingsPage/components/GlobalLogs/GlobalLogsSelect.tsx create mode 100644 src/pages/client/pages/ClientSettingsPage/components/GlobalLogs/GlobalLogsSourceSelect.tsx create mode 100644 src/pages/client/pages/ClientSettingsPage/components/GlobalLogs/style.scss diff --git a/.editorconfig b/.editorconfig index e24ee12f..2c502401 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,3 +26,8 @@ rulers = 90 indent_style = space indent_size = 2 rulers = 80 + +[*.{rs}] +indent_style = space +indent_size = 4 +rulers = 90 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 63767beb..e7b25f34 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,17 +7,17 @@ #### Documentation ### -- [ ] If testing requires changes in the environment or deployment, please **update the documentation** (https://defguard.gitbook.io) first and **attach the link to the documentation** section in this pull request +- [ ] If testing requires changes in the environment or deployment, please **update the documentation** (https://docs.defguard.net) first and **attach the link to the documentation** section in this pull request - [ ] I have commented on my code, particularly in hard-to-understand areas -#### Testing ### +#### Testing ### - [ ] I have performed manual tests manually and all changes work - [ ] New and existing unit tests pass locally with my changes ### 🏚️ Main Branch Merge Checklist: -#### Testing ### +#### Testing ### - [ ] I have merged my changes before to dev and the dev checklist is done - [ ] I have tested all functionalities on the dev instance and they work diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 9fe337fd..3ad66f3d 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -5,7 +5,6 @@ on: branches: - main - dev - pull_request: branches: - main @@ -19,13 +18,13 @@ jobs: - uses: actions/checkout@v4 with: submodules: 'recursive' - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20' - uses: pnpm/action-setup@v2 with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory diff --git a/.gitignore b/.gitignore index b611ef10..e9159129 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,7 @@ dist-ssr *.njsproj *.sln *.sw? + +*.db +*.db-shm +*.db-wal diff --git a/README.md b/README.md index 449ac3d9..3d94ae36 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Desktop client for managing WireGuard VPN connections (any WireGuard server and - Multiple instances & locations - When combining with [defguard](https://github.com/DefGuard/defguard) VPN & SSO you can have multiple defguard instances (sites/installations) and multiple Locations (VPN tunnels in that location/site) in one client! If you are an admin/devops - all your customers (instances) and all their tunnels (locations) can be in one place! - Fast! - Built with Rust, [tauri](https://tauri.app/) and [React.js](https://react.dev/). -To learn more about the system see our [documentation](https://defguard.gitbook.io). +To learn more about the system see our [documentation](https://docs.defguard.net). ## Development @@ -26,9 +26,11 @@ To learn more about the system see our [documentation](https://defguard.gitbook. Make sure to install prerequisites from [tauri](https://tauri.app/v1/guides/getting-started/prerequisites/). ### Proto submodule + Make sure you have cloned, and up to date, proto submodule in `src-tauri/proto` ### Protoc compiler + Make sure you have [protoc](https://grpc.io/docs/protoc-installation/) available. ### Install pnpm and node deps @@ -37,6 +39,21 @@ Make sure you have [protoc](https://grpc.io/docs/protoc-installation/) available pnpm install ``` +### Sqlx and local database file + +To work with sqlx on a local db file, you'll have to set `DATABASE_URL` env variable. +It's best to set it to absolute path since `pnpm tauri dev` runs with weird paths. + +Init the file with: + +```bash +export DATABASE_URL=sqlite:///dev.db` +sqlx db create +sqlx migrate run --source src-tauri/migrations/ +``` + +Then keep the `$DATABASE_URL` set during development (use direnv etc.) + ### Dev server command ```bash @@ -44,9 +61,11 @@ pnpm tauri dev ``` ### Build command + ```bash pnpm tauri build ``` + Built packages are available after in `src-tauri/target/release/bundle`. ### Windows @@ -60,6 +79,7 @@ Remove `default-run` line from `[package]` section in `Cargo.toml` to build the

# Legal + WireGuard® is [registered trademarks](https://www.wireguard.com/trademark-policy/) of Jason A. Donenfeld. # Known issues @@ -80,3 +100,23 @@ The app launches but the window is blank. Set the `WEBKIT_DISABLE_DMABUF_RENDERE ``` WEBKIT_DISABLE_DMABUF_RENDERER=1 defguard-client ``` + +## Failed to run `pnpm tauri dev` + +`pnpm tauri dev` command may result in the following error: + +``` +Error [ERR_REQUIRE_ESM]: require() of ES Module /home/jck/workspace/work/teonite/defguard/client/node_modules/.pnpm/path-type@5.0.0/node_modules/path-type/index.js from /home/jck/workspace/work/teonite/defguard/client/node_modules/.pnpm/read-pkg@3.0.0/node_modules/read-pkg/index.js not supported. +Instead change the require of /home/jck/workspace/work/teonite/defguard/client/node_modules/.pnpm/path-type@5.0.0/node_modules/path-type/index.js in /home/jck/workspace/work/teonite/defguard/client/node_modules/.pnpm/read-pkg@3.0.0/node_modules/read-pkg/index.js to a dynamic import() which is available in all CommonJS modules. + at TracingChannel.traceSync (node:diagnostics_channel:315:14) + at Object. (/home/jck/workspace/work/teonite/defguard/client/node_modules/.pnpm/read-pkg@3.0.0/node_modules/read-pkg/index.js:4:18) { + code: 'ERR_REQUIRE_ESM' +} + +Node.js v22.7.0 + ELIFECYCLE  Command failed with exit code 1. + Error The "beforeDevCommand" terminated with a non-zero status code. + ELIFECYCLE  Command failed with exit code 1. +``` + +To fix this remove node_modules and rerun `pnpm install`. diff --git a/package.json b/package.json index 044f1969..74691f00 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "defguard-client", "private": false, - "version": "0.4.1", + "version": "1.0.0", "type": "module", "scripts": { "dev": "npm-run-all --parallel vite typesafe-i18n", @@ -42,17 +42,17 @@ "dependencies": { "@floating-ui/react": "^0.26.3", "@hookform/resolvers": "^3.3.2", - "@ladle/react": "^3.3.1", + "@ladle/react": "^4.1.1", "@stablelib/base64": "^1.0.1", "@stablelib/x25519": "^1.0.3", "@tanstack/query-core": "^5.12.1", "@tanstack/react-virtual": "3.0.0-beta.54", - "@tauri-apps/api": "^1.5.1", + "@tauri-apps/api": "^1.6.0", "@types/byte-size": "^8.1.2", "byte-size": "^8.1.1", "classnames": "^2.3.2", "compare-versions": "^6.1.0", - "dayjs": "^1.11.10", + "dayjs": "^1.11.13", "detect-browser": "^5.3.0", "fast-deep-equal": "^3.1.3", "file-saver": "^2.0.5", @@ -70,9 +70,9 @@ "react-hook-form": "^7.48.2", "react-loading-skeleton": "^3.3.1", "react-markdown": "^9.0.1", - "react-qr-code": "^2.0.12", + "react-qr-code": "^2.0.15", "react-router-dom": "^6.20.1", - "react-virtualized-auto-sizer": "^1.0.20", + "react-virtualized-auto-sizer": "^1.0.24", "recharts": "^2.10.3", "rehype-sanitize": "^6.0.0", "rxjs": "^7.8.1", @@ -87,7 +87,7 @@ "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.12.2", "@tanstack/react-query-devtools": "^5.12.2", - "@tauri-apps/cli": "^1.5.7", + "@tauri-apps/cli": "^1.6.2", "@types/file-saver": "^2.0.7", "@types/lodash-es": "^4.17.12", "@types/node": "^20.10.3", @@ -97,7 +97,7 @@ "@typescript-eslint/parser": "^6.13.1", "@vitejs/plugin-react": "^4.2.0", "@vitejs/plugin-react-swc": "^3.5.0", - "autoprefixer": "^10.4.16", + "autoprefixer": "^10.4.20", "eslint": "^8.55.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.0", @@ -113,7 +113,7 @@ "typesafe-i18n": "^5.26.2", "typescript": "^5.3.2", "typescript-eslint-language-service": "^5.0.5", - "vite": "^4.5.1" + "vite": "^4.5.3" }, "volta": { "node": "20.5.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12b14990..14b23ea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,257 +1,4326 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@floating-ui/react': - specifier: ^0.26.3 - version: 0.26.3(react-dom@18.2.0)(react@18.2.0) - '@hookform/resolvers': - specifier: ^3.3.2 - version: 3.3.2(react-hook-form@7.48.2) - '@ladle/react': - specifier: ^3.3.1 - version: 3.3.1(@types/node@20.10.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5)(typescript@5.3.2) - '@stablelib/base64': - specifier: ^1.0.1 - version: 1.0.1 - '@stablelib/x25519': - specifier: ^1.0.3 - version: 1.0.3 - '@tanstack/query-core': - specifier: ^5.12.1 - version: 5.12.1 - '@tanstack/react-virtual': - specifier: 3.0.0-beta.54 - version: 3.0.0-beta.54(react@18.2.0) - '@tauri-apps/api': - specifier: ^1.5.1 - version: 1.5.1 - '@types/byte-size': - specifier: ^8.1.2 - version: 8.1.2 - byte-size: - specifier: ^8.1.1 - version: 8.1.1 - classnames: - specifier: ^2.3.2 - version: 2.3.2 - compare-versions: - specifier: ^6.1.0 - version: 6.1.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - detect-browser: - specifier: ^5.3.0 - version: 5.3.0 - fast-deep-equal: - specifier: ^3.1.3 - version: 3.1.3 - file-saver: - specifier: ^2.0.5 - version: 2.0.5 - framer-motion: - specifier: ^10.16.12 - version: 10.16.12(react-dom@18.2.0)(react@18.2.0) - html-react-parser: - specifier: ^5.0.7 - version: 5.0.7(react@18.2.0) - itertools: - specifier: ^2.1.2 - version: 2.1.2 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 - p-timeout: - specifier: ^6.1.2 - version: 6.1.2 - prop-types: - specifier: ^15.8.1 - version: 15.8.1 - radash: - specifier: ^11.0.0 - version: 11.0.0 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-auth-code-input: - specifier: ^3.2.1 - version: 3.2.1(react@18.2.0) - react-click-away-listener: - specifier: ^2.2.3 - version: 2.2.3(react-dom@18.2.0)(react@18.2.0) - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: ^7.48.2 - version: 7.48.2(react@18.2.0) - react-loading-skeleton: - specifier: ^3.3.1 - version: 3.3.1(react@18.2.0) - react-markdown: - specifier: ^9.0.1 - version: 9.0.1(@types/react@18.2.41)(react@18.2.0) - react-qr-code: - specifier: ^2.0.12 - version: 2.0.12(react@18.2.0) - react-router-dom: - specifier: ^6.20.1 - version: 6.20.1(react-dom@18.2.0)(react@18.2.0) - react-virtualized-auto-sizer: - specifier: ^1.0.20 - version: 1.0.20(react-dom@18.2.0)(react@18.2.0) - recharts: - specifier: ^2.10.3 - version: 2.10.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) - rehype-sanitize: - specifier: ^6.0.0 - version: 6.0.0 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - tauri-plugin-log-api: - specifier: github:tauri-apps/tauri-plugin-log - version: github.com/tauri-apps/tauri-plugin-log/a428c4c4833027865898ef0f284a69b1978fcd94 - tauri-plugin-window-state-api: - specifier: github:tauri-apps/tauri-plugin-window-state#v1 - version: github.com/tauri-apps/tauri-plugin-window-state/002cf15f6a1e4969a678a4ade680cd60477a8a53 - use-breakpoint: - specifier: ^4.0.1 - version: 4.0.1(react-dom@18.2.0)(react@18.2.0) - zod: - specifier: ^3.22.4 - version: 3.22.4 - zustand: - specifier: ^4.4.7 - version: 4.4.7(@types/react@18.2.41)(react@18.2.0) - -devDependencies: - '@hookform/devtools': - specifier: ^4.3.1 - version: 4.3.1(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0) - '@svgr/cli': - specifier: ^8.1.0 - version: 8.1.0(typescript@5.3.2) - '@tanstack/react-query': - specifier: ^5.12.2 - version: 5.12.2(react@18.2.0) - '@tanstack/react-query-devtools': - specifier: ^5.12.2 - version: 5.12.2(@tanstack/react-query@5.12.2)(react@18.2.0) - '@tauri-apps/cli': - specifier: ^1.5.7 - version: 1.5.7 - '@types/file-saver': - specifier: ^2.0.7 - version: 2.0.7 - '@types/lodash-es': - specifier: ^4.17.12 - version: 4.17.12 - '@types/node': - specifier: ^20.10.3 - version: 20.10.3 - '@types/react': - specifier: ^18.2.41 - version: 18.2.41 - '@types/react-dom': - specifier: ^18.2.17 - version: 18.2.17 - '@typescript-eslint/eslint-plugin': - specifier: ^6.13.1 - version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/parser': - specifier: ^6.13.1 - version: 6.13.1(eslint@8.55.0)(typescript@5.3.2) - '@vitejs/plugin-react': - specifier: ^4.2.0 - version: 4.2.0(vite@4.5.1) - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.5.0(vite@4.5.1) - autoprefixer: - specifier: ^10.4.16 - version: 10.4.16(postcss@8.4.32) - eslint: - specifier: ^8.55.0 - version: 8.55.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.55.0) - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.13.1)(eslint@8.55.0) - eslint-plugin-prettier: - specifier: ^5.0.1 - version: 5.0.1(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.1.0) - eslint-plugin-react: - specifier: ^7.33.2 - version: 7.33.2(eslint@8.55.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.55.0) - eslint-plugin-react-refresh: - specifier: ^0.4.5 - version: 0.4.5(eslint@8.55.0) - eslint-plugin-simple-import-sort: - specifier: ^10.0.0 - version: 10.0.0(eslint@8.55.0) - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - postcss: - specifier: ^8.4.32 - version: 8.4.32 - sass: - specifier: ^1.69.5 - version: 1.69.5 - typedoc: - specifier: ^0.25.4 - version: 0.25.4(typescript@5.3.2) - typesafe-i18n: - specifier: ^5.26.2 - version: 5.26.2(typescript@5.3.2) - typescript: - specifier: ^5.3.2 - version: 5.3.2 - typescript-eslint-language-service: - specifier: ^5.0.5 - version: 5.0.5(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2) - vite: - specifier: ^4.5.1 - version: 4.5.1(@types/node@20.10.3)(sass@1.69.5) +importers: + + .: + dependencies: + '@floating-ui/react': + specifier: ^0.26.3 + version: 0.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@hookform/resolvers': + specifier: ^3.3.2 + version: 3.3.2(react-hook-form@7.48.2(react@18.2.0)) + '@ladle/react': + specifier: ^4.1.1 + version: 4.1.1(@types/node@20.10.3)(@types/react@18.2.41)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.69.5)(typescript@5.3.2) + '@stablelib/base64': + specifier: ^1.0.1 + version: 1.0.1 + '@stablelib/x25519': + specifier: ^1.0.3 + version: 1.0.3 + '@tanstack/query-core': + specifier: ^5.12.1 + version: 5.12.1 + '@tanstack/react-virtual': + specifier: 3.0.0-beta.54 + version: 3.0.0-beta.54(react@18.2.0) + '@tauri-apps/api': + specifier: ^1.6.0 + version: 1.6.0 + '@types/byte-size': + specifier: ^8.1.2 + version: 8.1.2 + byte-size: + specifier: ^8.1.1 + version: 8.1.1 + classnames: + specifier: ^2.3.2 + version: 2.3.2 + compare-versions: + specifier: ^6.1.0 + version: 6.1.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + detect-browser: + specifier: ^5.3.0 + version: 5.3.0 + fast-deep-equal: + specifier: ^3.1.3 + version: 3.1.3 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + framer-motion: + specifier: ^10.16.12 + version: 10.16.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + html-react-parser: + specifier: ^5.0.7 + version: 5.0.7(react@18.2.0) + itertools: + specifier: ^2.1.2 + version: 2.1.2 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + p-timeout: + specifier: ^6.1.2 + version: 6.1.2 + prop-types: + specifier: ^15.8.1 + version: 15.8.1 + radash: + specifier: ^11.0.0 + version: 11.0.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-auth-code-input: + specifier: ^3.2.1 + version: 3.2.1(react@18.2.0) + react-click-away-listener: + specifier: ^2.2.3 + version: 2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-hook-form: + specifier: ^7.48.2 + version: 7.48.2(react@18.2.0) + react-loading-skeleton: + specifier: ^3.3.1 + version: 3.3.1(react@18.2.0) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.2.41)(react@18.2.0) + react-qr-code: + specifier: ^2.0.15 + version: 2.0.15(react@18.2.0) + react-router-dom: + specifier: ^6.20.1 + version: 6.20.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-virtualized-auto-sizer: + specifier: ^1.0.24 + version: 1.0.24(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + recharts: + specifier: ^2.10.3 + version: 2.10.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rehype-sanitize: + specifier: ^6.0.0 + version: 6.0.0 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + tauri-plugin-log-api: + specifier: github:tauri-apps/tauri-plugin-log + version: https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/a428c4c4833027865898ef0f284a69b1978fcd94 + tauri-plugin-window-state-api: + specifier: github:tauri-apps/tauri-plugin-window-state#v1 + version: https://codeload.github.com/tauri-apps/tauri-plugin-window-state/tar.gz/002cf15f6a1e4969a678a4ade680cd60477a8a53 + use-breakpoint: + specifier: ^4.0.1 + version: 4.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + zod: + specifier: ^3.22.4 + version: 3.22.4 + zustand: + specifier: ^4.4.7 + version: 4.4.7(@types/react@18.2.41)(react@18.2.0) + devDependencies: + '@hookform/devtools': + specifier: ^4.3.1 + version: 4.3.1(@types/react@18.2.41)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@svgr/cli': + specifier: ^8.1.0 + version: 8.1.0(typescript@5.3.2) + '@tanstack/react-query': + specifier: ^5.12.2 + version: 5.12.2(react@18.2.0) + '@tanstack/react-query-devtools': + specifier: ^5.12.2 + version: 5.12.2(@tanstack/react-query@5.12.2(react@18.2.0))(react@18.2.0) + '@tauri-apps/cli': + specifier: ^1.6.2 + version: 1.6.2 + '@types/file-saver': + specifier: ^2.0.7 + version: 2.0.7 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/node': + specifier: ^20.10.3 + version: 20.10.3 + '@types/react': + specifier: ^18.2.41 + version: 18.2.41 + '@types/react-dom': + specifier: ^18.2.17 + version: 18.2.17 + '@typescript-eslint/eslint-plugin': + specifier: ^6.13.1 + version: 6.13.1(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2) + '@typescript-eslint/parser': + specifier: ^6.13.1 + version: 6.13.1(eslint@8.55.0)(typescript@5.3.2) + '@vitejs/plugin-react': + specifier: ^4.2.0 + version: 4.2.0(vite@4.5.3(@types/node@20.10.3)(sass@1.69.5)) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.5.0(vite@4.5.3(@types/node@20.10.3)(sass@1.69.5)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.32) + eslint: + specifier: ^8.55.0 + version: 8.55.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.55.0) + eslint-plugin-import: + specifier: ^2.29.0 + version: 2.29.0(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0) + eslint-plugin-prettier: + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.1.0) + eslint-plugin-react: + specifier: ^7.33.2 + version: 7.33.2(eslint@8.55.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.55.0) + eslint-plugin-react-refresh: + specifier: ^0.4.5 + version: 0.4.5(eslint@8.55.0) + eslint-plugin-simple-import-sort: + specifier: ^10.0.0 + version: 10.0.0(eslint@8.55.0) + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + postcss: + specifier: ^8.4.32 + version: 8.4.32 + sass: + specifier: ^1.69.5 + version: 1.69.5 + typedoc: + specifier: ^0.25.4 + version: 0.25.4(typescript@5.3.2) + typesafe-i18n: + specifier: ^5.26.2 + version: 5.26.2(typescript@5.3.2) + typescript: + specifier: ^5.3.2 + version: 5.3.2 + typescript-eslint-language-service: + specifier: ^5.0.5 + version: 5.0.5(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2) + vite: + specifier: ^4.5.3 + version: 4.5.3(@types/node@20.10.3)(sass@1.69.5) + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.5': + resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.5': + resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.22.15': + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.5': + resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.5': + resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.23.3': + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.23.3': + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.23.5': + resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.5': + resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.5': + resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bundled-es-modules/cookie@2.0.0': + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/is-prop-valid@1.2.1': + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.1': + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.2': + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.0': + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.55.0': + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.5.1': + resolution: {integrity: sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw==} + + '@floating-ui/dom@1.5.3': + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + + '@floating-ui/react-dom@2.0.4': + resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.3': + resolution: {integrity: sha512-iKH8WRR0L/nLiM6qavFZxkyegIZRMxGnM9aKEc71M4wRlUNkgTamjPsOQXy11oZbDOH37MiTbk/nAPn9M2+shA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.1.6': + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + + '@hookform/devtools@4.3.1': + resolution: {integrity: sha512-CrWxEoHQZaOXJZVQ8KBgOuAa8p2LI8M0DAN5GTRTmdCieRwFVjVDEmuTAVazWVRRkpEQSgSt3KYp7VmmqXdEnw==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + + '@hookform/resolvers@3.3.2': + resolution: {integrity: sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + '@inquirer/confirm@3.1.22': + resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==} + engines: {node: '>=18'} + + '@inquirer/core@9.0.10': + resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.2': + resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.20': + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@ladle/react-context@1.0.1': + resolution: {integrity: sha512-xVQ8siyOEQG6e4Knibes1uA3PTyXnqiMmfSmd5pIbkzeDty8NCBtYHhTXSlfmcDNEsw/G8OzNWo4VbyQAVDl2A==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + + '@ladle/react@4.1.1': + resolution: {integrity: sha512-WSH+abvPwXMgy1PquYBcgmuV8R1WeZhaLKIfoPm4YgfmD3tgsA9MOwa+SFNkIrIHI71Q6J41sguObToof13WfQ==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@mdx-js/mdx@3.0.1': + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + + '@mdx-js/react@3.0.1': + resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mswjs/interceptors@0.29.1': + resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} + engines: {node: '>=18'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@remix-run/router@1.13.1': + resolution: {integrity: sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==} + engines: {node: '>=14.0.0'} + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/cli@8.1.0': + resolution: {integrity: sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==} + engines: {node: '>=14'} + hasBin: true + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-prettier@8.1.0': + resolution: {integrity: sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@swc/core-darwin-arm64@1.3.100': + resolution: {integrity: sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-arm64@1.7.11': + resolution: {integrity: sha512-HRQv4qIeMBPThZ6Y/4yYW52rGsS6yrpusvuxLGyoFo45Y0y12/V2yXkOIA/0HIQyrqoUAxn1k4zQXpPaPNCmnw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.3.100': + resolution: {integrity: sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.11': + resolution: {integrity: sha512-vtMQj0F3oYwDu5yhO7SKDRg1XekRSi6/TbzHAbBXv+dBhlGGvcZZynT1H90EVFTv+7w7Sh+lOFvRv5Z4ZTcxow==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.11': + resolution: {integrity: sha512-mHtzWKxhtyreI4CSxs+3+ENv8t/Qo35WFoYG66qHEgJz/Z2Lh6jv1E+MYgHdYwnpQHgHbdvAco7HsBu/Dt6xXw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.3.100': + resolution: {integrity: sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-FRwe/x0GfXSQjGP2lIk+NO0pUFS/lI/RorCLBPiK808EVE9JTbh9DKCc/4Bbb4jgScAjNkrFCUVObQYl3YKmpA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.3.100': + resolution: {integrity: sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-GY/rs0+GUq14Gbnza90KOrQd/9yHd5qQMii5jcSWcUCT5A8QTa8kiicsM2NxZeTJ69xlKmT7sLod5l99lki/2A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.3.100': + resolution: {integrity: sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-QDkGRwSPmp2RBOlSs503IUXlWYlny8DyznTT0QuK0ML2RpDFlXWU94K/EZhS0RBEUkMY/W51OacM8P8aS/dkCg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.3.100': + resolution: {integrity: sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-SBEfKrXy6zQ6ksnyxw1FaCftrIH4fLfA81xNnKb7x/6iblv7Ko6H0aK3P5C86jyqF/82+ONl9C7ImGkUFQADig==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.3.100': + resolution: {integrity: sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-a2Y4xxEsLLYHJN7sMnw9+YQJDi3M1BxEr9hklfopPuGGnYLFNnx5CypH1l9ReijEfWjIAHNi7pq3m023lzW1Hg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.3.100': + resolution: {integrity: sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-ZbZFMwZO+j8ulhegJ7EhJ/QVZPoQ5qc30ylJQSxizizTJaen71Q7/13lXWc6ksuCKvg6dUKrp/TPgoxOOtSrFA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.3.100': + resolution: {integrity: sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-IUohZedSJyDu/ReEBG/mqX6uG29uA7zZ9z6dIAF+p6eFxjXmh9MuHryyM+H8ebUyoq/Ad3rL+rUCksnuYNnI0w==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.3.100': + resolution: {integrity: sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/core@1.7.11': + resolution: {integrity: sha512-AB+qc45UrJrDfbhPKcUXk+9z/NmFfYYwJT6G7/iur0fCse9kXjx45gi40+u/O2zgarG/30/zV6E3ps8fUvjh7g==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.2': + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@swc/types@0.1.5': + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + + '@tanstack/query-core@5.12.1': + resolution: {integrity: sha512-WbZztNmKq0t6QjdNmHzezbi/uifYo9j6e2GLJkodsYaYUlzMbAp91RDyeHkIZrm7EfO4wa6Sm5sxJZm5SPlh6w==} + + '@tanstack/query-devtools@5.12.1': + resolution: {integrity: sha512-AUWLgdZEYq/ckMZrtKpofOwqxuFiEIdy3gZOh/ouIBVra9ijXVTxYt5cZFSjXJT4q/o0DMii6xMZuIJx2qXZ6g==} + + '@tanstack/react-query-devtools@5.12.2': + resolution: {integrity: sha512-EpjYxwUBj+CuzAiB++FMeHzNey4TynuudfWVMsZg0uzLrnR5I0j1CWHJkNsTutb/Db9TNG1Ae66n8ywVvPd1gQ==} + peerDependencies: + '@tanstack/react-query': ^5.12.2 + react: ^18.0.0 + + '@tanstack/react-query@5.12.2': + resolution: {integrity: sha512-BeWZu8zVFH20oRc+S/K9ADPgWjEzP/XQCGBNz5IbApUwPQAdwkQYbXODVL5AyAlWiSxhx+P2xlARPBApj2Yrog==} + peerDependencies: + react: ^18.0.0 + + '@tanstack/react-virtual@3.0.0-beta.54': + resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/virtual-core@3.0.0-beta.54': + resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} + + '@tauri-apps/api@1.5.1': + resolution: {integrity: sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + + '@tauri-apps/api@1.5.3': + resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + + '@tauri-apps/api@1.6.0': + resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + + '@tauri-apps/cli-darwin-arm64@1.6.2': + resolution: {integrity: sha512-6mdRyf9DaLqlZvj8kZB09U3rwY+dOHSGzTZ7+GDg665GJb17f4cb30e8dExj6/aghcsOie9EGpgiURcDUvLNSQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tauri-apps/cli-darwin-x64@1.6.2': + resolution: {integrity: sha512-PLxZY5dn38H3R9VRmBN/l0ZDB5JFanCwlK4rmpzDQPPg3tQmbu5vjSCP6TVj5U6aLKsj79kFyULblPr5Dn9+vw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': + resolution: {integrity: sha512-xnpj4BLeeGOh5I/ewCQlYJZwHH0CBNBN+4q8BNWNQ9MKkjN9ST366RmHRzl2ANNgWwijOPxyce7GiUmvuH8Atw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tauri-apps/cli-linux-arm64-gnu@1.6.2': + resolution: {integrity: sha512-uaiRE0vE2P+tdsCngfKt+7yKr3VZXIq/t3w01DzSdnBgHSp0zmRsRR4AhZt7ibvoEgA8GzBP+eSHJdFNZsTU9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-arm64-musl@1.6.2': + resolution: {integrity: sha512-o9JunVrMrhqTBLrdvEbS64W0bo1dPm0lxX51Mx+6x9SmbDjlEWGgaAHC3iKLK9khd5Yu1uO1e+8TJltAcScvmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-x64-gnu@1.6.2': + resolution: {integrity: sha512-jL9f+o61DdQmNYKIt2Q3BA8YJ+hyC5+GdNxqDf7j5SoQ85j//YfUWbmp9ZgsPHVBxgSGZVvgGMNvf64Ykp0buQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-linux-x64-musl@1.6.2': + resolution: {integrity: sha512-xsa4Pu9YMHKAX0J8pIoXfN/uhvAAAoECZDixDhWw8zi57VZ4QX28ycqolS+NscdD9NAGSgHk45MpBZWdvRtvjQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-win32-arm64-msvc@1.6.2': + resolution: {integrity: sha512-eJtUOx2UFhJpCCkm5M5+4Co9JbjvgIHTdyS/hTSZfOEdT58CNEGVJXMA39FsSZXYoxYPE+9K7Km6haMozSmlxw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tauri-apps/cli-win32-ia32-msvc@1.6.2': + resolution: {integrity: sha512-9Jwx3PrhNw3VKOgPISRRXPkvoEAZP+7rFRHXIo49dvlHy2E/o9qpWi1IntE33HWeazP6KhvsCjvXB2Ai4eGooA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@tauri-apps/cli-win32-x64-msvc@1.6.2': + resolution: {integrity: sha512-5Z+ZjRFJE8MXghJe1UXvGephY5ZcgVhiTI9yuMi9xgX3CEaAXASatyXllzsvGJ9EDaWMEpa0PHjAzi7LBAWROw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tauri-apps/cli@1.6.2': + resolution: {integrity: sha512-zpfZdxhm20s7d/Uejpg/T3a9sqLVe3Ih2ztINfy8v6iLw9Ohowkb9g+agZffYKlEWfOSpmCy69NFyBLj7OZL0A==} + engines: {node: '>= 10'} + hasBin: true + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.7': + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.4': + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + + '@types/byte-size@8.1.2': + resolution: {integrity: sha512-jGyVzYu6avI8yuqQCNTZd65tzI8HZrLjKX9sdMqZrGWVlNChu0rf6p368oVEDCYJe5BMx2Ov04tD1wqtgTwGSA==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.0.2': + resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.3': + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/file-saver@2.0.7': + resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + + '@types/hast@3.0.3': + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.14.202': + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdx@2.0.10': + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node@20.10.3': + resolution: {integrity: sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==} + + '@types/node@22.3.0': + resolution: {integrity: sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prismjs@1.26.3': + resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} + + '@types/prop-types@15.7.11': + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + '@types/react-dom@18.2.17': + resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + + '@types/react@18.2.41': + resolution: {integrity: sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/semver@7.5.6': + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@typescript-eslint/eslint-plugin@6.13.1': + resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.13.1': + resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.13.1': + resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.13.1': + resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.13.1': + resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.13.1': + resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.13.1': + resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.13.1': + resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react-swc@3.5.0': + resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} + peerDependencies: + vite: ^4 || ^5 + + '@vitejs/plugin-react-swc@3.7.0': + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} + peerDependencies: + vite: ^4 || ^5 + + '@vitejs/plugin-react@4.2.0': + resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + axe-core@4.10.0: + resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + engines: {node: '>=4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + byte-size@8.1.1: + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-lite@1.0.30001658: + resolution: {integrity: sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compare-versions@6.1.0: + resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-parser@3.0.2: + resolution: {integrity: sha512-eA5pvYwgtffuxQlDk0gJRApDUKgfwlsQBMAH6uawKuuilTLfxKIOtzyV63Y3IC0LWnDCeTJ/I1qYmlfYvvMzDg==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + dashify@2.0.0: + resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==} + engines: {node: '>=4'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.601: + resolution: {integrity: sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==} + + electron-to-chromium@1.5.9: + resolution: {integrity: sha512-HfkT8ndXR0SEkU8gBQQM3rz035bpE/hxkZ1YIt4KJPEFES68HfIU6LzKukH0H794Lm83WJtkSAMfEToxCs15VA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + + es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.0: + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-prettier@5.0.1: + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.5: + resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-simple-import-sort@10.0.0: + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} + peerDependencies: + eslint: '>=5.0.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@10.16.12: + resolution: {integrity: sha512-w7Yzx0OzQ5Uh6uNkxaX+4TuAPuOKz3haSbjmHpdrqDpGuCJCpq6YP9Dy7JJWdZ6mJjndrg3Ao3vUwDajKNikCA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + hast-util-classnames@3.0.0: + resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + + hast-util-sanitize@5.0.1: + resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} + + hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + + history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-dom-parser@5.0.4: + resolution: {integrity: sha512-azy8THLKd4Ar0OVJpEgX+MSjYvKdNDWlGiRBIlovMqEQYMAnLLXBhhiSwjylDD3RDdcCYT8Utg6uoRDeLHUyHg==} + + html-react-parser@5.0.7: + resolution: {integrity: sha512-00ve/0B7ukLUAcAbmD6Vh74EicB+ktLvAM4APeXJjiBsRiPz2ouochTvyUhOJB8apP2t40xAXvpmd+t50aVnJg==} + peerDependencies: + react: 0.14 || 15 || 16 || 17 || 18 + + html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@9.0.0: + resolution: {integrity: sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + itertools@2.1.2: + resolution: {integrity: sha512-NySaJiB+ikC4gDIMMv5pWNcT1FvJavz0TAcinb/+jKmVXs1EbkhY5WcrZS7Se2FvGNz7zI1pUhBJ6ImX3zXuHg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-connect@2.1.0: + resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa@2.15.3: + resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + little-state-machine@4.8.0: + resolution: {integrity: sha512-xfi5+iDxTLhu0hbnNubUs+qoQQqxhtEZeObP5ELjUlHnl74bbasY7mOonsGQrAouyrbag3ebNLSse5xX1T7buQ==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + + mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msw@2.3.5: + resolution: {integrity: sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.7.x' + peerDependenciesMeta: + typescript: + optional: true + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + + prism-react-renderer@2.3.1: + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qr.js@0.0.0: + resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + + query-string@9.1.0: + resolution: {integrity: sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==} + engines: {node: '>=18'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radash@11.0.0: + resolution: {integrity: sha512-CRWxTFTDff0IELGJ/zz58yY4BDgyI14qSM5OLNKbCItJrff7m7dXbVF0kWYVCXQtPb3SXIVhXvAImH6eT7VLSg==} + engines: {node: '>=14.18.0'} + + react-auth-code-input@3.2.1: + resolution: {integrity: sha512-oWWKbxDLU5g46gvE1DIvNFHsDx37JSAfB6WX8luG6TWZB3iDfKMjQnhUgb+0imL/6ykGVMqdZ426tQW1uj25kg==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.0.0' + + react-click-away-listener@2.2.3: + resolution: {integrity: sha512-p63JRQtK9d085+QHUJ2Pje22P/N4tEaXsS2x7tbbptriQqZ9o8xEk7G1JrxwND5YmEVc/VO4fC3+cSBsqqgLUQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-hook-form@7.48.2: + resolution: {integrity: sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-hotkeys-hook@4.5.0: + resolution: {integrity: sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==} + peerDependencies: + react: '>=16.8.1' + react-dom: '>=16.8.1' + + react-inspector@6.0.2: + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-loading-skeleton@3.3.1: + resolution: {integrity: sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==} + peerDependencies: + react: '>=16.8.0' + + react-markdown@9.0.1: + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + + react-qr-code@2.0.15: + resolution: {integrity: sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw==} + peerDependencies: + react: '*' + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.20.1: + resolution: {integrity: sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.20.1: + resolution: {integrity: sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-simple-animate@3.5.2: + resolution: {integrity: sha512-xLE65euP920QMTOmv5haPlml+hmOPDkbIr5WeF7ADIXWBYt5kW/vwpNfWg8EKMab8aeDxIZ6QjffVh8v2dUyhg==} + peerDependencies: + react-dom: ^16.8.0 || ^17 || ^18 + + react-smooth@2.0.5: + resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==} + peerDependencies: + prop-types: ^15.6.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-transition-group@2.9.0: + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + + react-virtualized-auto-sizer@1.0.24: + resolution: {integrity: sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.10.3: + resolution: {integrity: sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==} + engines: {node: '>=14'} + peerDependencies: + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + + reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + + rehype-class-names@2.0.0: + resolution: {integrity: sha512-jldCIiAEvXKdq8hqr5f5PzNdIDkvHC6zfKhwta9oRoMu7bn0W7qLES/JrrjBvr9rKz3nJ8x4vY1EWI+dhjHVZQ==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + sass@1.69.5: + resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + + split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + + string.prototype.padend@3.1.5: + resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.10: + resolution: {integrity: sha512-VC7MBJa+y0RZhpnLKDPmVRLRswsASLmixkiZ5R8xZpNT9VyjeRzwnXd2pBzAWdgSGv/pCNNH01gPCCUsB9exYg==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.0.5: + resolution: {integrity: sha512-HQKHEo73pMNOlDlBcLgZRcHW2+1wo7bFYayAXkGN0l/2+h68KjlfZyMRhdhaGvoHV2eApOovl12zoFz42sT6rQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + synckit@0.8.6: + resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tauri-plugin-log-api@https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/a428c4c4833027865898ef0f284a69b1978fcd94: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/a428c4c4833027865898ef0f284a69b1978fcd94} + version: 0.0.0 + + tauri-plugin-window-state-api@https://codeload.github.com/tauri-apps/tauri-plugin-window-state/tar.gz/002cf15f6a1e4969a678a4ade680cd60477a8a53: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-window-state/tar.gz/002cf15f6a1e4969a678a4ade680cd60477a8a53} + version: 0.0.0 + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + ts-api-utils@1.0.3: + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfck@3.1.1: + resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.24.0: + resolution: {integrity: sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typedoc@0.25.4: + resolution: {integrity: sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + + typesafe-i18n@5.26.2: + resolution: {integrity: sha512-2QAriFmiY5JwUAJtG7yufoE/XZ1aFBY++wj7YFS2yo89a3jLBfKoWSdq5JfQYk1V2BS7V2c/u+KEcaCQoE65hw==} + hasBin: true + peerDependencies: + typescript: '>=3.5.1' + + typescript-eslint-language-service@5.0.5: + resolution: {integrity: sha512-b7gWXpwSTqMVKpPX3WttNZEyVAMKs/2jsHKF79H+qaD6mjzCyU5jboJe/lOZgLJD+QRsXCr0GjIVxvl5kI1NMw==} + peerDependencies: + '@typescript-eslint/parser': '>= 5.0.0' + eslint: '>= 8.0.0' + typescript: '>= 4.0.0' + + typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.18.2: + resolution: {integrity: sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} -packages: + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-breakpoint@4.0.1: + resolution: {integrity: sha512-Fa5Duxv3BY3bw8kmj/lmryTETXVUmBQeYJpBgPJ2yJRiIaGVG8rlMNKQE+JS2rywCZHWaggVUz+ytbr7sH/yyg==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + use-deep-compare-effect@1.8.1: + resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13' + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + victory-vendor@36.7.0: + resolution: {integrity: sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==} + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zustand@4.4.7: + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 - /@babel/core@7.23.5: - resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.23.5': {} + + '@babel/compat-data@7.25.2': {} + + '@babel/core@7.23.5': dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 @@ -271,18 +4340,41 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.5: - resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} - engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.5': dependencies: '@babel/types': 7.23.5 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.22.15': dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 @@ -290,34 +4382,37 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.5 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.23.5 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.15': dependencies: '@babel/types': 7.23.5 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 '@babel/helper-environment-visitor': 7.22.20 @@ -326,37 +4421,48 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.22.5': {} + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.23.5 - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.23.5 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.23.4': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helpers@7.23.5: - resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.23.5': dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.23.5 @@ -364,56 +4470,69 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.5: - resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.23.5': dependencies: '@babel/types': 7.23.5 - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/runtime@7.23.5: - resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/runtime@7.23.5': dependencies: regenerator-runtime: 0.14.0 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} + '@babel/template@7.22.15': dependencies: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.5 '@babel/types': 7.23.5 - /@babel/traverse@7.23.5: - resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} - engines: {node: '>=6.9.0'} + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.23.5': dependencies: '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.5 @@ -428,16 +4547,44 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.23.5: - resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.23.5': dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bundled-es-modules/cookie@2.0.0': + dependencies: + cookie: 0.5.0 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + + '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.22.15 '@babel/runtime': 7.23.5 @@ -450,54 +4597,32 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 - dev: true - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.11.0': dependencies: '@emotion/memoize': 0.8.1 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 - dev: true - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: true + '@emotion/hash@0.9.1': {} - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true + '@emotion/is-prop-valid@0.8.8': dependencies: '@emotion/memoize': 0.7.4 - dev: false optional: true - /@emotion/is-prop-valid@1.2.1: - resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + '@emotion/is-prop-valid@1.2.1': dependencies: '@emotion/memoize': 0.8.1 - dev: true - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false + '@emotion/memoize@0.7.4': optional: true - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: true + '@emotion/memoize@0.8.1': {} - /@emotion/react@11.11.1(@types/react@18.2.41)(react@18.2.0): - resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/react@11.11.1(@types/react@18.2.41)(react@18.2.0)': dependencies: '@babel/runtime': 7.23.5 '@emotion/babel-plugin': 11.11.0 @@ -506,34 +4631,22 @@ packages: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.41 hoist-non-react-statics: 3.3.2 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.41 - /@emotion/serialize@1.1.2: - resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + '@emotion/serialize@1.1.2': dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.2 - dev: true - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: true + '@emotion/sheet@1.2.2': {} - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.41)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.2.41)(react@18.2.0))(@types/react@18.2.41)(react@18.2.0)': dependencies: '@babel/runtime': 7.23.5 '@emotion/babel-plugin': 11.11.0 @@ -542,224 +4655,163 @@ packages: '@emotion/serialize': 1.1.2 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.41 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.41 - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: true + '@emotion/unitless@0.8.1': {} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: true - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: true + '@emotion/utils@1.2.1': {} - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: true + '@emotion/weak-memoize@0.3.1': {} - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true + '@esbuild/aix-ppc64@0.21.5': optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true + '@esbuild/android-arm64@0.18.20': optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true + '@esbuild/android-arm64@0.21.5': optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@esbuild/android-arm@0.18.20': optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@esbuild/android-arm@0.21.5': optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true + '@esbuild/android-x64@0.18.20': optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true + '@esbuild/android-x64@0.21.5': optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@esbuild/darwin-arm64@0.18.20': optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true + '@esbuild/darwin-arm64@0.21.5': optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true + '@esbuild/darwin-x64@0.18.20': optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true + '@esbuild/darwin-x64@0.21.5': optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true + '@esbuild/freebsd-arm64@0.18.20': optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true + '@esbuild/freebsd-arm64@0.21.5': optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true + '@esbuild/freebsd-x64@0.18.20': optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true + '@esbuild/freebsd-x64@0.21.5': optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm64@0.18.20': optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true + '@esbuild/linux-arm64@0.21.5': optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true + '@esbuild/linux-arm@0.18.20': optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + '@esbuild/linux-arm@0.21.5': optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@esbuild/linux-ia32@0.18.20': optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@esbuild/linux-ia32@0.21.5': optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@esbuild/linux-loong64@0.18.20': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.55.0)': dependencies: eslint: 8.55.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -772,283 +4824,249 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.55.0': {} - /@floating-ui/core@1.5.1: - resolution: {integrity: sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw==} + '@floating-ui/core@1.5.1': dependencies: '@floating-ui/utils': 0.1.6 - dev: false - /@floating-ui/dom@1.5.3: - resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + '@floating-ui/dom@1.5.3': dependencies: '@floating-ui/core': 1.5.1 '@floating-ui/utils': 0.1.6 - dev: false - /@floating-ui/react-dom@2.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.5.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@floating-ui/react@0.26.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-iKH8WRR0L/nLiM6qavFZxkyegIZRMxGnM9aKEc71M4wRlUNkgTamjPsOQXy11oZbDOH37MiTbk/nAPn9M2+shA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react@0.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.1.6 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 - dev: false - /@floating-ui/utils@0.1.6: - resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} - dev: false + '@floating-ui/utils@0.1.6': {} - /@hookform/devtools@4.3.1(@types/react@18.2.41)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CrWxEoHQZaOXJZVQ8KBgOuAa8p2LI8M0DAN5GTRTmdCieRwFVjVDEmuTAVazWVRRkpEQSgSt3KYp7VmmqXdEnw==} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 + '@hookform/devtools@4.3.1(@types/react@18.2.41)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@emotion/react': 11.11.1(@types/react@18.2.41)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.41)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@18.2.41)(react@18.2.0))(@types/react@18.2.41)(react@18.2.0) '@types/lodash': 4.14.202 little-state-machine: 4.8.0(react@18.2.0) lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-simple-animate: 3.5.2(react-dom@18.2.0) + react-simple-animate: 3.5.2(react-dom@18.2.0(react@18.2.0)) use-deep-compare-effect: 1.8.1(react@18.2.0) uuid: 8.3.2 transitivePeerDependencies: - '@types/react' - dev: true - /@hookform/resolvers@3.3.2(react-hook-form@7.48.2): - resolution: {integrity: sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==} - peerDependencies: - react-hook-form: ^7.0.0 + '@hookform/resolvers@3.3.2(react-hook-form@7.48.2(react@18.2.0))': dependencies: react-hook-form: 7.48.2(react@18.2.0) - dev: false - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.13': dependencies: '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.1': {} + + '@inquirer/confirm@3.1.22': + dependencies: + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 + + '@inquirer/core@9.0.10': + dependencies: + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 + '@types/mute-stream': 0.0.4 + '@types/node': 22.3.0 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.5': {} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true + '@inquirer/type@1.5.2': + dependencies: + mute-stream: 1.0.0 - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.20': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@ladle/react-context@1.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xVQ8siyOEQG6e4Knibes1uA3PTyXnqiMmfSmd5pIbkzeDty8NCBtYHhTXSlfmcDNEsw/G8OzNWo4VbyQAVDl2A==} - peerDependencies: - react: '>=16.14.0' - react-dom: '>=16.14.0' + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@ladle/react-context@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@ladle/react@3.3.1(@types/node@20.10.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5)(typescript@5.3.2): - resolution: {integrity: sha512-qy35SFWHb+w20Ea6OtIkA95kwTi6+4Zrk9unDPhUAIQwi0EDekMqrOmQJddqvc7Cwq9jujYzlKGbp70wyRqrrg==} - engines: {node: '>=18.0.0'} - hasBin: true - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/core': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - '@ladle/react-context': 1.0.1(react-dom@18.2.0)(react@18.2.0) - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@vitejs/plugin-react': 4.2.0(vite@4.5.1) - '@vitejs/plugin-react-swc': 3.5.0(vite@4.5.1) - axe-core: 4.8.2 + '@ladle/react@4.1.1(@types/node@20.10.3)(@types/react@18.2.41)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.69.5)(typescript@5.3.2)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + '@ladle/react-context': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mdx-js/mdx': 3.0.1 + '@mdx-js/react': 3.0.1(@types/react@18.2.41)(react@18.2.0) + '@vitejs/plugin-react': 4.3.1(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5)) + '@vitejs/plugin-react-swc': 3.7.0(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5)) + axe-core: 4.10.0 boxen: 7.1.1 - chokidar: 3.5.3 - classnames: 2.3.2 - commander: 11.1.0 + chokidar: 3.6.0 + classnames: 2.5.1 + commander: 12.1.0 cross-spawn: 7.0.3 debug: 4.3.4 - get-port: 7.0.0 - globby: 13.2.2 + get-port: 7.1.0 + globby: 14.0.2 history: 5.3.0 - koa: 2.14.2 + koa: 2.15.3 koa-connect: 2.1.0 lodash.merge: 4.6.2 - msw: 1.3.2(typescript@5.3.2) - open: 9.1.0 - prism-react-renderer: 2.3.0(react@18.2.0) + msw: 2.3.5(typescript@5.3.2) + open: 10.1.0 + prism-react-renderer: 2.3.1(react@18.2.0) prop-types: 15.8.1 - query-string: 8.1.0 + query-string: 9.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-hotkeys-hook: 4.4.1(react-dom@18.2.0)(react@18.2.0) + react-hotkeys-hook: 4.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) - rehype-class-names: 1.0.14 + rehype-class-names: 2.0.0 rehype-raw: 7.0.0 - remark-gfm: 3.0.1 + remark-gfm: 4.0.0 source-map: 0.7.4 vfile: 6.0.1 - vite: 4.5.1(@types/node@20.10.3)(sass@1.69.5) - vite-tsconfig-paths: 4.2.1(typescript@5.3.2)(vite@4.5.1) + vite: 5.4.1(@types/node@20.10.3)(sass@1.69.5) + vite-tsconfig-paths: 4.3.2(typescript@5.3.2)(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5)) transitivePeerDependencies: - '@swc/helpers' - '@types/node' - - encoding + - '@types/react' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - typescript - dev: false - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@mdx-js/mdx@3.0.1': dependencies: + '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 '@types/mdx': 2.0.10 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-util-to-js: 1.2.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 - markdown-extensions: 1.1.1 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' + '@mdx-js/react@3.0.1(@types/react@18.2.41)(react@18.2.0)': dependencies: '@types/mdx': 2.0.10 '@types/react': 18.2.41 react: 18.2.0 - dev: false - - /@mswjs/cookies@0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} - engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.7 - set-cookie-parser: 2.6.0 - dev: false - /@mswjs/interceptors@0.17.10: - resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} - engines: {node: '>=14'} + '@mswjs/interceptors@0.29.1': dependencies: - '@open-draft/until': 1.0.3 - '@types/debug': 4.1.12 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.4 - headers-polyfill: 3.2.5 - outvariant: 1.4.0 - strict-event-emitter: 0.2.8 - web-encoding: 1.1.5 - transitivePeerDependencies: - - supports-color - dev: false + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@open-draft/until@1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} - dev: false + '@open-draft/deferred-promise@2.2.0': {} - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@pkgr/utils@2.4.2': dependencies: cross-spawn: 7.0.3 fast-glob: 3.3.2 @@ -1056,133 +5074,119 @@ packages: open: 9.1.0 picocolors: 1.0.0 tslib: 2.6.2 - dev: true - /@remix-run/router@1.13.1: - resolution: {integrity: sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==} - engines: {node: '>=14.0.0'} - dev: false + '@remix-run/router@1.13.1': {} - /@stablelib/base64@1.0.1: - resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - dev: false + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true - /@stablelib/binary@1.0.1: - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@sindresorhus/merge-streams@2.3.0': {} + + '@stablelib/base64@1.0.1': {} + + '@stablelib/binary@1.0.1': dependencies: '@stablelib/int': 1.0.1 - dev: false - /@stablelib/bytes@1.0.1: - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} - dev: false + '@stablelib/bytes@1.0.1': {} - /@stablelib/int@1.0.1: - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - dev: false + '@stablelib/int@1.0.1': {} - /@stablelib/keyagreement@1.0.1: - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + '@stablelib/keyagreement@1.0.1': dependencies: '@stablelib/bytes': 1.0.1 - dev: false - /@stablelib/random@1.0.2: - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + '@stablelib/random@1.0.2': dependencies: '@stablelib/binary': 1.0.1 '@stablelib/wipe': 1.0.1 - dev: false - /@stablelib/wipe@1.0.1: - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} - dev: false + '@stablelib/wipe@1.0.1': {} - /@stablelib/x25519@1.0.3: - resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + '@stablelib/x25519@1.0.3': dependencies: '@stablelib/keyagreement': 1.0.1 '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - dev: false - /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.5): - resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.5): - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - dev: true - /@svgr/babel-preset@8.1.0(@babel/core@7.23.5): - resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-preset@8.1.0(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.5) @@ -1193,17 +5197,13 @@ packages: '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.5) '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.5) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.5) - dev: true - /@svgr/cli@8.1.0(typescript@5.3.2): - resolution: {integrity: sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==} - engines: {node: '>=14'} - hasBin: true + '@svgr/cli@8.1.0(typescript@5.3.2)': dependencies: '@svgr/core': 8.1.0(typescript@5.3.2) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) - '@svgr/plugin-prettier': 8.1.0(@svgr/core@8.1.0) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.3.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.3.2)) + '@svgr/plugin-prettier': 8.1.0(@svgr/core@8.1.0(typescript@5.3.2)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.3.2))(typescript@5.3.2) camelcase: 6.3.0 chalk: 4.1.2 commander: 9.5.0 @@ -1213,11 +5213,8 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@svgr/core@8.1.0(typescript@5.3.2): - resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} - engines: {node: '>=14'} + '@svgr/core@8.1.0(typescript@5.3.2)': dependencies: '@babel/core': 7.23.5 '@svgr/babel-preset': 8.1.0(@babel/core@7.23.5) @@ -1227,21 +5224,13 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@svgr/hast-util-to-babel-ast@8.0.0: - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} + '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: '@babel/types': 7.23.5 entities: 4.5.0 - dev: true - /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): - resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.3.2))': dependencies: '@babel/core': 7.23.5 '@svgr/babel-preset': 8.1.0(@babel/core@7.23.5) @@ -1250,24 +5239,14 @@ packages: svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - dev: true - /@svgr/plugin-prettier@8.1.0(@svgr/core@8.1.0): - resolution: {integrity: sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' + '@svgr/plugin-prettier@8.1.0(@svgr/core@8.1.0(typescript@5.3.2))': dependencies: '@svgr/core': 8.1.0(typescript@5.3.2) deepmerge: 4.3.1 prettier: 2.8.8 - dev: true - /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.3.2): - resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.3.2))(typescript@5.3.2)': dependencies: '@svgr/core': 8.1.0(typescript@5.3.2) cosmiconfig: 8.3.6(typescript@5.3.2) @@ -1275,89 +5254,65 @@ packages: svgo: 3.0.5 transitivePeerDependencies: - typescript - dev: true - /@swc/core-darwin-arm64@1.3.100: - resolution: {integrity: sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@swc/core-darwin-arm64@1.3.100': optional: true - /@swc/core-darwin-x64@1.3.100: - resolution: {integrity: sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@swc/core-darwin-arm64@1.7.11': optional: true - /@swc/core-linux-arm64-gnu@1.3.100: - resolution: {integrity: sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@swc/core-darwin-x64@1.3.100': optional: true - /@swc/core-linux-arm64-musl@1.3.100: - resolution: {integrity: sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@swc/core-darwin-x64@1.7.11': optional: true - /@swc/core-linux-x64-gnu@1.3.100: - resolution: {integrity: sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@swc/core-linux-arm-gnueabihf@1.7.11': optional: true - /@swc/core-linux-x64-musl@1.3.100: - resolution: {integrity: sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@swc/core-linux-arm64-gnu@1.3.100': optional: true - /@swc/core-win32-arm64-msvc@1.3.100: - resolution: {integrity: sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@swc/core-linux-arm64-gnu@1.7.11': optional: true - /@swc/core-win32-ia32-msvc@1.3.100: - resolution: {integrity: sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@swc/core-linux-arm64-musl@1.3.100': optional: true - /@swc/core-win32-x64-msvc@1.3.100: - resolution: {integrity: sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@swc/core-linux-arm64-musl@1.7.11': optional: true - /@swc/core@1.3.100: - resolution: {integrity: sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@swc/core-linux-x64-gnu@1.3.100': + optional: true + + '@swc/core-linux-x64-gnu@1.7.11': + optional: true + + '@swc/core-linux-x64-musl@1.3.100': + optional: true + + '@swc/core-linux-x64-musl@1.7.11': + optional: true + + '@swc/core-win32-arm64-msvc@1.3.100': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.11': + optional: true + + '@swc/core-win32-ia32-msvc@1.3.100': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.11': + optional: true + + '@swc/core-win32-x64-msvc@1.3.100': + optional: true + + '@swc/core-win32-x64-msvc@1.7.11': + optional: true + + '@swc/core@1.3.100': dependencies: '@swc/counter': 0.1.2 '@swc/types': 0.1.5 @@ -1372,182 +5327,110 @@ packages: '@swc/core-win32-ia32-msvc': 1.3.100 '@swc/core-win32-x64-msvc': 1.3.100 - /@swc/counter@0.1.2: - resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + '@swc/core@1.7.11': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.11 + '@swc/core-darwin-x64': 1.7.11 + '@swc/core-linux-arm-gnueabihf': 1.7.11 + '@swc/core-linux-arm64-gnu': 1.7.11 + '@swc/core-linux-arm64-musl': 1.7.11 + '@swc/core-linux-x64-gnu': 1.7.11 + '@swc/core-linux-x64-musl': 1.7.11 + '@swc/core-win32-arm64-msvc': 1.7.11 + '@swc/core-win32-ia32-msvc': 1.7.11 + '@swc/core-win32-x64-msvc': 1.7.11 - /@swc/types@0.1.5: - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + '@swc/counter@0.1.2': {} - /@tanstack/query-core@5.12.1: - resolution: {integrity: sha512-WbZztNmKq0t6QjdNmHzezbi/uifYo9j6e2GLJkodsYaYUlzMbAp91RDyeHkIZrm7EfO4wa6Sm5sxJZm5SPlh6w==} + '@swc/counter@0.1.3': {} - /@tanstack/query-devtools@5.12.1: - resolution: {integrity: sha512-AUWLgdZEYq/ckMZrtKpofOwqxuFiEIdy3gZOh/ouIBVra9ijXVTxYt5cZFSjXJT4q/o0DMii6xMZuIJx2qXZ6g==} - dev: true + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 - /@tanstack/react-query-devtools@5.12.2(@tanstack/react-query@5.12.2)(react@18.2.0): - resolution: {integrity: sha512-EpjYxwUBj+CuzAiB++FMeHzNey4TynuudfWVMsZg0uzLrnR5I0j1CWHJkNsTutb/Db9TNG1Ae66n8ywVvPd1gQ==} - peerDependencies: - '@tanstack/react-query': ^5.12.2 - react: ^18.0.0 + '@swc/types@0.1.5': {} + + '@tanstack/query-core@5.12.1': {} + + '@tanstack/query-devtools@5.12.1': {} + + '@tanstack/react-query-devtools@5.12.2(@tanstack/react-query@5.12.2(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/query-devtools': 5.12.1 '@tanstack/react-query': 5.12.2(react@18.2.0) react: 18.2.0 - dev: true - /@tanstack/react-query@5.12.2(react@18.2.0): - resolution: {integrity: sha512-BeWZu8zVFH20oRc+S/K9ADPgWjEzP/XQCGBNz5IbApUwPQAdwkQYbXODVL5AyAlWiSxhx+P2xlARPBApj2Yrog==} - peerDependencies: - react: ^18.0.0 + '@tanstack/react-query@5.12.2(react@18.2.0)': dependencies: '@tanstack/query-core': 5.12.1 react: 18.2.0 - dev: true - /@tanstack/react-virtual@3.0.0-beta.54(react@18.2.0): - resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-virtual@3.0.0-beta.54(react@18.2.0)': dependencies: '@tanstack/virtual-core': 3.0.0-beta.54 react: 18.2.0 - dev: false - /@tanstack/virtual-core@3.0.0-beta.54: - resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} - dev: false + '@tanstack/virtual-core@3.0.0-beta.54': {} - /@tauri-apps/api@1.5.1: - resolution: {integrity: sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA==} - engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dev: false + '@tauri-apps/api@1.5.1': {} - /@tauri-apps/api@1.5.3: - resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} - engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dev: false + '@tauri-apps/api@1.5.3': {} - /@tauri-apps/cli-darwin-arm64@1.5.7: - resolution: {integrity: sha512-eUpOUhs2IOpKaLa6RyGupP2owDLfd0q2FR/AILzryjtBtKJJRDQQvuotf+LcbEce2Nc2AHeYJIqYAsB4sw9K+g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@tauri-apps/api@1.6.0': {} + + '@tauri-apps/cli-darwin-arm64@1.6.2': optional: true - /@tauri-apps/cli-darwin-x64@1.5.7: - resolution: {integrity: sha512-zfumTv1xUuR+RB1pzhRy+51tB6cm8I76g0xUBaXOfEdOJ9FqW5GW2jdnEUbpNuU65qJ1lB8LVWHKGrSWWKazew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@tauri-apps/cli-darwin-x64@1.6.2': optional: true - /@tauri-apps/cli-linux-arm-gnueabihf@1.5.7: - resolution: {integrity: sha512-JngWNqS06bMND9PhiPWp0e+yknJJuSozsSbo+iMzHoJNRauBZCUx+HnUcygUR66Cy6qM4eJvLXtsRG7ApxvWmg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': optional: true - /@tauri-apps/cli-linux-arm64-gnu@1.5.7: - resolution: {integrity: sha512-WyIYP9BskgBGq+kf4cLAyru8ArrxGH2eMYGBJvuNEuSaqBhbV0i1uUxvyWdazllZLAEz1WvSocUmSwLknr1+sQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@tauri-apps/cli-linux-arm64-gnu@1.6.2': optional: true - /@tauri-apps/cli-linux-arm64-musl@1.5.7: - resolution: {integrity: sha512-OrDpihQP2MB0JY1a/wP9wsl9dDjFDpVEZOQxt4hU+UVGRCZQok7ghPBg4+Xpd1CkNkcCCuIeY8VxRvwLXpnIzg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@tauri-apps/cli-linux-arm64-musl@1.6.2': optional: true - /@tauri-apps/cli-linux-x64-gnu@1.5.7: - resolution: {integrity: sha512-4T7FAYVk76rZi8VkuLpiKUAqaSxlva86C1fHm/RtmoTKwZEV+MI3vIMoVg+AwhyWIy9PS55C75nF7+OwbnFnvQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@tauri-apps/cli-linux-x64-gnu@1.6.2': optional: true - /@tauri-apps/cli-linux-x64-musl@1.5.7: - resolution: {integrity: sha512-LL9aMK601BmQjAUDcKWtt5KvAM0xXi0iJpOjoUD3LPfr5dLvBMTflVHQDAEtuZexLQyqpU09+60781PrI/FCTw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@tauri-apps/cli-linux-x64-musl@1.6.2': optional: true - /@tauri-apps/cli-win32-arm64-msvc@1.5.7: - resolution: {integrity: sha512-TmAdM6GVkfir3AUFsDV2gyc25kIbJeAnwT72OnmJGAECHs/t/GLP9IkFLLVcFKsiosRf8BXhVyQ84NYkSWo14w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@tauri-apps/cli-win32-arm64-msvc@1.6.2': optional: true - /@tauri-apps/cli-win32-ia32-msvc@1.5.7: - resolution: {integrity: sha512-bqWfxwCfLmrfZy69sEU19KHm5TFEaMb8KIekd4aRq/kyOlrjKLdZxN1PyNRP8zpJA1lTiRHzfUDfhpmnZH/skg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@tauri-apps/cli-win32-ia32-msvc@1.6.2': optional: true - /@tauri-apps/cli-win32-x64-msvc@1.5.7: - resolution: {integrity: sha512-OxLHVBNdzyQ//xT3kwjQFnJTn/N5zta/9fofAkXfnL7vqmVn6s/RY1LDa3sxCHlRaKw0n3ShpygRbM9M8+sO9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@tauri-apps/cli-win32-x64-msvc@1.6.2': optional: true - /@tauri-apps/cli@1.5.7: - resolution: {integrity: sha512-z7nXLpDAYfQqR5pYhQlWOr88DgPq1AfQyxHhGiakiVgWlaG0ikEfQxop2txrd52H0TRADG0JHR9vFrVFPv4hVQ==} - engines: {node: '>= 10'} - hasBin: true + '@tauri-apps/cli@1.6.2': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.5.7 - '@tauri-apps/cli-darwin-x64': 1.5.7 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.7 - '@tauri-apps/cli-linux-arm64-gnu': 1.5.7 - '@tauri-apps/cli-linux-arm64-musl': 1.5.7 - '@tauri-apps/cli-linux-x64-gnu': 1.5.7 - '@tauri-apps/cli-linux-x64-musl': 1.5.7 - '@tauri-apps/cli-win32-arm64-msvc': 1.5.7 - '@tauri-apps/cli-win32-ia32-msvc': 1.5.7 - '@tauri-apps/cli-win32-x64-msvc': 1.5.7 - dev: true - - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: true + '@tauri-apps/cli-darwin-arm64': 1.6.2 + '@tauri-apps/cli-darwin-x64': 1.6.2 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.6.2 + '@tauri-apps/cli-linux-arm64-gnu': 1.6.2 + '@tauri-apps/cli-linux-arm64-musl': 1.6.2 + '@tauri-apps/cli-linux-x64-gnu': 1.6.2 + '@tauri-apps/cli-linux-x64-musl': 1.6.2 + '@tauri-apps/cli-win32-arm64-msvc': 1.6.2 + '@tauri-apps/cli-win32-ia32-msvc': 1.6.2 + '@tauri-apps/cli-win32-x64-msvc': 1.6.2 - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@trysound/sax@0.2.0': {} + + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 - dev: false - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.23.5 '@babel/types': 7.23.5 @@ -1555,206 +5438,124 @@ packages: '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.4 - /@types/babel__generator@7.6.7: - resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + '@types/babel__generator@7.6.7': dependencies: '@babel/types': 7.23.5 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.23.5 '@babel/types': 7.23.5 - /@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + '@types/babel__traverse@7.20.4': dependencies: '@babel/types': 7.23.5 - /@types/byte-size@8.1.2: - resolution: {integrity: sha512-jGyVzYu6avI8yuqQCNTZd65tzI8HZrLjKX9sdMqZrGWVlNChu0rf6p368oVEDCYJe5BMx2Ov04tD1wqtgTwGSA==} - dev: false + '@types/byte-size@8.1.2': {} - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: false + '@types/cookie@0.6.0': {} - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false + '@types/d3-array@3.2.1': {} - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false + '@types/d3-color@3.1.3': {} - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false + '@types/d3-ease@3.0.2': {} - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - dev: false - /@types/d3-path@3.0.2: - resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} - dev: false + '@types/d3-path@3.0.2': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: false - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + '@types/d3-shape@3.1.6': dependencies: '@types/d3-path': 3.0.2 - dev: false - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false + '@types/d3-time@3.0.3': {} - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false + '@types/d3-timer@3.0.2': {} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - dev: false - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + '@types/estree-jsx@1.0.3': dependencies: '@types/estree': 1.0.5 - dev: false - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: false - /@types/file-saver@2.0.7: - resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} - dev: true + '@types/estree@1.0.5': {} - /@types/hast@2.3.8: - resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} - dependencies: - '@types/unist': 2.0.10 - dev: false + '@types/file-saver@2.0.7': {} - /@types/hast@3.0.3: - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + '@types/hast@3.0.3': dependencies: '@types/unist': 3.0.2 - dev: false - - /@types/js-levenshtein@1.1.3: - resolution: {integrity: sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==} - dev: false - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/lodash-es@4.17.12: - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.14.202 - dev: true - - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - dev: true - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - dependencies: - '@types/unist': 2.0.10 - dev: false + '@types/lodash@4.14.202': {} - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.3': dependencies: '@types/unist': 3.0.2 - dev: false - /@types/mdx@2.0.10: - resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} - dev: false + '@types/mdx@2.0.10': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: false + '@types/ms@0.7.34': {} - /@types/node@20.10.3: - resolution: {integrity: sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==} + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.10.3 + + '@types/node@20.10.3': dependencies: undici-types: 5.26.5 - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: true + '@types/node@22.3.0': + dependencies: + undici-types: 6.18.2 - /@types/prismjs@1.26.3: - resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} - dev: false + '@types/parse-json@4.0.2': {} - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + '@types/prismjs@1.26.3': {} - /@types/react-dom@18.2.17: - resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} + '@types/prop-types@15.7.11': {} + + '@types/react-dom@18.2.17': dependencies: '@types/react': 18.2.41 - dev: true - /@types/react@18.2.41: - resolution: {integrity: sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==} + '@types/react@18.2.41': dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.2 - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/scheduler@0.16.8': {} - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: true + '@types/semver@7.5.6': {} - /@types/set-cookie-parser@2.4.7: - resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} - dependencies: - '@types/node': 20.10.3 - dev: false + '@types/statuses@2.0.5': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: false + '@types/tough-cookie@4.0.5': {} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false + '@types/unist@2.0.10': {} - /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/unist@3.0.2': {} + + '@types/wrap-ansi@3.0.0': {} + + '@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) @@ -1769,20 +5570,12 @@ packages: natural-compare: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.3.2) + optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2)': dependencies: '@typescript-eslint/scope-manager': 6.13.1 '@typescript-eslint/types': 6.13.1 @@ -1790,52 +5583,31 @@ packages: '@typescript-eslint/visitor-keys': 6.13.1 debug: 4.3.4 eslint: 8.55.0 + optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.13.1: - resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.13.1': dependencies: '@typescript-eslint/types': 6.13.1 '@typescript-eslint/visitor-keys': 6.13.1 - dev: true - /@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.3.2)': dependencies: '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.2) debug: 4.3.4 eslint: 8.55.0 ts-api-utils: 1.0.3(typescript@5.3.2) + optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.13.1: - resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.13.1': {} - /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.2): - resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.2)': dependencies: '@typescript-eslint/types': 6.13.1 '@typescript-eslint/visitor-keys': 6.13.1 @@ -1844,16 +5616,12 @@ packages: is-glob: 4.0.3 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.3.2) + optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.3.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) '@types/json-schema': 7.0.15 @@ -1866,205 +5634,145 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@6.13.1: - resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.13.1': dependencies: '@typescript-eslint/types': 6.13.1 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.0': {} - /@vitejs/plugin-react-swc@3.5.0(vite@4.5.1): - resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} - peerDependencies: - vite: ^4 || ^5 + '@vitejs/plugin-react-swc@3.5.0(vite@4.5.3(@types/node@20.10.3)(sass@1.69.5))': dependencies: '@swc/core': 1.3.100 - vite: 4.5.1(@types/node@20.10.3)(sass@1.69.5) + vite: 4.5.3(@types/node@20.10.3)(sass@1.69.5) transitivePeerDependencies: - '@swc/helpers' - /@vitejs/plugin-react@4.2.0(vite@4.5.1): - resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5))': + dependencies: + '@swc/core': 1.7.11 + vite: 5.4.1(@types/node@20.10.3)(sass@1.69.5) + transitivePeerDependencies: + - '@swc/helpers' + + '@vitejs/plugin-react@4.2.0(vite@4.5.3(@types/node@20.10.3)(sass@1.69.5))': dependencies: '@babel/core': 7.23.5 '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.5) '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 4.5.1(@types/node@20.10.3)(sass@1.69.5) + vite: 4.5.3(@types/node@20.10.3)(sass@1.69.5) transitivePeerDependencies: - supports-color - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: false - - /@zxing/text-encoding@0.9.0: - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - requiresBuild: true - dev: false - optional: true + '@vitejs/plugin-react@4.3.1(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.1(@types/node@20.10.3)(sass@1.69.5) + transitivePeerDependencies: + - supports-color - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: false - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.2): dependencies: acorn: 8.11.2 - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.2: {} - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: false - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false + ansi-regex@6.0.1: {} - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: true + ansi-sequence-parser@1.1.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: false + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.5 is-array-buffer: 3.0.2 - dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 get-intrinsic: 1.2.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + array.prototype.tosorted@1.1.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 get-intrinsic: 1.2.2 - dev: true - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.2: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 @@ -2073,91 +5781,46 @@ packages: get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: false + astring@1.8.6: {} - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + asynciterator.prototype@1.0.0: dependencies: has-symbols: 1.0.3 - dev: true - /autoprefixer@10.4.16(postcss@8.4.32): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.20(postcss@8.4.32): dependencies: - browserslist: 4.22.2 - caniuse-lite: 1.0.30001566 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001658 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.32 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.5: {} - /axe-core@4.8.2: - resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} - engines: {node: '>=4'} - dev: false + axe-core@4.10.0: {} - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.23.5 cosmiconfig: 7.1.0 resolve: 1.22.8 - dev: true - - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + bail@2.0.2: {} - /bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - dev: false + balanced-match@1.0.2: {} - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} + bcp-47-match@2.0.3: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + big-integer@1.6.52: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false + binary-extensions@2.2.0: {} - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolbase@1.0.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -2167,141 +5830,103 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.2: dependencies: - caniuse-lite: 1.0.30001566 + caniuse-lite: 1.0.30001658 electron-to-chromium: 1.4.601 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + browserslist@4.23.3: dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false + caniuse-lite: 1.0.30001658 + electron-to-chromium: 1.5.9 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - /byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} - dev: false + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 - /cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + byte-size@8.1.1: {} + + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 ylru: 1.3.2 - dev: false - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + call-bind@1.0.5: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + camelcase@7.0.1: {} - /caniuse-lite@1.0.30001566: - resolution: {integrity: sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==} + caniuse-lite@1.0.30001658: {} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false + ccount@2.0.1: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false + chalk@5.3.0: {} - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false + character-entities-html4@2.1.0: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false + character-entities-legacy@3.0.0: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false + character-entities@2.0.2: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: false + character-reference-invalid@2.0.1: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: false + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -2313,532 +5938,303 @@ packages: optionalDependencies: fsevents: 2.3.3 - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: false + classnames@2.3.2: {} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + classnames@2.5.1: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: false + cli-boxes@3.0.0: {} - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: false + cli-spinners@2.9.2: {} - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: false + cli-width@4.1.0: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: false + clsx@2.0.0: {} - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false + co@4.6.0: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false + collapse-white-space@2.1.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: false + commander@12.1.0: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true + commander@7.2.0: {} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true + commander@9.5.0: {} - /compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} - dev: false + compare-versions@6.1.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: false - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: false + content-type@1.0.5: {} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.5.0: {} - /cookies@0.8.0: - resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} - engines: {node: '>= 0.8'} + cookies@0.9.1: dependencies: depd: 2.0.0 keygrip: 1.1.0 - dev: false - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - /cosmiconfig@8.3.6(typescript@5.3.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.3.2 - dev: true - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 path-key: 2.0.1 semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - /css-selector-parser@3.0.2: - resolution: {integrity: sha512-eA5pvYwgtffuxQlDk0gJRApDUKgfwlsQBMAH6uawKuuilTLfxKIOtzyV63Y3IC0LWnDCeTJ/I1qYmlfYvvMzDg==} - dev: false + css-selector-parser@3.0.2: {} - /css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 source-map-js: 1.0.2 - dev: true - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.0.2 - dev: true - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true + css-what@6.1.0: {} - /csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csso@5.0.5: dependencies: css-tree: 2.2.1 - dev: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.2: {} - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /dashify@2.0.0: - resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==} - engines: {node: '>=4'} - dev: true + dashify@2.0.0: {} - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false + dayjs@1.11.13: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - dev: false + decimal.js-light@2.5.1: {} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - dev: false - /decode-uri-component@0.4.1: - resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} - engines: {node: '>=14.16'} - dev: false + decode-uri-component@0.4.1: {} - /deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - dev: false + deep-equal@1.0.1: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true + deepmerge@4.3.1: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser-id@5.0.0: {} + + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + default-browser@5.2.1: dependencies: - clone: 1.0.4 - dev: false + bundle-name: 4.1.0 + default-browser-id: 5.0.0 - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} + define-data-property@1.1.1: dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + define-lazy-prop@3.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.1 has-property-descriptors: 1.0.1 object-keys: 1.1.1 - dev: true - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: false + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false + depd@2.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: false + destroy@1.2.0: {} - /detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - dev: false + detect-browser@5.3.0: {} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - dev: false - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} - hasBin: true - dev: false + direction@2.0.1: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-helpers@3.4.0: - resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dom-helpers@3.4.0: dependencies: '@babel/runtime': 7.23.5 - dev: false - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false + ee-first@1.1.1: {} - /electron-to-chromium@1.4.601: - resolution: {integrity: sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==} + electron-to-chromium@1.4.601: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false + electron-to-chromium@1.5.9: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false + emoji-regex@8.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false + emoji-regex@9.2.2: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + encodeurl@1.0.2: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + entities@4.5.0: {} + + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} + es-abstract@1.22.3: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -2879,10 +6275,8 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.13 - dev: true - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + es-iterator-helpers@1.0.15: dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.5 @@ -2898,37 +6292,24 @@ packages: internal-slot: 1.0.6 iterator.prototype: 1.1.2 safe-array-concat: 1.0.1 - dev: true - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 hasown: 2.0.0 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.0 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 '@esbuild/android-arm64': 0.18.20 @@ -2953,87 +6334,68 @@ packages: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - - /eslint-config-prettier@9.1.0(eslint@8.55.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.1: {} + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.55.0): dependencies: eslint: 8.55.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.13.1)(eslint-import-resolver-node@0.3.9)(eslint@8.55.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0): dependencies: - '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) eslint: 8.55.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.13.1)(eslint@8.55.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0): dependencies: - '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -3042,65 +6404,41 @@ packages: doctrine: 2.1.0 eslint: 8.55.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.13.1)(eslint-import-resolver-node@0.3.9)(eslint@8.55.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@8.55.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.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.1.0): - resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.1.0): dependencies: eslint: 8.55.0 - eslint-config-prettier: 9.1.0(eslint@8.55.0) prettier: 3.1.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.6 - dev: true + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.55.0) - /eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): dependencies: eslint: 8.55.0 - dev: true - /eslint-plugin-react-refresh@0.4.5(eslint@8.55.0): - resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} - peerDependencies: - eslint: '>=7' + eslint-plugin-react-refresh@0.4.5(eslint@8.55.0): dependencies: eslint: 8.55.0 - dev: true - /eslint-plugin-react@7.33.2(eslint@8.55.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.33.2(eslint@8.55.0): dependencies: array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -3119,33 +6457,19 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.10 - dev: true - /eslint-plugin-simple-import-sort@10.0.0(eslint@8.55.0): - resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} - peerDependencies: - eslint: '>=5.0.0' + eslint-plugin-simple-import-sort@10.0.0(eslint@8.55.0): dependencies: eslint: 8.55.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.55.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) '@eslint-community/regexpp': 4.10.0 @@ -3187,96 +6511,56 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 - dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.5 - dev: false - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + estree-util-build-jsx@3.0.1: dependencies: '@types/estree-jsx': 1.0.3 - estree-util-is-identifier-name: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 - dev: false - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - dev: false + estree-util-is-identifier-name@3.0.0: {} - /estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - dev: false - - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 astring: 1.8.6 source-map: 0.7.4 - dev: false - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 - '@types/unist': 2.0.10 - dev: false + '@types/unist': 3.0.2 - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + esutils@2.0.3: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false + eventemitter3@4.0.7: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3288,9 +6572,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3302,34 +6584,15 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: false + extend@3.0.2: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: false + fast-equals@5.0.1: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -3337,182 +6600,102 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} - dev: false + file-saver@2.0.5: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /filter-obj@5.1.0: - resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} - engines: {node: '>=14.16'} - dev: false + filter-obj@5.1.0: {} - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true + find-root@1.1.0: {} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true + flatted@3.2.9: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true + fraction.js@4.3.7: {} - /framer-motion@10.16.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-w7Yzx0OzQ5Uh6uNkxaX+4TuAPuOKz3haSbjmHpdrqDpGuCJCpq6YP9Dy7JJWdZ6mJjndrg3Ao3vUwDajKNikCA==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + framer-motion@10.16.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 - dev: false + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: false + fresh@0.5.2: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} - engines: {node: '>=16'} - dev: false + get-port@7.1.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3520,40 +6703,26 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} + globals@13.23.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -3561,87 +6730,56 @@ packages: ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@14.0.2: dependencies: - dir-glob: 3.0.1 + '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 ignore: 5.3.0 - merge2: 1.4.1 - slash: 4.0.0 - dev: false + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: false + globrex@0.1.2: {} - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.2 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: false + graphql@16.8.1: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.2 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - /hast-util-classnames@3.0.0: - resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} + hast-util-classnames@3.0.0: dependencies: '@types/hast': 3.0.3 space-separated-tokens: 2.0.2 - dev: false - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -3651,22 +6789,16 @@ packages: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 - dev: false - /hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + hast-util-has-property@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + hast-util-raw@9.0.1: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -3681,18 +6813,14 @@ packages: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-sanitize@5.0.1: - resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} + hast-util-sanitize@5.0.1: dependencies: '@types/hast': 3.0.3 '@ungap/structured-clone': 1.2.0 unist-util-position: 5.0.0 - dev: false - /hast-util-select@6.0.2: - resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + hast-util-select@6.0.2: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -3710,32 +6838,29 @@ packages: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: false - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hast-util-to-estree@3.1.0: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 + '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 property-information: 6.4.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 - unist-util-position: 4.0.4 + unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.5 '@types/hast': 3.0.3 @@ -3754,10 +6879,8 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 @@ -3766,582 +6889,313 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@8.0.0: dependencies: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.0 space-separated-tokens: 2.0.2 - dev: false - /headers-polyfill@3.2.5: - resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} - dev: false + headers-polyfill@4.0.3: {} - /history@5.3.0: - resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + history@5.3.0: dependencies: '@babel/runtime': 7.23.5 - dev: false - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /html-dom-parser@5.0.4: - resolution: {integrity: sha512-azy8THLKd4Ar0OVJpEgX+MSjYvKdNDWlGiRBIlovMqEQYMAnLLXBhhiSwjylDD3RDdcCYT8Utg6uoRDeLHUyHg==} + html-dom-parser@5.0.4: dependencies: domhandler: 5.0.3 htmlparser2: 9.0.0 - dev: false - /html-react-parser@5.0.7(react@18.2.0): - resolution: {integrity: sha512-00ve/0B7ukLUAcAbmD6Vh74EicB+ktLvAM4APeXJjiBsRiPz2ouochTvyUhOJB8apP2t40xAXvpmd+t50aVnJg==} - peerDependencies: - react: 0.14 || 15 || 16 || 17 || 18 + html-react-parser@5.0.7(react@18.2.0): dependencies: domhandler: 5.0.3 html-dom-parser: 5.0.4 react: 18.2.0 react-property: 2.0.2 style-to-js: 1.1.10 - dev: false - /html-url-attributes@3.0.0: - resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} - dev: false + html-url-attributes@3.0.0: {} - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false + html-void-elements@3.0.0: {} - /htmlparser2@9.0.0: - resolution: {integrity: sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==} + htmlparser2@9.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: false - /http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} + http-assert@1.5.0: dependencies: deep-equal: 1.0.1 http-errors: 1.8.1 - dev: false - /http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + http-errors@1.8.1: dependencies: depd: 1.1.2 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 1.5.0 toidentifier: 1.0.1 - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false + human-signals@2.1.0: {} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + human-signals@4.3.1: {} - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} + ignore@5.3.0: {} - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + immutable@4.3.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + inherits@2.0.4: {} - /inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} - dev: false + inline-style-parser@0.1.1: {} - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - dev: false + inline-style-parser@0.2.2: {} - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} + internal-slot@1.0.6: dependencies: get-intrinsic: 1.2.2 hasown: 2.0.0 side-channel: 1.0.4 - dev: true - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: false + is-alphabetical@2.0.1: {} - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - dev: false - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: false - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: true - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.0 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - dev: true - - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: false - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + is-decimal@2.0.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-docker@2.2.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.5 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: false + is-hexadecimal@2.0.1: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: false - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true + is-map@2.0.2: {} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.2: {} - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: false + is-node-process@1.2.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@4.1.0: {} - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.2: dependencies: '@types/estree': 1.0.5 - dev: false - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true + is-set@2.0.2: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.5 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.13 - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: false - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true + is-weakmap@2.0.1: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.5 - dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - dev: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isarray@2.0.5: {} - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + isexe@2.0.0: {} + + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.2 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 - dev: true - /itertools@2.1.2: - resolution: {integrity: sha512-NySaJiB+ikC4gDIMMv5pWNcT1FvJavz0TAcinb/+jKmVXs1EbkhY5WcrZS7Se2FvGNz7zI1pUhBJ6ImX3zXuHg==} - dev: false - - /js-levenshtein@1.1.6: - resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} - engines: {node: '>=0.10.0'} - dev: false + itertools@2.1.2: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.1.7 - dev: true - /keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false - /koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - dev: false + koa-compose@4.1.0: {} - /koa-connect@2.1.0: - resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} - dev: false + koa-connect@2.1.0: {} - /koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} + koa-convert@2.0.0: dependencies: co: 4.6.0 koa-compose: 4.1.0 - dev: false - /koa@2.14.2: - resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + koa@2.15.3: dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 content-disposition: 0.5.4 content-type: 1.0.5 - cookies: 0.8.0 + cookies: 0.9.1 debug: 4.3.4 delegates: 1.0.0 depd: 2.0.0 @@ -4362,148 +7216,69 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /little-state-machine@4.8.0(react@18.2.0): - resolution: {integrity: sha512-xfi5+iDxTLhu0hbnNubUs+qoQQqxhtEZeObP5ELjUlHnl74bbasY7mOonsGQrAouyrbag3ebNLSse5xX1T7buQ==} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + little-state-machine@4.8.0(react@18.2.0): dependencies: react: 18.2.0 - dev: true - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash-es@4.17.21: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash.merge@4.6.2: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: false + lodash@4.17.21: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false + longest-streak@3.1.0: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: true - - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: false + lunr@2.3.9: {} - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false + markdown-extensions@2.0.0: {} - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: true + markdown-table@3.0.3: {} - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 - dev: false + marked@4.3.0: {} - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + mdast-util-find-and-replace@3.0.1: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.3 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -4519,78 +7294,65 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-gfm-autolink-literal@2.0.0: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.3 ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 - dev: false + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-gfm-footnote@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - dev: false + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - dev: false + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.3 + devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - dev: false - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + mdast-util-gfm-task-list-item@2.0.0: dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-gfm@3.0.0: dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + mdast-util-mdx-expression@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -4600,29 +7362,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - - /mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdx-jsx@3.0.0: - resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + mdast-util-mdx-jsx@3.0.0: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -4639,34 +7380,18 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: false - - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdx@3.0.0: dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -4676,37 +7401,13 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 - dev: false - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + mdast-util-phrasing@4.0.0: dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - dev: false - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - dependencies: - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + mdast-util-to-hast@13.0.2: dependencies: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 @@ -4716,23 +7417,8 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - dev: false - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -4742,68 +7428,24 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.15 - dev: false - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.3 - dev: false - /mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - dev: true + mdn-data@2.0.28: {} - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - dev: true + mdn-data@2.0.30: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: false + media-typer@0.3.0: {} - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true + memorystream@0.3.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -4821,453 +7463,231 @@ packages: micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - dependencies: - micromark-util-types: 1.1.0 - dev: false - - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.5 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.0: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 1.1.0 - dev: false + micromark-util-types: 2.0.0 - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.5 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@2.0.1: dependencies: '@types/estree': 1.0.5 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - dependencies: + devlop: 1.1.0 micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-space@2.0.0: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + micromark-util-character@2.0.1: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - dev: false - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: false + micromark-util-encode@2.0.0: {} - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 - '@types/unist': 2.0.10 - estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 - dev: false - - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: false - - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: false + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - dependencies: - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: false - - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - dev: false - - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: false - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: false + micromark-util-symbol@2.0.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: false - - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false + micromark-util-types@2.0.0: {} - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -5288,177 +7708,95 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: false - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-fn@4.0.0: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false + minimist@1.2.8: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /msw@1.3.2(typescript@5.3.2): - resolution: {integrity: sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA==} - engines: {node: '>=14'} - hasBin: true - requiresBuild: true - peerDependencies: - typescript: '>= 4.4.x <= 5.2.x' - peerDependenciesMeta: - typescript: - optional: true + msw@2.3.5(typescript@5.3.2): dependencies: - '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.17.10 - '@open-draft/until': 1.0.3 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.3 + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 3.1.22 + '@mswjs/interceptors': 0.29.1 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 chalk: 4.1.2 - chokidar: 3.5.3 - cookie: 0.4.2 graphql: 16.8.1 - headers-polyfill: 3.2.5 - inquirer: 8.2.6 + headers-polyfill: 4.0.3 is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.7.0 - outvariant: 1.4.0 + outvariant: 1.4.3 path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 - type-fest: 2.19.0 - typescript: 5.3.2 + strict-event-emitter: 0.5.1 + type-fest: 4.24.0 yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false + optionalDependencies: + typescript: 5.3.2 - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: false + mute-stream@1.0.0: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false + negotiator@0.6.3: {} - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true + nice-try@1.0.5: {} - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false + node-releases@2.0.14: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /not@0.1.0: - resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} - dev: false + not@0.1.0: {} - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 @@ -5469,132 +7807,95 @@ packages: read-pkg: 3.0.0 shell-quote: 1.8.1 string.prototype.padend: 3.1.5 - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.1.0: dependencies: path-key: 4.0.0 - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} - engines: {node: '>= 0.4'} + object.entries@1.1.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object.groupby@1.0.1: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 - dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.3: dependencies: define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object.values@1.1.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - dev: false + only@0.0.2: {} - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -5602,60 +7903,24 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: false - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: false - /outvariant@1.4.0: - resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - dev: false + outvariant@1.4.3: {} - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - dev: false + p-timeout@6.1.2: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.10 character-entities: 2.0.2 @@ -5665,263 +7930,156 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: false - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: false + parseurl@1.3.3: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + path-to-regexp@6.2.1: {} - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + path-type@5.0.0: {} + + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picocolors@1.0.1: {} - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + picomatch@2.3.1: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pidtree@0.3.1: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true + pify@3.0.0: {} - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} + postcss-value-parser@4.2.0: {} + + postcss@8.4.32: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /prettier@3.1.0: - resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.1.0: {} - /prism-react-renderer@2.3.0(react@18.2.0): - resolution: {integrity: sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==} - peerDependencies: - react: '>=16.0.0' + prism-react-renderer@2.3.1(react@18.2.0): dependencies: '@types/prismjs': 1.26.3 clsx: 2.0.0 react: 18.2.0 - dev: false - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} - dev: false + property-information@6.4.0: {} + + psl@1.9.0: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /qr.js@0.0.0: - resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} - dev: false + qr.js@0.0.0: {} - /query-string@8.1.0: - resolution: {integrity: sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==} - engines: {node: '>=14.16'} + query-string@9.1.0: dependencies: decode-uri-component: 0.4.1 filter-obj: 5.1.0 split-on-first: 3.0.0 - dev: false - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + querystringify@2.2.0: {} - /radash@11.0.0: - resolution: {integrity: sha512-CRWxTFTDff0IELGJ/zz58yY4BDgyI14qSM5OLNKbCItJrff7m7dXbVF0kWYVCXQtPb3SXIVhXvAImH6eT7VLSg==} - engines: {node: '>=14.18.0'} - dev: false + queue-microtask@1.2.3: {} - /react-auth-code-input@3.2.1(react@18.2.0): - resolution: {integrity: sha512-oWWKbxDLU5g46gvE1DIvNFHsDx37JSAfB6WX8luG6TWZB3iDfKMjQnhUgb+0imL/6ykGVMqdZ426tQW1uj25kg==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16.0.0' + radash@11.0.0: {} + + react-auth-code-input@3.2.1(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /react-click-away-listener@2.2.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-p63JRQtK9d085+QHUJ2Pje22P/N4tEaXsS2x7tbbptriQqZ9o8xEk7G1JrxwND5YmEVc/VO4fC3+cSBsqqgLUQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-click-away-listener@2.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - /react-hook-form@7.48.2(react@18.2.0): - resolution: {integrity: sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==} - engines: {node: '>=12.22.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react-hook-form@7.48.2(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /react-hotkeys-hook@4.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sClBMBioFEgFGYLTWWRKvhxcCx1DRznd+wkFHwQZspnRBkHTgruKIHptlK/U/2DPX8BhHoRGzpMVWUXMmdZlmw==} - peerDependencies: - react: '>=16.8.1' - react-dom: '>=16.8.1' + react-hotkeys-hook@4.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-inspector@6.0.2(react@18.2.0): - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 + react-inspector@6.0.2(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@16.13.1: {} - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false + react-lifecycles-compat@3.0.4: {} - /react-loading-skeleton@3.3.1(react@18.2.0): - resolution: {integrity: sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==} - peerDependencies: - react: '>=16.8.0' + react-loading-skeleton@3.3.1(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /react-markdown@9.0.1(@types/react@18.2.41)(react@18.2.0): - resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} - peerDependencies: - '@types/react': '>=18' - react: '>=18' + react-markdown@9.0.1(@types/react@18.2.41)(react@18.2.0): dependencies: '@types/hast': 3.0.3 '@types/react': 18.2.41 @@ -5937,80 +8095,44 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /react-property@2.0.2: - resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} - dev: false + react-property@2.0.2: {} - /react-qr-code@2.0.12(react@18.2.0): - resolution: {integrity: sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg==} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - react-native-svg: '*' - peerDependenciesMeta: - react-native-svg: - optional: true + react-qr-code@2.0.15(react@18.2.0): dependencies: prop-types: 15.8.1 qr.js: 0.0.0 react: 18.2.0 - dev: false - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} + react-refresh@0.14.0: {} - /react-router-dom@6.20.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-refresh@0.14.2: {} + + react-router-dom@6.20.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.13.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-router: 6.20.1(react@18.2.0) - dev: false - /react-router@6.20.1(react@18.2.0): - resolution: {integrity: sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + react-router@6.20.1(react@18.2.0): dependencies: '@remix-run/router': 1.13.1 react: 18.2.0 - dev: false - /react-simple-animate@3.5.2(react-dom@18.2.0): - resolution: {integrity: sha512-xLE65euP920QMTOmv5haPlml+hmOPDkbIr5WeF7ADIXWBYt5kW/vwpNfWg8EKMab8aeDxIZ6QjffVh8v2dUyhg==} - peerDependencies: - react-dom: ^16.8.0 || ^17 || ^18 + react-simple-animate@3.5.2(react-dom@18.2.0(react@18.2.0)): dependencies: react-dom: 18.2.0(react@18.2.0) - dev: true - /react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==} - peerDependencies: - prop-types: ^15.6.0 - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) - dev: false + react-transition-group: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} - peerDependencies: - react: '>=15.0.0' - react-dom: '>=15.0.0' + react-transition-group@2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: dom-helpers: 3.4.0 loose-envify: 1.4.0 @@ -6018,61 +8140,31 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-lifecycles-compat: 3.0.4 - dev: false - /react-virtualized-auto-sizer@1.0.20(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==} - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + react-virtualized-auto-sizer@1.0.24(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 - dev: false - /recharts@2.10.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==} - engines: {node: '>=14'} - peerDependencies: - prop-types: ^15.6.0 - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + recharts@2.10.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: clsx: 2.0.0 eventemitter3: 4.0.7 @@ -6081,15 +8173,12 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 16.13.1 - react-smooth: 2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-smooth: 2.0.5(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recharts-scale: 0.4.5 tiny-invariant: 1.3.1 victory-vendor: 36.7.0 - dev: false - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.4: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6097,76 +8186,52 @@ packages: get-intrinsic: 1.2.2 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regenerator-runtime@0.14.0: {} - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: true - /rehype-class-names@1.0.14: - resolution: {integrity: sha512-eFBt6Qxb7K77y6P82tUtN9rKpU7guWlaK4XA4RrrSFHkUTCvr2D3cgb9OR5d4t1AaGOvR59FH9nRwUnbpn9AEg==} + rehype-class-names@2.0.0: dependencies: '@types/hast': 3.0.3 hast-util-classnames: 3.0.0 hast-util-select: 6.0.2 - unified: 10.1.2 - dev: false + unified: 11.0.4 - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.3 hast-util-raw: 9.0.1 vfile: 6.0.1 - dev: false - /rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + rehype-sanitize@6.0.0: dependencies: '@types/hast': 3.0.3 hast-util-sanitize: 5.0.1 - dev: false - - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + remark-gfm@4.0.0: dependencies: - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-mdx@3.0.1: dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -6174,336 +8239,218 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - dev: false - - /remark-rehype@11.0.0: - resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + remark-rehype@11.0.0: dependencies: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 mdast-util-to-hast: 13.0.2 unified: 11.0.4 vfile: 6.0.1 - dev: false - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + require-directory@2.1.1: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + requires-port@1.0.0: {} + + resolve-from@4.0.0: {} + + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + run-applescript@5.0.0: dependencies: execa: 5.1.1 - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: false + run-applescript@7.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - dev: false - - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - - /sass@1.69.5: - resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} - engines: {node: '>=14.0.0'} - hasBin: true + sass@1.69.5: dependencies: chokidar: 3.5.3 immutable: 4.3.4 source-map-js: 1.0.2 - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: false - - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.1: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.1 - dev: true - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false + setprototypeof@1.2.0: {} - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /shiki@0.14.5: - resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + shiki@0.14.5: dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + signal-exit@4.1.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false + slash@3.0.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + slash@5.1.0: {} + + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + source-map-js@1.0.2: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + source-map@0.5.7: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + source-map@0.7.4: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: true - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: true + spdx-license-ids@3.0.16: {} - /split-on-first@3.0.0: - resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} - engines: {node: '>=12'} - dev: false + split-on-first@3.0.0: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: false + statuses@1.5.0: {} - /strict-event-emitter@0.2.8: - resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} - dependencies: - events: 3.3.0 - dev: false + statuses@2.0.1: {} - /strict-event-emitter@0.4.6: - resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} - dev: false + strict-event-emitter@0.5.1: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: false - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.10: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6514,133 +8461,79 @@ packages: regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 - dev: true - /string.prototype.padend@3.1.5: - resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} - engines: {node: '>= 0.4'} + string.prototype.padend@3.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: false - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@3.0.0: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /style-to-js@1.1.10: - resolution: {integrity: sha512-VC7MBJa+y0RZhpnLKDPmVRLRswsASLmixkiZ5R8xZpNT9VyjeRzwnXd2pBzAWdgSGv/pCNNH01gPCCUsB9exYg==} + style-to-js@1.1.10: dependencies: style-to-object: 1.0.5 - dev: false - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - dev: false - /style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + style-to-object@1.0.5: dependencies: inline-style-parser: 0.2.2 - dev: false - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: true + stylis@4.2.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - dev: true + svg-parser@2.0.4: {} - /svgo@3.0.5: - resolution: {integrity: sha512-HQKHEo73pMNOlDlBcLgZRcHW2+1wo7bFYayAXkGN0l/2+h68KjlfZyMRhdhaGvoHV2eApOovl12zoFz42sT6rQ==} - engines: {node: '>=14.0.0'} - hasBin: true + svgo@3.0.5: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -6649,243 +8542,144 @@ packages: css-what: 6.1.0 csso: 5.0.5 picocolors: 1.0.0 - dev: true - /synckit@0.8.6: - resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.6: dependencies: '@pkgr/utils': 2.4.2 tslib: 2.6.2 - dev: true - - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + tabbable@6.2.0: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false + tauri-plugin-log-api@https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/a428c4c4833027865898ef0f284a69b1978fcd94: + dependencies: + '@tauri-apps/api': 1.5.1 - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false + tauri-plugin-window-state-api@https://codeload.github.com/tauri-apps/tauri-plugin-window-state/tar.gz/002cf15f6a1e4969a678a4ade680cd60477a8a53: + dependencies: + '@tauri-apps/api': 1.5.3 - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} + text-table@0.2.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: false + tiny-invariant@1.3.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + titleize@3.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false + toidentifier@1.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + trim-lines@3.0.1: {} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false + trough@2.1.0: {} - /ts-api-utils@1.0.3(typescript@5.3.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.0.3(typescript@5.3.2): dependencies: typescript: 5.3.2 - dev: true - /tsconfck@2.1.2(typescript@5.3.2): - resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: + tsconfck@3.1.1(typescript@5.3.2): + optionalDependencies: typescript: 5.3.2 - dev: false - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - dev: false + tsscmp@1.0.6: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: false + type-fest@0.21.3: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + type-fest@2.19.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-fest@4.24.0: {} + + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: false - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: true - /typedoc@0.25.4(typescript@5.3.2): - resolution: {integrity: sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + typedoc@0.25.4(typescript@5.3.2): dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 shiki: 0.14.5 typescript: 5.3.2 - dev: true - /typesafe-i18n@5.26.2(typescript@5.3.2): - resolution: {integrity: sha512-2QAriFmiY5JwUAJtG7yufoE/XZ1aFBY++wj7YFS2yo89a3jLBfKoWSdq5JfQYk1V2BS7V2c/u+KEcaCQoE65hw==} - hasBin: true - peerDependencies: - typescript: '>=3.5.1' + typesafe-i18n@5.26.2(typescript@5.3.2): dependencies: typescript: 5.3.2 - dev: true - /typescript-eslint-language-service@5.0.5(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-b7gWXpwSTqMVKpPX3WttNZEyVAMKs/2jsHKF79H+qaD6mjzCyU5jboJe/lOZgLJD+QRsXCr0GjIVxvl5kI1NMw==} - peerDependencies: - '@typescript-eslint/parser': '>= 5.0.0' - eslint: '>= 8.0.0' - typescript: '>= 4.0.0' + typescript-eslint-language-service@5.0.5(@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2))(eslint@8.55.0)(typescript@5.3.2): dependencies: '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) eslint: 8.55.0 typescript: 5.3.2 - dev: true - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.3.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false + undici-types@6.18.2: {} - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unicorn-magic@0.1.0: {} + + unified@11.0.4: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -6894,229 +8688,105 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 6.0.1 - dev: false - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-position@5.0.0: dependencies: - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 - dev: false + '@types/unist': 3.0.2 - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: false - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.10 - dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: false - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + universalify@0.2.0: {} - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + untildify@4.0.0: {} + + update-browserslist-db@1.0.13(browserslist@4.22.2): dependencies: browserslist: 4.22.2 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.0.1 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /use-breakpoint@4.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Fa5Duxv3BY3bw8kmj/lmryTETXVUmBQeYJpBgPJ2yJRiIaGVG8rlMNKQE+JS2rywCZHWaggVUz+ytbr7sH/yyg==} - peerDependencies: - react: '>=18' - react-dom: '>=18' + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-breakpoint@4.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /use-deep-compare-effect@1.8.1(react@18.2.0): - resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13' + use-deep-compare-effect@1.8.1(react@18.2.0): dependencies: '@babel/runtime': 7.23.5 dequal: 2.0.3 react: 18.2.0 - dev: true - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.0(react@18.2.0): dependencies: react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.13 - dev: false - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: false + uuid@8.3.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: false + vary@1.1.2: {} - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - dev: false - /victory-vendor@36.7.0: - resolution: {integrity: sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==} + victory-vendor@36.7.0: dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -7132,111 +8802,53 @@ packages: d3-shape: 3.2.0 d3-time: 3.1.0 d3-timer: 3.0.1 - dev: false - /vite-tsconfig-paths@4.2.1(typescript@5.3.2)(vite@4.5.1): - resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vite-tsconfig-paths@4.3.2(typescript@5.3.2)(vite@5.4.1(@types/node@20.10.3)(sass@1.69.5)): dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.2(typescript@5.3.2) - vite: 4.5.1(@types/node@20.10.3)(sass@1.69.5) + tsconfck: 3.1.1(typescript@5.3.2) + optionalDependencies: + vite: 5.4.1(@types/node@20.10.3)(sass@1.69.5) transitivePeerDependencies: - supports-color - typescript - dev: false - /vite@4.5.1(@types/node@20.10.3)(sass@1.69.5): - resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.5.3(@types/node@20.10.3)(sass@1.69.5): dependencies: - '@types/node': 20.10.3 esbuild: 0.18.20 - postcss: 8.4.32 + postcss: 8.4.41 rollup: 3.29.4 - sass: 1.69.5 optionalDependencies: + '@types/node': 20.10.3 fsevents: 2.3.3 + sass: 1.69.5 - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: true - - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: false - - /web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + vite@5.4.1(@types/node@20.10.3)(sass@1.69.5): dependencies: - util: 0.12.5 + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 optionalDependencies: - '@zxing/text-encoding': 0.9.0 - dev: false + '@types/node': 20.10.3 + fsevents: 2.3.3 + sass: 1.69.5 - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false + vscode-oniguruma@1.7.0: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false + vscode-textmate@8.0.0: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false + web-namespaces@2.0.1: {} - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.0 @@ -7250,20 +8862,15 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.13 - dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.1: dependencies: is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - dev: true - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.13: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 @@ -7271,143 +8878,71 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + yaml@1.10.2: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false - /ylru@1.3.2: - resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} - engines: {node: '>= 4.0.0'} - dev: false + ylru@1.3.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + yoctocolors-cjs@2.1.2: {} - /zustand@4.4.7(@types/react@18.2.41)(react@18.2.0): - resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true + zod@3.22.4: {} + + zustand@4.4.7(@types/react@18.2.41)(react@18.2.0): dependencies: + use-sync-external-store: 1.2.0(react@18.2.0) + optionalDependencies: '@types/react': 18.2.41 react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false - - github.com/tauri-apps/tauri-plugin-log/a428c4c4833027865898ef0f284a69b1978fcd94: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-log/tar.gz/a428c4c4833027865898ef0f284a69b1978fcd94} - name: tauri-plugin-log-api - version: 0.0.0 - dependencies: - '@tauri-apps/api': 1.5.1 - dev: false - github.com/tauri-apps/tauri-plugin-window-state/002cf15f6a1e4969a678a4ade680cd60477a8a53: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-window-state/tar.gz/002cf15f6a1e4969a678a4ade680cd60477a8a53} - name: tauri-plugin-window-state-api - version: 0.0.0 - dependencies: - '@tauri-apps/api': 1.5.3 - dev: false + zwitch@2.0.4: {} diff --git a/resources-linux/defguard-service.service b/resources-linux/defguard-service.service index 6cc2cd3d..bce9f07b 100644 --- a/resources-linux/defguard-service.service +++ b/resources-linux/defguard-service.service @@ -1,6 +1,6 @@ [Unit] Description=Defguard interface daemon service -Documentation=https://defguard.gitbook.io/defguard/ +Documentation=https://docs.defguard.net Wants=network-online.target After=network-online.target diff --git a/src-tauri/.envrc b/src-tauri/.envrc deleted file mode 100644 index f65cb06e..00000000 --- a/src-tauri/.envrc +++ /dev/null @@ -1 +0,0 @@ -export DATABASE_URL=sqlite://defguard.db diff --git a/src-tauri/.sqlx/query-09eaf7503256da688c9eaeebb2b187d1b7d5692ce7e0ca467465e78f873e0901.json b/src-tauri/.sqlx/query-09eaf7503256da688c9eaeebb2b187d1b7d5692ce7e0ca467465e78f873e0901.json new file mode 100644 index 00000000..e7bdf562 --- /dev/null +++ b/src-tauri/.sqlx/query-09eaf7503256da688c9eaeebb2b187d1b7d5692ce7e0ca467465e78f873e0901.json @@ -0,0 +1,68 @@ +{ + "db_name": "SQLite", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled FROM instance WHERE token IS NOT NULL;", + "describe": { + "columns": [ + { + "name": "id: _", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "name", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "uuid", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "url", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "proxy_url", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "username", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "token", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "disable_all_traffic", + "ordinal": 7, + "type_info": "Bool" + }, + { + "name": "enterprise_enabled", + "ordinal": 8, + "type_info": "Bool" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "09eaf7503256da688c9eaeebb2b187d1b7d5692ce7e0ca467465e78f873e0901" +} diff --git a/src-tauri/.sqlx/query-31cce786a98f42f93bef6beb172aff153682182940f382d977a59ebf8cf7def0.json b/src-tauri/.sqlx/query-149bfe6602e397dc79a956f33e2373a6a3b08c8d615b404f9917c5158d4857dd.json similarity index 81% rename from src-tauri/.sqlx/query-31cce786a98f42f93bef6beb172aff153682182940f382d977a59ebf8cf7def0.json rename to src-tauri/.sqlx/query-149bfe6602e397dc79a956f33e2373a6a3b08c8d615b404f9917c5158d4857dd.json index 8b64d203..dd1fbb3d 100644 --- a/src-tauri/.sqlx/query-31cce786a98f42f93bef6beb172aff153682182940f382d977a59ebf8cf7def0.json +++ b/src-tauri/.sqlx/query-149bfe6602e397dc79a956f33e2373a6a3b08c8d615b404f9917c5158d4857dd.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, \n route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE server_pubkey = $1;", + "query": "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE server_pubkey = $1;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -56,7 +56,7 @@ { "name": "persistent_keep_alive", "ordinal": 10, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -106,5 +106,5 @@ true ] }, - "hash": "31cce786a98f42f93bef6beb172aff153682182940f382d977a59ebf8cf7def0" + "hash": "149bfe6602e397dc79a956f33e2373a6a3b08c8d615b404f9917c5158d4857dd" } diff --git a/src-tauri/.sqlx/query-15653b6cff48d598efc8bf6b40ea414580a236b351ad7818ee75d7efe2833882.json b/src-tauri/.sqlx/query-17a3b10441e63bde5b97c861747617eadddbc843e42545860afdd8ad6951b4ee.json similarity index 58% rename from src-tauri/.sqlx/query-15653b6cff48d598efc8bf6b40ea414580a236b351ad7818ee75d7efe2833882.json rename to src-tauri/.sqlx/query-17a3b10441e63bde5b97c861747617eadddbc843e42545860afdd8ad6951b4ee.json index 79bd08c4..4c0ace38 100644 --- a/src-tauri/.sqlx/query-15653b6cff48d598efc8bf6b40ea414580a236b351ad7818ee75d7efe2833882.json +++ b/src-tauri/.sqlx/query-17a3b10441e63bde5b97c861747617eadddbc843e42545860afdd8ad6951b4ee.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO tunnel_stats (tunnel_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id;", + "query": "INSERT INTO tunnel_stats (tunnel_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 7 }, "nullable": [ - false + true ] }, - "hash": "15653b6cff48d598efc8bf6b40ea414580a236b351ad7818ee75d7efe2833882" + "hash": "17a3b10441e63bde5b97c861747617eadddbc843e42545860afdd8ad6951b4ee" } diff --git a/src-tauri/.sqlx/query-2e752bd9e60b5ddd0c9eeeabb6cbb5148296157f00ef39610c18fc290da384bf.json b/src-tauri/.sqlx/query-2e752bd9e60b5ddd0c9eeeabb6cbb5148296157f00ef39610c18fc290da384bf.json new file mode 100644 index 00000000..acfde086 --- /dev/null +++ b/src-tauri/.sqlx/query-2e752bd9e60b5ddd0c9eeeabb6cbb5148296157f00ef39610c18fc290da384bf.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT name FROM location WHERE id = $1", + "describe": { + "columns": [ + { + "name": "name", + "ordinal": 0, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "2e752bd9e60b5ddd0c9eeeabb6cbb5148296157f00ef39610c18fc290da384bf" +} diff --git a/src-tauri/.sqlx/query-e40e496b783090e9b52fa793a74b009f77982f1198a187f54624c36fcada68fd.json b/src-tauri/.sqlx/query-2fecdb6bd008790da557f2ad050d84ec7803dd0e9db5b7326a67b864d1f47410.json similarity index 68% rename from src-tauri/.sqlx/query-e40e496b783090e9b52fa793a74b009f77982f1198a187f54624c36fcada68fd.json rename to src-tauri/.sqlx/query-2fecdb6bd008790da557f2ad050d84ec7803dd0e9db5b7326a67b864d1f47410.json index add3eb9b..2ada0161 100644 --- a/src-tauri/.sqlx/query-e40e496b783090e9b52fa793a74b009f77982f1198a187f54624c36fcada68fd.json +++ b/src-tauri/.sqlx/query-2fecdb6bd008790da557f2ad050d84ec7803dd0e9db5b7326a67b864d1f47410.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "\n SELECT id, location_id, connected_from, start, end \n FROM connection\n WHERE location_id = $1\n ", + "query": "SELECT id, location_id, connected_from, start, end FROM connection WHERE location_id = $1 ORDER BY end DESC LIMIT 1", "describe": { "columns": [ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "location_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "connected_from", @@ -40,5 +40,5 @@ false ] }, - "hash": "e40e496b783090e9b52fa793a74b009f77982f1198a187f54624c36fcada68fd" + "hash": "2fecdb6bd008790da557f2ad050d84ec7803dd0e9db5b7326a67b864d1f47410" } diff --git a/src-tauri/.sqlx/query-30181be5c9c6c5347de3d300ffba0732064face52dbebc0f5679af357c262a98.json b/src-tauri/.sqlx/query-30181be5c9c6c5347de3d300ffba0732064face52dbebc0f5679af357c262a98.json new file mode 100644 index 00000000..2931fd08 --- /dev/null +++ b/src-tauri/.sqlx/query-30181be5c9c6c5347de3d300ffba0732064face52dbebc0f5679af357c262a98.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT last_handshake, listen_port \"listen_port!: u32\", persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" FROM tunnel_stats WHERE tunnel_id = $1 ORDER BY collected_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "name": "last_handshake", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "listen_port!: u32", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "persistent_keepalive_interval?: u16", + "ordinal": 2, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "30181be5c9c6c5347de3d300ffba0732064face52dbebc0f5679af357c262a98" +} diff --git a/src-tauri/.sqlx/query-3fe0268bce98cbce7cbf4ce8a4134948a042acdb8363f7735642da642420bfe6.json b/src-tauri/.sqlx/query-3fe0268bce98cbce7cbf4ce8a4134948a042acdb8363f7735642da642420bfe6.json deleted file mode 100644 index 9946a3a1..00000000 --- a/src-tauri/.sqlx/query-3fe0268bce98cbce7cbf4ce8a4134948a042acdb8363f7735642da642420bfe6.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT\n c.id as \"id!\",\n c.tunnel_id as \"tunnel_id!\",\n c.connected_from as \"connected_from!\",\n c.start as \"start!\",\n c.end as \"end!\",\n COALESCE((\n SELECT ls.upload\n FROM tunnel_stats AS ls\n WHERE ls.tunnel_id = c.tunnel_id\n AND ls.collected_at >= c.start\n AND ls.collected_at <= c.end\n ORDER BY ls.collected_at DESC\n LIMIT 1\n ), 0) as \"upload: _\",\n COALESCE((\n SELECT ls.download\n FROM tunnel_stats AS ls\n WHERE ls.tunnel_id = c.tunnel_id\n AND ls.collected_at >= c.start\n AND ls.collected_at <= c.end\n ORDER BY ls.collected_at DESC\n LIMIT 1\n ), 0) as \"download: _\"\n FROM tunnel_connection AS c WHERE tunnel_id = $1\n ORDER BY start DESC;\n ", - "describe": { - "columns": [ - { - "name": "id!", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "tunnel_id!", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "connected_from!", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "start!", - "ordinal": 3, - "type_info": "Datetime" - }, - { - "name": "end!", - "ordinal": 4, - "type_info": "Datetime" - }, - { - "name": "upload: _", - "ordinal": 5, - "type_info": "Null" - }, - { - "name": "download: _", - "ordinal": 6, - "type_info": "Null" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - null, - null - ] - }, - "hash": "3fe0268bce98cbce7cbf4ce8a4134948a042acdb8363f7735642da642420bfe6" -} diff --git a/src-tauri/.sqlx/query-a66970ffacbd60cf2f97d9fba3e747bd8567edde53ccbd90dc92cc925aa1a548.json b/src-tauri/.sqlx/query-48cbbca02294eb342b4040b315c71301e06c48260f003893a27ed283f943551f.json similarity index 55% rename from src-tauri/.sqlx/query-a66970ffacbd60cf2f97d9fba3e747bd8567edde53ccbd90dc92cc925aa1a548.json rename to src-tauri/.sqlx/query-48cbbca02294eb342b4040b315c71301e06c48260f003893a27ed283f943551f.json index 74d34c79..28ef748d 100644 --- a/src-tauri/.sqlx/query-a66970ffacbd60cf2f97d9fba3e747bd8567edde53ccbd90dc92cc925aa1a548.json +++ b/src-tauri/.sqlx/query-48cbbca02294eb342b4040b315c71301e06c48260f003893a27ed283f943551f.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO wireguard_keys (instance_id, pubkey, prvkey) VALUES ($1, $2, $3) RETURNING id;\n ", + "query": "INSERT INTO wireguard_keys (instance_id, pubkey, prvkey) VALUES ($1, $2, $3) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 3 }, "nullable": [ - false + true ] }, - "hash": "a66970ffacbd60cf2f97d9fba3e747bd8567edde53ccbd90dc92cc925aa1a548" + "hash": "48cbbca02294eb342b4040b315c71301e06c48260f003893a27ed283f943551f" } diff --git a/src-tauri/.sqlx/query-49a4b21b78cc2096138907538e8b87fa1e942627ce93fbb97d61d8854e555880.json b/src-tauri/.sqlx/query-49a4b21b78cc2096138907538e8b87fa1e942627ce93fbb97d61d8854e555880.json new file mode 100644 index 00000000..1ff699db --- /dev/null +++ b/src-tauri/.sqlx/query-49a4b21b78cc2096138907538e8b87fa1e942627ce93fbb97d61d8854e555880.json @@ -0,0 +1,56 @@ +{ + "db_name": "SQLite", + "query": "SELECT c.id, c.location_id, c.connected_from \"connected_from!\", c.start \"start!\", c.end \"end!\", COALESCE(( SELECT ls.upload FROM location_stats ls WHERE ls.location_id = c.location_id AND ls.collected_at >= c.start AND ls.collected_at <= c.end ORDER BY ls.collected_at DESC LIMIT 1 ), 0) \"upload: _\", COALESCE(( SELECT ls.download FROM location_stats ls WHERE ls.location_id = c.location_id AND ls.collected_at >= c.start AND ls.collected_at <= c.end ORDER BY ls.collected_at DESC LIMIT 1 ), 0) \"download: _\" FROM connection c WHERE location_id = $1 ORDER BY start DESC", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "location_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "connected_from!", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "start!", + "ordinal": 3, + "type_info": "Datetime" + }, + { + "name": "end!", + "ordinal": 4, + "type_info": "Datetime" + }, + { + "name": "upload: _", + "ordinal": 5, + "type_info": "Integer" + }, + { + "name": "download: _", + "ordinal": 6, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "49a4b21b78cc2096138907538e8b87fa1e942627ce93fbb97d61d8854e555880" +} diff --git a/src-tauri/.sqlx/query-5305ab3080d10cbd6f4de24e5493072d183075951f3ebe6c17f27a5e92a3e4b6.json b/src-tauri/.sqlx/query-5305ab3080d10cbd6f4de24e5493072d183075951f3ebe6c17f27a5e92a3e4b6.json deleted file mode 100644 index e09d1415..00000000 --- a/src-tauri/.sqlx/query-5305ab3080d10cbd6f4de24e5493072d183075951f3ebe6c17f27a5e92a3e4b6.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT\n c.id as \"id!\",\n c.location_id as \"location_id!\",\n c.connected_from as \"connected_from!\",\n c.start as \"start!\",\n c.end as \"end!\",\n COALESCE((\n SELECT ls.upload\n FROM location_stats AS ls\n WHERE ls.location_id = c.location_id\n AND ls.collected_at >= c.start\n AND ls.collected_at <= c.end\n ORDER BY ls.collected_at DESC\n LIMIT 1\n ), 0) as \"upload: _\",\n COALESCE((\n SELECT ls.download\n FROM location_stats AS ls\n WHERE ls.location_id = c.location_id\n AND ls.collected_at >= c.start\n AND ls.collected_at <= c.end\n ORDER BY ls.collected_at DESC\n LIMIT 1\n ), 0) as \"download: _\"\n FROM connection AS c WHERE location_id = $1\n ORDER BY start DESC;\n ", - "describe": { - "columns": [ - { - "name": "id!", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "location_id!", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "connected_from!", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "start!", - "ordinal": 3, - "type_info": "Datetime" - }, - { - "name": "end!", - "ordinal": 4, - "type_info": "Datetime" - }, - { - "name": "upload: _", - "ordinal": 5, - "type_info": "Null" - }, - { - "name": "download: _", - "ordinal": 6, - "type_info": "Null" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - true, - false, - false, - false, - false, - null, - null - ] - }, - "hash": "5305ab3080d10cbd6f4de24e5493072d183075951f3ebe6c17f27a5e92a3e4b6" -} diff --git a/src-tauri/.sqlx/query-ce950c602d6620d98bc4c3518e2520e028bc2609b39578f1ccd5bfa9df2240e8.json b/src-tauri/.sqlx/query-5953a81f34f906e34aabec089dfe0cebf2afc3ad798638db9ea0aabcd506192b.json similarity index 77% rename from src-tauri/.sqlx/query-ce950c602d6620d98bc4c3518e2520e028bc2609b39578f1ccd5bfa9df2240e8.json rename to src-tauri/.sqlx/query-5953a81f34f906e34aabec089dfe0cebf2afc3ad798638db9ea0aabcd506192b.json index 0b188d37..ab312bb2 100644 --- a/src-tauri/.sqlx/query-ce950c602d6620d98bc4c3518e2520e028bc2609b39578f1ccd5bfa9df2240e8.json +++ b/src-tauri/.sqlx/query-5953a81f34f906e34aabec089dfe0cebf2afc3ad798638db9ea0aabcd506192b.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id,route_all_traffic, mfa_enabled, keepalive_interval FROM location;", + "query": "SELECT id, instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id,route_all_traffic, mfa_enabled, keepalive_interval FROM location;", "describe": { "columns": [ { - "name": "id?", + "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "instance_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -46,7 +46,7 @@ { "name": "network_id", "ordinal": 8, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -61,7 +61,7 @@ { "name": "keepalive_interval", "ordinal": 11, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { @@ -82,5 +82,5 @@ false ] }, - "hash": "ce950c602d6620d98bc4c3518e2520e028bc2609b39578f1ccd5bfa9df2240e8" + "hash": "5953a81f34f906e34aabec089dfe0cebf2afc3ad798638db9ea0aabcd506192b" } diff --git a/src-tauri/.sqlx/query-5c28754680e92a81a74ced06551494c2471bf7180483796d1ff4419a5e9b488d.json b/src-tauri/.sqlx/query-5c28754680e92a81a74ced06551494c2471bf7180483796d1ff4419a5e9b488d.json deleted file mode 100644 index 873b1935..00000000 --- a/src-tauri/.sqlx/query-5c28754680e92a81a74ced06551494c2471bf7180483796d1ff4419a5e9b488d.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n WITH cte AS (\n SELECT\n id, tunnel_id,\n COALESCE(upload - LAG(upload) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) as upload,\n COALESCE(download - LAG(download) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) as download,\n last_handshake, strftime($1, collected_at) as collected_at, listen_port, persistent_keepalive_interval\n FROM tunnel_stats\n ORDER BY collected_at\n LIMIT -1 OFFSET 1\n )\n SELECT\n id, tunnel_id,\n SUM(MAX(upload, 0)) as \"upload!: i64\",\n SUM(MAX(download, 0)) as \"download!: i64\",\n last_handshake,\n collected_at as \"collected_at!: NaiveDateTime\",\n listen_port as \"listen_port!: u32\",\n persistent_keepalive_interval as \"persistent_keepalive_interval?: u16\"\n FROM cte\n WHERE tunnel_id = $2\n AND collected_at >= $3\n GROUP BY collected_at\n ORDER BY collected_at;\n ", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "tunnel_id", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "upload!: i64", - "ordinal": 2, - "type_info": "Null" - }, - { - "name": "download!: i64", - "ordinal": 3, - "type_info": "Null" - }, - { - "name": "last_handshake", - "ordinal": 4, - "type_info": "Int64" - }, - { - "name": "collected_at!: NaiveDateTime", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "listen_port!: u32", - "ordinal": 6, - "type_info": "Int64" - }, - { - "name": "persistent_keepalive_interval?: u16", - "ordinal": 7, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - false, - false, - true, - true, - false, - true, - false, - false - ] - }, - "hash": "5c28754680e92a81a74ced06551494c2471bf7180483796d1ff4419a5e9b488d" -} diff --git a/src-tauri/.sqlx/query-68772513090d1bd3fbf58546971333d32a45eee6b9a70bb74713bee2f6283321.json b/src-tauri/.sqlx/query-68772513090d1bd3fbf58546971333d32a45eee6b9a70bb74713bee2f6283321.json deleted file mode 100644 index 60bd958c..00000000 --- a/src-tauri/.sqlx/query-68772513090d1bd3fbf58546971333d32a45eee6b9a70bb74713bee2f6283321.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5 WHERE id = $6;", - "describe": { - "columns": [], - "parameters": { - "Right": 6 - }, - "nullable": [] - }, - "hash": "68772513090d1bd3fbf58546971333d32a45eee6b9a70bb74713bee2f6283321" -} diff --git a/src-tauri/.sqlx/query-db268d84f76585abcbd482c6ff2eebbfd9e57e6e8b216cf55a206e9ef1a41c77.json b/src-tauri/.sqlx/query-75dd44538a3c01b20f75f8ddb5dd91ba1687e05e1ca265965b8e0adcf42f21bc.json similarity index 50% rename from src-tauri/.sqlx/query-db268d84f76585abcbd482c6ff2eebbfd9e57e6e8b216cf55a206e9ef1a41c77.json rename to src-tauri/.sqlx/query-75dd44538a3c01b20f75f8ddb5dd91ba1687e05e1ca265965b8e0adcf42f21bc.json index a7395cb6..6e99e5c4 100644 --- a/src-tauri/.sqlx/query-db268d84f76585abcbd482c6ff2eebbfd9e57e6e8b216cf55a206e9ef1a41c77.json +++ b/src-tauri/.sqlx/query-75dd44538a3c01b20f75f8ddb5dd91ba1687e05e1ca265965b8e0adcf42f21bc.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "UPDATE settings SET theme = $1, log_level = $2, tray_icon_theme = $3, check_for_updates = $4 WHERE id = 1;", + "query": "UPDATE settings SET theme = $1, log_level = $2, tray_icon_theme = $3, check_for_updates = $4, selected_view = $5 WHERE id = 1;", "describe": { "columns": [], "parameters": { - "Right": 4 + "Right": 5 }, "nullable": [] }, - "hash": "db268d84f76585abcbd482c6ff2eebbfd9e57e6e8b216cf55a206e9ef1a41c77" + "hash": "75dd44538a3c01b20f75f8ddb5dd91ba1687e05e1ca265965b8e0adcf42f21bc" } diff --git a/src-tauri/.sqlx/query-d364b350070c789f0d7e33fb1789dde7717aca865f082f24b500214814c4a3ef.json b/src-tauri/.sqlx/query-76998bbd9e0096deb957c8e60df4b7f10eb86c8341e3cc0bc081e5c4dcbcee44.json similarity index 53% rename from src-tauri/.sqlx/query-d364b350070c789f0d7e33fb1789dde7717aca865f082f24b500214814c4a3ef.json rename to src-tauri/.sqlx/query-76998bbd9e0096deb957c8e60df4b7f10eb86c8341e3cc0bc081e5c4dcbcee44.json index 0da2bc84..5ed80c68 100644 --- a/src-tauri/.sqlx/query-d364b350070c789f0d7e33fb1789dde7717aca865f082f24b500214814c4a3ef.json +++ b/src-tauri/.sqlx/query-76998bbd9e0096deb957c8e60df4b7f10eb86c8341e3cc0bc081e5c4dcbcee44.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", name, uuid, url, proxy_url, username FROM instance;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -32,6 +32,21 @@ "name": "username", "ordinal": 5, "type_info": "Text" + }, + { + "name": "token?", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "disable_all_traffic", + "ordinal": 7, + "type_info": "Bool" + }, + { + "name": "enterprise_enabled", + "ordinal": 8, + "type_info": "Bool" } ], "parameters": { @@ -43,8 +58,11 @@ false, false, false, + false, + true, + false, false ] }, - "hash": "d364b350070c789f0d7e33fb1789dde7717aca865f082f24b500214814c4a3ef" + "hash": "76998bbd9e0096deb957c8e60df4b7f10eb86c8341e3cc0bc081e5c4dcbcee44" } diff --git a/src-tauri/.sqlx/query-8dfaa1c23af01a966442b52412eaa3a58f804f5d59d14fa70a65dba68c079b01.json b/src-tauri/.sqlx/query-7b6cba2ce07597ff499b692055f18241f97d604243f387ca9f1a12264b79fb16.json similarity index 75% rename from src-tauri/.sqlx/query-8dfaa1c23af01a966442b52412eaa3a58f804f5d59d14fa70a65dba68c079b01.json rename to src-tauri/.sqlx/query-7b6cba2ce07597ff499b692055f18241f97d604243f387ca9f1a12264b79fb16.json index beaa490d..d373fcd3 100644 --- a/src-tauri/.sqlx/query-8dfaa1c23af01a966442b52412eaa3a58f804f5d59d14fa70a65dba68c079b01.json +++ b/src-tauri/.sqlx/query-7b6cba2ce07597ff499b692055f18241f97d604243f387ca9f1a12264b79fb16.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE pubkey = $1;", + "query": "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE instance_id = $1", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "instance_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -46,7 +46,7 @@ { "name": "network_id", "ordinal": 8, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -61,7 +61,7 @@ { "name": "keepalive_interval", "ordinal": 11, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { @@ -82,5 +82,5 @@ false ] }, - "hash": "8dfaa1c23af01a966442b52412eaa3a58f804f5d59d14fa70a65dba68c079b01" + "hash": "7b6cba2ce07597ff499b692055f18241f97d604243f387ca9f1a12264b79fb16" } diff --git a/src-tauri/.sqlx/query-827b70bc272ec1b731a6af60d77e65680370ff4b01600138ebdca569ee1b4248.json b/src-tauri/.sqlx/query-7f83ec88f699dd2d15e40dfb023a60be3da33c4d1ca49e56b08154aa2ad7b8a0.json similarity index 64% rename from src-tauri/.sqlx/query-827b70bc272ec1b731a6af60d77e65680370ff4b01600138ebdca569ee1b4248.json rename to src-tauri/.sqlx/query-7f83ec88f699dd2d15e40dfb023a60be3da33c4d1ca49e56b08154aa2ad7b8a0.json index 40dfabcf..5e0adb2a 100644 --- a/src-tauri/.sqlx/query-827b70bc272ec1b731a6af60d77e65680370ff4b01600138ebdca569ee1b4248.json +++ b/src-tauri/.sqlx/query-7f83ec88f699dd2d15e40dfb023a60be3da33c4d1ca49e56b08154aa2ad7b8a0.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "\n SELECT id, location_id, connected_from, start, end\n FROM connection\n WHERE location_id = $1\n ORDER BY end DESC\n LIMIT 1\n ", + "query": "SELECT id, location_id, connected_from, start, end FROM connection WHERE location_id = $1", "describe": { "columns": [ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "location_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "connected_from", @@ -40,5 +40,5 @@ false ] }, - "hash": "827b70bc272ec1b731a6af60d77e65680370ff4b01600138ebdca569ee1b4248" + "hash": "7f83ec88f699dd2d15e40dfb023a60be3da33c4d1ca49e56b08154aa2ad7b8a0" } diff --git a/src-tauri/.sqlx/query-3ed7616493993dbd3e9f5c52da1524020d8de92ef857028f1099d8fc0b2b72c6.json b/src-tauri/.sqlx/query-88160affcd4bcd0d74ac816b7a975996902572e5ca3d365235a86e3464215cc1.json similarity index 53% rename from src-tauri/.sqlx/query-3ed7616493993dbd3e9f5c52da1524020d8de92ef857028f1099d8fc0b2b72c6.json rename to src-tauri/.sqlx/query-88160affcd4bcd0d74ac816b7a975996902572e5ca3d365235a86e3464215cc1.json index 33b9f1cb..dd7c10e2 100644 --- a/src-tauri/.sqlx/query-3ed7616493993dbd3e9f5c52da1524020d8de92ef857028f1099d8fc0b2b72c6.json +++ b/src-tauri/.sqlx/query-88160affcd4bcd0d74ac816b7a975996902572e5ca3d365235a86e3464215cc1.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO tunnel_connection (tunnel_id, connected_from, start, end) VALUES ($1, $2, $3, $4) RETURNING id;", + "query": "INSERT INTO tunnel_connection (tunnel_id, connected_from, start, end) VALUES ($1, $2, $3, $4) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 4 }, "nullable": [ - false + true ] }, - "hash": "3ed7616493993dbd3e9f5c52da1524020d8de92ef857028f1099d8fc0b2b72c6" + "hash": "88160affcd4bcd0d74ac816b7a975996902572e5ca3d365235a86e3464215cc1" } diff --git a/src-tauri/.sqlx/query-8b1ed48665635fa226cdcbe20a5d87614e9b7c018b83107d97e48ee2713808b8.json b/src-tauri/.sqlx/query-8b1ed48665635fa226cdcbe20a5d87614e9b7c018b83107d97e48ee2713808b8.json deleted file mode 100644 index be4242e0..00000000 --- a/src-tauri/.sqlx/query-8b1ed48665635fa226cdcbe20a5d87614e9b7c018b83107d97e48ee2713808b8.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n WITH cte AS (\n SELECT\n id, location_id,\n COALESCE(upload - LAG(upload) OVER (PARTITION BY location_id ORDER BY collected_at), 0) as upload,\n COALESCE(download - LAG(download) OVER (PARTITION BY location_id ORDER BY collected_at), 0) as download,\n last_handshake, strftime($1, collected_at) as collected_at, listen_port, persistent_keepalive_interval\n FROM location_stats\n ORDER BY collected_at\n\t LIMIT -1 OFFSET 1\n )\n SELECT\n id, location_id,\n \tSUM(MAX(upload, 0)) as \"upload!: i64\",\n \tSUM(MAX(download, 0)) as \"download!: i64\",\n \tlast_handshake,\n \tcollected_at as \"collected_at!: NaiveDateTime\",\n \tlisten_port as \"listen_port!: u32\",\n \tpersistent_keepalive_interval as \"persistent_keepalive_interval?: u16\"\n FROM cte\n WHERE location_id = $2\n AND collected_at >= $3\n GROUP BY collected_at\n ORDER BY collected_at;\n ", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "location_id", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "upload!: i64", - "ordinal": 2, - "type_info": "Null" - }, - { - "name": "download!: i64", - "ordinal": 3, - "type_info": "Null" - }, - { - "name": "last_handshake", - "ordinal": 4, - "type_info": "Int64" - }, - { - "name": "collected_at!: NaiveDateTime", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "listen_port!: u32", - "ordinal": 6, - "type_info": "Int64" - }, - { - "name": "persistent_keepalive_interval?: u16", - "ordinal": 7, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - false, - false, - true, - true, - false, - true, - false, - true - ] - }, - "hash": "8b1ed48665635fa226cdcbe20a5d87614e9b7c018b83107d97e48ee2713808b8" -} diff --git a/src-tauri/.sqlx/query-913813b9d72042d77652eda92b953814e7930c5387f785ba2cdb0d08c43f4d11.json b/src-tauri/.sqlx/query-913813b9d72042d77652eda92b953814e7930c5387f785ba2cdb0d08c43f4d11.json new file mode 100644 index 00000000..da46cea9 --- /dev/null +++ b/src-tauri/.sqlx/query-913813b9d72042d77652eda92b953814e7930c5387f785ba2cdb0d08c43f4d11.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT last_handshake, listen_port \"listen_port!: u32\", persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" FROM location_stats WHERE location_id = $1 ORDER BY collected_at DESC LIMIT 1", + "describe": { + "columns": [ + { + "name": "last_handshake", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "listen_port!: u32", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "persistent_keepalive_interval?: u16", + "ordinal": 2, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + true + ] + }, + "hash": "913813b9d72042d77652eda92b953814e7930c5387f785ba2cdb0d08c43f4d11" +} diff --git a/src-tauri/.sqlx/query-2519ee530137aff4f6d567cfd0732227ab0ed2df1a05397890de3a55d62d27ab.json b/src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json similarity index 52% rename from src-tauri/.sqlx/query-2519ee530137aff4f6d567cfd0732227ab0ed2df1a05397890de3a55d62d27ab.json rename to src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json index 3084a476..4b7ed9e3 100644 --- a/src-tauri/.sqlx/query-2519ee530137aff4f6d567cfd0732227ab0ed2df1a05397890de3a55d62d27ab.json +++ b/src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO instance (name, uuid, url, proxy_url, username) VALUES ($1, $2, $3, $4, $5) RETURNING id;", + "query": "INSERT INTO instance (name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", "describe": { "columns": [ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { - "Right": 5 + "Right": 8 }, "nullable": [ false ] }, - "hash": "2519ee530137aff4f6d567cfd0732227ab0ed2df1a05397890de3a55d62d27ab" + "hash": "95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08" } diff --git a/src-tauri/.sqlx/query-979d26af5b82c1a991402203707e2cc7673709453d011e627930d6c184966d36.json b/src-tauri/.sqlx/query-979d26af5b82c1a991402203707e2cc7673709453d011e627930d6c184966d36.json new file mode 100644 index 00000000..cd8dbd20 --- /dev/null +++ b/src-tauri/.sqlx/query-979d26af5b82c1a991402203707e2cc7673709453d011e627930d6c184966d36.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT name FROM tunnel WHERE id = $1;", + "describe": { + "columns": [ + { + "name": "name", + "ordinal": 0, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "979d26af5b82c1a991402203707e2cc7673709453d011e627930d6c184966d36" +} diff --git a/src-tauri/.sqlx/query-294b2d391d5cf01a2e756ae357869b9fb274d4254b479816b3892c9593f76b13.json b/src-tauri/.sqlx/query-98c6d082f2b635afa998eefa1624034d4babc9e3fd18236fd1c18e3c3abefd10.json similarity index 82% rename from src-tauri/.sqlx/query-294b2d391d5cf01a2e756ae357869b9fb274d4254b479816b3892c9593f76b13.json rename to src-tauri/.sqlx/query-98c6d082f2b635afa998eefa1624034d4babc9e3fd18236fd1c18e3c3abefd10.json index eef275ed..e2e2e173 100644 --- a/src-tauri/.sqlx/query-294b2d391d5cf01a2e756ae357869b9fb274d4254b479816b3892c9593f76b13.json +++ b/src-tauri/.sqlx/query-98c6d082f2b635afa998eefa1624034d4babc9e3fd18236fd1c18e3c3abefd10.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE id = $1;", + "query": "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE id = $1;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -56,7 +56,7 @@ { "name": "persistent_keep_alive", "ordinal": 10, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -106,5 +106,5 @@ true ] }, - "hash": "294b2d391d5cf01a2e756ae357869b9fb274d4254b479816b3892c9593f76b13" + "hash": "98c6d082f2b635afa998eefa1624034d4babc9e3fd18236fd1c18e3c3abefd10" } diff --git a/src-tauri/.sqlx/query-ccb326ab9b3ebd336c0fd9aed0da8e991f091f17e25583bd251347c207d8ff5c.json b/src-tauri/.sqlx/query-9d946237727089451a9bfc7ce2015d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a.json similarity index 75% rename from src-tauri/.sqlx/query-ccb326ab9b3ebd336c0fd9aed0da8e991f091f17e25583bd251347c207d8ff5c.json rename to src-tauri/.sqlx/query-9d946237727089451a9bfc7ce2015d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a.json index c61be6e5..fac4f5fc 100644 --- a/src-tauri/.sqlx/query-ccb326ab9b3ebd336c0fd9aed0da8e991f091f17e25583bd251347c207d8ff5c.json +++ b/src-tauri/.sqlx/query-9d946237727089451a9bfc7ce2015d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE id = $1;", + "query": "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE id = $1", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "instance_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -46,7 +46,7 @@ { "name": "network_id", "ordinal": 8, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -61,7 +61,7 @@ { "name": "keepalive_interval", "ordinal": 11, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { @@ -82,5 +82,5 @@ false ] }, - "hash": "ccb326ab9b3ebd336c0fd9aed0da8e991f091f17e25583bd251347c207d8ff5c" + "hash": "9d946237727089451a9bfc7ce2015d8b14eb0816c5c18cf81bb4a3b1c8e9aa6a" } diff --git a/src-tauri/.sqlx/query-a78fe32403d40abac3af1127bba0150e028179c78faf340ae3cd2f60b6c7e772.json b/src-tauri/.sqlx/query-a78fe32403d40abac3af1127bba0150e028179c78faf340ae3cd2f60b6c7e772.json new file mode 100644 index 00000000..0cd44182 --- /dev/null +++ b/src-tauri/.sqlx/query-a78fe32403d40abac3af1127bba0150e028179c78faf340ae3cd2f60b6c7e772.json @@ -0,0 +1,62 @@ +{ + "db_name": "SQLite", + "query": "WITH cte AS ( SELECT id, location_id, COALESCE(upload - LAG(upload) OVER (PARTITION BY location_id ORDER BY collected_at), 0) upload, COALESCE(download - LAG(download) OVER (PARTITION BY location_id ORDER BY collected_at), 0) download, last_handshake, strftime($1, collected_at) collected_at, listen_port, persistent_keepalive_interval FROM location_stats ORDER BY collected_at LIMIT -1 OFFSET 1 ) SELECT id, location_id, SUM(MAX(upload, 0)) \"upload!: i64\", SUM(MAX(download, 0)) \"download!: i64\", last_handshake, collected_at \"collected_at!: NaiveDateTime\", listen_port \"listen_port!: u32\", persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" FROM cte WHERE location_id = $2 AND collected_at >= $3 GROUP BY collected_at ORDER BY collected_at", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "location_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "upload!: i64", + "ordinal": 2, + "type_info": "Null" + }, + { + "name": "download!: i64", + "ordinal": 3, + "type_info": "Null" + }, + { + "name": "last_handshake", + "ordinal": 4, + "type_info": "Integer" + }, + { + "name": "collected_at!: NaiveDateTime", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "listen_port!: u32", + "ordinal": 6, + "type_info": "Integer" + }, + { + "name": "persistent_keepalive_interval?: u16", + "ordinal": 7, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + false, + false, + true, + true, + false, + true, + false, + true + ] + }, + "hash": "a78fe32403d40abac3af1127bba0150e028179c78faf340ae3cd2f60b6c7e772" +} diff --git a/src-tauri/.sqlx/query-999106a981d0e33990bb03479da7d594750c967d6d30c3da7ce0e56fb089ea06.json b/src-tauri/.sqlx/query-a9ca7a4f46ce92ab02a213479797b24e04caad767c088dd490dc38663494c22d.json similarity index 73% rename from src-tauri/.sqlx/query-999106a981d0e33990bb03479da7d594750c967d6d30c3da7ce0e56fb089ea06.json rename to src-tauri/.sqlx/query-a9ca7a4f46ce92ab02a213479797b24e04caad767c088dd490dc38663494c22d.json index 66f013e7..ce79c660 100644 --- a/src-tauri/.sqlx/query-999106a981d0e33990bb03479da7d594750c967d6d30c3da7ce0e56fb089ea06.json +++ b/src-tauri/.sqlx/query-a9ca7a4f46ce92ab02a213479797b24e04caad767c088dd490dc38663494c22d.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "UPDATE location SET instance_id = $1, name = $2, address = $3, pubkey = $4, endpoint = $5, allowed_ips = $6, dns = $7, network_id = $8, route_all_traffic = $9, mfa_enabled = $10, keepalive_interval = $11 WHERE id = $12;", + "query": "UPDATE location SET instance_id = $1, name = $2, address = $3, pubkey = $4, endpoint = $5, allowed_ips = $6, dns = $7, network_id = $8, route_all_traffic = $9, mfa_enabled = $10, keepalive_interval = $11 WHERE id = $12", "describe": { "columns": [], "parameters": { @@ -8,5 +8,5 @@ }, "nullable": [] }, - "hash": "999106a981d0e33990bb03479da7d594750c967d6d30c3da7ce0e56fb089ea06" + "hash": "a9ca7a4f46ce92ab02a213479797b24e04caad767c088dd490dc38663494c22d" } diff --git a/src-tauri/.sqlx/query-288899ef3160db5fba8a2e91a2580803a080daea4ab09cc67e7a492a5b3b2d3d.json b/src-tauri/.sqlx/query-abded0999cc848a4baaad2e57a3247e9d7c7062bc43c84d3405a19c94006b8f8.json similarity index 70% rename from src-tauri/.sqlx/query-288899ef3160db5fba8a2e91a2580803a080daea4ab09cc67e7a492a5b3b2d3d.json rename to src-tauri/.sqlx/query-abded0999cc848a4baaad2e57a3247e9d7c7062bc43c84d3405a19c94006b8f8.json index 8ecda192..5a0b6593 100644 --- a/src-tauri/.sqlx/query-288899ef3160db5fba8a2e91a2580803a080daea4ab09cc67e7a492a5b3b2d3d.json +++ b/src-tauri/.sqlx/query-abded0999cc848a4baaad2e57a3247e9d7c7062bc43c84d3405a19c94006b8f8.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO location_stats (location_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id;", + "query": "INSERT INTO location_stats (location_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 7 }, "nullable": [ - false + true ] }, - "hash": "288899ef3160db5fba8a2e91a2580803a080daea4ab09cc67e7a492a5b3b2d3d" + "hash": "abded0999cc848a4baaad2e57a3247e9d7c7062bc43c84d3405a19c94006b8f8" } diff --git a/src-tauri/.sqlx/query-aee2085be1fbcb527eb15059c07e37c97a45f123d0fd59029b13ac4488cbaf67.json b/src-tauri/.sqlx/query-aee2085be1fbcb527eb15059c07e37c97a45f123d0fd59029b13ac4488cbaf67.json index e03b7cc0..74b4ce43 100644 --- a/src-tauri/.sqlx/query-aee2085be1fbcb527eb15059c07e37c97a45f123d0fd59029b13ac4488cbaf67.json +++ b/src-tauri/.sqlx/query-aee2085be1fbcb527eb15059c07e37c97a45f123d0fd59029b13ac4488cbaf67.json @@ -6,7 +6,7 @@ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { diff --git a/src-tauri/.sqlx/query-368814ed137d486c51e412c386ccd82ebaa96f1d438388521b4761da5bb93ce4.json b/src-tauri/.sqlx/query-afab9e8172fcd2187e99f7222eb1394fbc68b54cf5ebf36764becbc42c89ad21.json similarity index 75% rename from src-tauri/.sqlx/query-368814ed137d486c51e412c386ccd82ebaa96f1d438388521b4761da5bb93ce4.json rename to src-tauri/.sqlx/query-afab9e8172fcd2187e99f7222eb1394fbc68b54cf5ebf36764becbc42c89ad21.json index 425a1789..8ab4e1e5 100644 --- a/src-tauri/.sqlx/query-368814ed137d486c51e412c386ccd82ebaa96f1d438388521b4761da5bb93ce4.json +++ b/src-tauri/.sqlx/query-afab9e8172fcd2187e99f7222eb1394fbc68b54cf5ebf36764becbc42c89ad21.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE instance_id = $1;", + "query": "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE pubkey = $1;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "instance_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -46,7 +46,7 @@ { "name": "network_id", "ordinal": 8, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -61,7 +61,7 @@ { "name": "keepalive_interval", "ordinal": 11, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { @@ -82,5 +82,5 @@ false ] }, - "hash": "368814ed137d486c51e412c386ccd82ebaa96f1d438388521b4761da5bb93ce4" + "hash": "afab9e8172fcd2187e99f7222eb1394fbc68b54cf5ebf36764becbc42c89ad21" } diff --git a/src-tauri/.sqlx/query-b130d533efa93e32e6c8288a19c001d5554b4a33fd0d48dbd2d3303aecb4fca2.json b/src-tauri/.sqlx/query-b130d533efa93e32e6c8288a19c001d5554b4a33fd0d48dbd2d3303aecb4fca2.json new file mode 100644 index 00000000..01f87578 --- /dev/null +++ b/src-tauri/.sqlx/query-b130d533efa93e32e6c8288a19c001d5554b4a33fd0d48dbd2d3303aecb4fca2.json @@ -0,0 +1,62 @@ +{ + "db_name": "SQLite", + "query": "WITH cte AS ( SELECT id, tunnel_id, COALESCE(upload - LAG(upload) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) upload, COALESCE(download - LAG(download) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) download, last_handshake, strftime($1, collected_at) collected_at, listen_port, persistent_keepalive_interval FROM tunnel_stats ORDER BY collected_at LIMIT -1 OFFSET 1 ) SELECT id, tunnel_id, SUM(MAX(upload, 0)) \"upload!: i64\", SUM(MAX(download, 0)) \"download!: i64\", last_handshake, collected_at \"collected_at!: NaiveDateTime\", listen_port \"listen_port!: u32\", persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" FROM cte WHERE tunnel_id = $2 AND collected_at >= $3 GROUP BY collected_at ORDER BY collected_at", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "tunnel_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "upload!: i64", + "ordinal": 2, + "type_info": "Null" + }, + { + "name": "download!: i64", + "ordinal": 3, + "type_info": "Null" + }, + { + "name": "last_handshake", + "ordinal": 4, + "type_info": "Integer" + }, + { + "name": "collected_at!: NaiveDateTime", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "listen_port!: u32", + "ordinal": 6, + "type_info": "Integer" + }, + { + "name": "persistent_keepalive_interval?: u16", + "ordinal": 7, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + false, + false, + true, + true, + false, + true, + false, + false + ] + }, + "hash": "b130d533efa93e32e6c8288a19c001d5554b4a33fd0d48dbd2d3303aecb4fca2" +} diff --git a/src-tauri/.sqlx/query-b994873e3036f8f7152d790b47b32e5422db84d0d110f2068419131947f07db3.json b/src-tauri/.sqlx/query-b994873e3036f8f7152d790b47b32e5422db84d0d110f2068419131947f07db3.json new file mode 100644 index 00000000..a02d7b3f --- /dev/null +++ b/src-tauri/.sqlx/query-b994873e3036f8f7152d790b47b32e5422db84d0d110f2068419131947f07db3.json @@ -0,0 +1,56 @@ +{ + "db_name": "SQLite", + "query": "SELECT c.id, c.tunnel_id, c.connected_from \"connected_from!\", c.start \"start!\", c.end \"end!\", COALESCE(( SELECT ls.upload FROM tunnel_stats ls WHERE ls.tunnel_id = c.tunnel_id AND ls.collected_at >= c.start AND ls.collected_at <= c.end ORDER BY ls.collected_at DESC LIMIT 1 ), 0) \"upload: _\", COALESCE(( SELECT ls.download FROM tunnel_stats ls WHERE ls.tunnel_id = c.tunnel_id AND ls.collected_at >= c.start AND ls.collected_at <= c.end ORDER BY ls.collected_at DESC LIMIT 1 ), 0) \"download: _\" FROM tunnel_connection c WHERE tunnel_id = $1 ORDER BY start DESC", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "tunnel_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "connected_from!", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "start!", + "ordinal": 3, + "type_info": "Datetime" + }, + { + "name": "end!", + "ordinal": 4, + "type_info": "Datetime" + }, + { + "name": "upload: _", + "ordinal": 5, + "type_info": "Integer" + }, + { + "name": "download: _", + "ordinal": 6, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "b994873e3036f8f7152d790b47b32e5422db84d0d110f2068419131947f07db3" +} diff --git a/src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json b/src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json new file mode 100644 index 00000000..a8ba1030 --- /dev/null +++ b/src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1;", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e" +} diff --git a/src-tauri/.sqlx/query-be25a82798d12394363f3379f2b966d29003dd126f4ac0f8c5236d00891b31c5.json b/src-tauri/.sqlx/query-be25a82798d12394363f3379f2b966d29003dd126f4ac0f8c5236d00891b31c5.json new file mode 100644 index 00000000..defb9b73 --- /dev/null +++ b/src-tauri/.sqlx/query-be25a82798d12394363f3379f2b966d29003dd126f4ac0f8c5236d00891b31c5.json @@ -0,0 +1,68 @@ +{ + "db_name": "SQLite", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance WHERE uuid = $1;", + "describe": { + "columns": [ + { + "name": "id: _", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "name", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "uuid", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "url", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "proxy_url", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "username", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "token?", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "disable_all_traffic", + "ordinal": 7, + "type_info": "Bool" + }, + { + "name": "enterprise_enabled", + "ordinal": 8, + "type_info": "Bool" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "be25a82798d12394363f3379f2b966d29003dd126f4ac0f8c5236d00891b31c5" +} diff --git a/src-tauri/.sqlx/query-99e819c9e4d77ea568cb60f07e49ca8c407ab7b15ac505968c66924df3563ff8.json b/src-tauri/.sqlx/query-c688e91a89197793b2a63dcefc41c652fc89286481300450763a7a9b66d146f9.json similarity index 53% rename from src-tauri/.sqlx/query-99e819c9e4d77ea568cb60f07e49ca8c407ab7b15ac505968c66924df3563ff8.json rename to src-tauri/.sqlx/query-c688e91a89197793b2a63dcefc41c652fc89286481300450763a7a9b66d146f9.json index e38d3947..b09e9828 100644 --- a/src-tauri/.sqlx/query-99e819c9e4d77ea568cb60f07e49ca8c407ab7b15ac505968c66924df3563ff8.json +++ b/src-tauri/.sqlx/query-c688e91a89197793b2a63dcefc41c652fc89286481300450763a7a9b66d146f9.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", name, uuid, url, proxy_url, username FROM instance WHERE id = $1;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance WHERE id = $1;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -32,6 +32,21 @@ "name": "username", "ordinal": 5, "type_info": "Text" + }, + { + "name": "token?", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "disable_all_traffic", + "ordinal": 7, + "type_info": "Bool" + }, + { + "name": "enterprise_enabled", + "ordinal": 8, + "type_info": "Bool" } ], "parameters": { @@ -43,8 +58,11 @@ false, false, false, + false, + true, + false, false ] }, - "hash": "99e819c9e4d77ea568cb60f07e49ca8c407ab7b15ac505968c66924df3563ff8" + "hash": "c688e91a89197793b2a63dcefc41c652fc89286481300450763a7a9b66d146f9" } diff --git a/src-tauri/.sqlx/query-d7e7897382881aa2f7633b86790d217b7e37fb90d7d343637bf7d00845fcfdf2.json b/src-tauri/.sqlx/query-d7e7897382881aa2f7633b86790d217b7e37fb90d7d343637bf7d00845fcfdf2.json index 89ac6282..dcb38f3a 100644 --- a/src-tauri/.sqlx/query-d7e7897382881aa2f7633b86790d217b7e37fb90d7d343637bf7d00845fcfdf2.json +++ b/src-tauri/.sqlx/query-d7e7897382881aa2f7633b86790d217b7e37fb90d7d343637bf7d00845fcfdf2.json @@ -6,7 +6,7 @@ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "theme", @@ -27,6 +27,11 @@ "name": "check_for_updates", "ordinal": 4, "type_info": "Bool" + }, + { + "name": "selected_view", + "ordinal": 5, + "type_info": "Text" } ], "parameters": { @@ -37,7 +42,8 @@ false, false, false, - false + false, + true ] }, "hash": "d7e7897382881aa2f7633b86790d217b7e37fb90d7d343637bf7d00845fcfdf2" diff --git a/src-tauri/.sqlx/query-db3aa093e5e74398f5b921ddb6e833962b82c95d4b98993264cb55f9e96c81c0.json b/src-tauri/.sqlx/query-db3aa093e5e74398f5b921ddb6e833962b82c95d4b98993264cb55f9e96c81c0.json new file mode 100644 index 00000000..eb12a208 --- /dev/null +++ b/src-tauri/.sqlx/query-db3aa093e5e74398f5b921ddb6e833962b82c95d4b98993264cb55f9e96c81c0.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, disable_all_traffic = $6, enterprise_enabled = $7, token = $8 WHERE id = $9;", + "describe": { + "columns": [], + "parameters": { + "Right": 9 + }, + "nullable": [] + }, + "hash": "db3aa093e5e74398f5b921ddb6e833962b82c95d4b98993264cb55f9e96c81c0" +} diff --git a/src-tauri/.sqlx/query-d5b66ca8ce77e041dacbd21493608350c2337834690cef9f89ef1906f31fd4c4.json b/src-tauri/.sqlx/query-db41fbabf52faec38ccb768a01a56df117d179fb4e52dfb9d5ff5be9b41518d8.json similarity index 54% rename from src-tauri/.sqlx/query-d5b66ca8ce77e041dacbd21493608350c2337834690cef9f89ef1906f31fd4c4.json rename to src-tauri/.sqlx/query-db41fbabf52faec38ccb768a01a56df117d179fb4e52dfb9d5ff5be9b41518d8.json index d1bfc6ac..bd65fdb5 100644 --- a/src-tauri/.sqlx/query-d5b66ca8ce77e041dacbd21493608350c2337834690cef9f89ef1906f31fd4c4.json +++ b/src-tauri/.sqlx/query-db41fbabf52faec38ccb768a01a56df117d179fb4e52dfb9d5ff5be9b41518d8.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO connection (location_id, connected_from, start, end) VALUES ($1, $2, $3, $4) RETURNING id;", + "query": "INSERT INTO connection (location_id, connected_from, start, end) VALUES ($1, $2, $3, $4) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 4 }, "nullable": [ - false + true ] }, - "hash": "d5b66ca8ce77e041dacbd21493608350c2337834690cef9f89ef1906f31fd4c4" + "hash": "db41fbabf52faec38ccb768a01a56df117d179fb4e52dfb9d5ff5be9b41518d8" } diff --git a/src-tauri/.sqlx/query-501754dcc5d012c155b1881f8f623ea7028fc6c0b4184d81a922c11d73779dd9.json b/src-tauri/.sqlx/query-deaba004e57c25d7d8cace0455a0cae78c3c8f3395a7e594aa696c4f63e55d5b.json similarity index 64% rename from src-tauri/.sqlx/query-501754dcc5d012c155b1881f8f623ea7028fc6c0b4184d81a922c11d73779dd9.json rename to src-tauri/.sqlx/query-deaba004e57c25d7d8cace0455a0cae78c3c8f3395a7e594aa696c4f63e55d5b.json index dc70e769..3dfa6818 100644 --- a/src-tauri/.sqlx/query-501754dcc5d012c155b1881f8f623ea7028fc6c0b4184d81a922c11d73779dd9.json +++ b/src-tauri/.sqlx/query-deaba004e57c25d7d8cace0455a0cae78c3c8f3395a7e594aa696c4f63e55d5b.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", instance_id, pubkey, prvkey FROM wireguard_keys WHERE instance_id = $1;", + "query": "SELECT id \"id: _\", instance_id, pubkey, prvkey FROM wireguard_keys WHERE instance_id = $1", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "instance_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "pubkey", @@ -34,5 +34,5 @@ false ] }, - "hash": "501754dcc5d012c155b1881f8f623ea7028fc6c0b4184d81a922c11d73779dd9" + "hash": "deaba004e57c25d7d8cace0455a0cae78c3c8f3395a7e594aa696c4f63e55d5b" } diff --git a/src-tauri/.sqlx/query-ba6d72e4ed26ebce7f1c1aa8147d81a7011ca163d2511fdebf95d8cb79c17d7a.json b/src-tauri/.sqlx/query-e034dbe839ed5cd19a8430ac5786e68ace8457b4983724957092db618b2535d4.json similarity index 66% rename from src-tauri/.sqlx/query-ba6d72e4ed26ebce7f1c1aa8147d81a7011ca163d2511fdebf95d8cb79c17d7a.json rename to src-tauri/.sqlx/query-e034dbe839ed5cd19a8430ac5786e68ace8457b4983724957092db618b2535d4.json index 82ce3e98..0e926b52 100644 --- a/src-tauri/.sqlx/query-ba6d72e4ed26ebce7f1c1aa8147d81a7011ca163d2511fdebf95d8cb79c17d7a.json +++ b/src-tauri/.sqlx/query-e034dbe839ed5cd19a8430ac5786e68ace8457b4983724957092db618b2535d4.json @@ -1,20 +1,20 @@ { "db_name": "SQLite", - "query": "INSERT INTO location (instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id;", + "query": "INSERT INTO location (instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id \"id!\"", "describe": { "columns": [ { - "name": "id", + "name": "id!", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" } ], "parameters": { "Right": 11 }, "nullable": [ - false + true ] }, - "hash": "ba6d72e4ed26ebce7f1c1aa8147d81a7011ca163d2511fdebf95d8cb79c17d7a" + "hash": "e034dbe839ed5cd19a8430ac5786e68ace8457b4983724957092db618b2535d4" } diff --git a/src-tauri/.sqlx/query-44a0d1740d6a566f55faf25f4839aaf3d6dd41baa587381c50b0387e1a707938.json b/src-tauri/.sqlx/query-e143c6df30e53bdc954cc14636ed5b0afed84e572ef3e514212fa1b4cf8ccff2.json similarity index 51% rename from src-tauri/.sqlx/query-44a0d1740d6a566f55faf25f4839aaf3d6dd41baa587381c50b0387e1a707938.json rename to src-tauri/.sqlx/query-e143c6df30e53bdc954cc14636ed5b0afed84e572ef3e514212fa1b4cf8ccff2.json index 1e9d13e8..0d5c793b 100644 --- a/src-tauri/.sqlx/query-44a0d1740d6a566f55faf25f4839aaf3d6dd41baa587381c50b0387e1a707938.json +++ b/src-tauri/.sqlx/query-e143c6df30e53bdc954cc14636ed5b0afed84e572ef3e514212fa1b4cf8ccff2.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "INSERT INTO settings (log_level, theme, tray_icon_theme, check_for_updates) VALUES ($1, $2, $3, $4);", + "query": "INSERT INTO settings (log_level, theme, tray_icon_theme, check_for_updates, selected_view) VALUES ($1, $2, $3, $4, $5);", "describe": { "columns": [], "parameters": { - "Right": 4 + "Right": 5 }, "nullable": [] }, - "hash": "44a0d1740d6a566f55faf25f4839aaf3d6dd41baa587381c50b0387e1a707938" + "hash": "e143c6df30e53bdc954cc14636ed5b0afed84e572ef3e514212fa1b4cf8ccff2" } diff --git a/src-tauri/.sqlx/query-19c18356163baa6db88272f09d83768b2658406575d325fb273f152fe15465c4.json b/src-tauri/.sqlx/query-e584f3f1c8cfa7c840907612b632b6d3641667119ee0f817cc510f12ee9643bd.json similarity index 67% rename from src-tauri/.sqlx/query-19c18356163baa6db88272f09d83768b2658406575d325fb273f152fe15465c4.json rename to src-tauri/.sqlx/query-e584f3f1c8cfa7c840907612b632b6d3641667119ee0f817cc510f12ee9643bd.json index 7bfb0211..65971bad 100644 --- a/src-tauri/.sqlx/query-19c18356163baa6db88272f09d83768b2658406575d325fb273f152fe15465c4.json +++ b/src-tauri/.sqlx/query-e584f3f1c8cfa7c840907612b632b6d3641667119ee0f817cc510f12ee9643bd.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "\n SELECT id, tunnel_id, connected_from, start, end \n FROM tunnel_connection\n WHERE tunnel_id = $1\n ", + "query": "SELECT id, tunnel_id, connected_from, start, end FROM tunnel_connection WHERE tunnel_id = $1", "describe": { "columns": [ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "tunnel_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "connected_from", @@ -40,5 +40,5 @@ false ] }, - "hash": "19c18356163baa6db88272f09d83768b2658406575d325fb273f152fe15465c4" + "hash": "e584f3f1c8cfa7c840907612b632b6d3641667119ee0f817cc510f12ee9643bd" } diff --git a/src-tauri/.sqlx/query-5476f3c222bfd9a65ec67af7f7224f0ca29a6ed2a9c328b2232c9cd90f0b3c04.json b/src-tauri/.sqlx/query-e84763c1777a1e43655b1faba5c42c98246ccc4b567f869140d859b3e196f46e.json similarity index 64% rename from src-tauri/.sqlx/query-5476f3c222bfd9a65ec67af7f7224f0ca29a6ed2a9c328b2232c9cd90f0b3c04.json rename to src-tauri/.sqlx/query-e84763c1777a1e43655b1faba5c42c98246ccc4b567f869140d859b3e196f46e.json index 45053f26..1055d5fd 100644 --- a/src-tauri/.sqlx/query-5476f3c222bfd9a65ec67af7f7224f0ca29a6ed2a9c328b2232c9cd90f0b3c04.json +++ b/src-tauri/.sqlx/query-e84763c1777a1e43655b1faba5c42c98246ccc4b567f869140d859b3e196f46e.json @@ -1,17 +1,17 @@ { "db_name": "SQLite", - "query": "\n SELECT id, tunnel_id, connected_from, start, end\n FROM tunnel_connection\n WHERE tunnel_id = $1\n ORDER BY end DESC\n LIMIT 1\n ", + "query": "SELECT id, tunnel_id, connected_from, start, end FROM tunnel_connection WHERE tunnel_id = $1 ORDER BY end DESC LIMIT 1", "describe": { "columns": [ { "name": "id", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "tunnel_id", "ordinal": 1, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "connected_from", @@ -40,5 +40,5 @@ false ] }, - "hash": "5476f3c222bfd9a65ec67af7f7224f0ca29a6ed2a9c328b2232c9cd90f0b3c04" + "hash": "e84763c1777a1e43655b1faba5c42c98246ccc4b567f869140d859b3e196f46e" } diff --git a/src-tauri/.sqlx/query-ea81679acb33913c851077e7a2681479f26da26e445a636d7cf6690a9d7a720f.json b/src-tauri/.sqlx/query-ea81679acb33913c851077e7a2681479f26da26e445a636d7cf6690a9d7a720f.json deleted file mode 100644 index 1000983d..00000000 --- a/src-tauri/.sqlx/query-ea81679acb33913c851077e7a2681479f26da26e445a636d7cf6690a9d7a720f.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT last_handshake, listen_port as \"listen_port!: u32\",\n persistent_keepalive_interval as \"persistent_keepalive_interval?: u16\"\n FROM tunnel_stats\n WHERE tunnel_id = $1 ORDER BY collected_at DESC LIMIT 1\n ", - "describe": { - "columns": [ - { - "name": "last_handshake", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "listen_port!: u32", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "persistent_keepalive_interval?: u16", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "ea81679acb33913c851077e7a2681479f26da26e445a636d7cf6690a9d7a720f" -} diff --git a/src-tauri/.sqlx/query-f0851883988e5cdf219b90562f2014713157173b1c8e9f3f3ad81c10ff674744.json b/src-tauri/.sqlx/query-f0851883988e5cdf219b90562f2014713157173b1c8e9f3f3ad81c10ff674744.json deleted file mode 100644 index 97ee8817..00000000 --- a/src-tauri/.sqlx/query-f0851883988e5cdf219b90562f2014713157173b1c8e9f3f3ad81c10ff674744.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n SELECT last_handshake, listen_port as \"listen_port!: u32\",\n persistent_keepalive_interval as \"persistent_keepalive_interval?: u16\"\n FROM location_stats\n WHERE location_id = $1 ORDER BY collected_at DESC LIMIT 1\n ", - "describe": { - "columns": [ - { - "name": "last_handshake", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "listen_port!: u32", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "persistent_keepalive_interval?: u16", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - true - ] - }, - "hash": "f0851883988e5cdf219b90562f2014713157173b1c8e9f3f3ad81c10ff674744" -} diff --git a/src-tauri/.sqlx/query-25e253a71c188be173e3dce3c640e3028e88be06d10c112e4b4a16b1599f8657.json b/src-tauri/.sqlx/query-f76a3953576d685d4057541b04aabfafdb61c86b0e9486ff0561a7bd80fd6ba8.json similarity index 82% rename from src-tauri/.sqlx/query-25e253a71c188be173e3dce3c640e3028e88be06d10c112e4b4a16b1599f8657.json rename to src-tauri/.sqlx/query-f76a3953576d685d4057541b04aabfafdb61c86b0e9486ff0561a7bd80fd6ba8.json index 278bb272..5f109398 100644 --- a/src-tauri/.sqlx/query-25e253a71c188be173e3dce3c640e3028e88be06d10c112e4b4a16b1599f8657.json +++ b/src-tauri/.sqlx/query-f76a3953576d685d4057541b04aabfafdb61c86b0e9486ff0561a7bd80fd6ba8.json @@ -1,12 +1,12 @@ { "db_name": "SQLite", - "query": "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel;", + "query": "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel;", "describe": { "columns": [ { - "name": "id?", + "name": "id: _", "ordinal": 0, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "name", @@ -56,7 +56,7 @@ { "name": "persistent_keep_alive", "ordinal": 10, - "type_info": "Int64" + "type_info": "Integer" }, { "name": "route_all_traffic", @@ -106,5 +106,5 @@ true ] }, - "hash": "25e253a71c188be173e3dce3c640e3028e88be06d10c112e4b4a16b1599f8657" + "hash": "f76a3953576d685d4057541b04aabfafdb61c86b0e9486ff0561a7bd80fd6ba8" } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b2d0c45c..2a280aa1 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,38 +4,37 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.12", "once_cell", "version_check", "zerocopy", @@ -43,9 +42,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -67,9 +66,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -88,47 +87,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -136,34 +136,34 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arboard" -version = "3.3.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafb29b107435aa276664c1db8954ac27a6e105cdad3c88287a199eb0e313c08" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" dependencies = [ "clipboard-win", - "core-graphics", - "image", + "core-graphics 0.23.2", + "image 0.25.2", "log", - "objc", - "objc-foundation", - "objc_id", + "objc2", + "objc2-app-kit", + "objc2-foundation", "parking_lot", - "thiserror", - "winapi", + "windows-sys 0.48.0", + "wl-clipboard-rs", "x11rb", ] [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-broadcast" @@ -175,14 +175,25 @@ dependencies = [ "futures-core", ] +[[package]] +name = "async-broadcast" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-channel" -version = "2.1.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 4.0.3", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -190,15 +201,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.8.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.1.1", + "futures-lite 2.3.0", "slab", ] @@ -214,6 +224,17 @@ dependencies = [ "futures-lite 1.13.0", ] +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock 3.4.0", + "blocking", + "futures-lite 2.3.0", +] + [[package]] name = "async-io" version = "1.13.0" @@ -236,21 +257,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "parking", - "polling 3.3.1", - "rustix 0.38.28", + "polling 3.7.3", + "rustix 0.38.37", "slab", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -264,11 +285,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -286,44 +307,63 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.28", + "rustix 0.38.37", "windows-sys 0.48.0", ] +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io 2.3.4", + "async-lock 3.4.0", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.3.1", + "futures-lite 2.3.0", + "rustix 0.38.37", + "tracing", +] + [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.2.2", - "async-lock 2.8.0", + "async-io 2.3.4", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.28", + "rustix 0.38.37", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -332,30 +372,30 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -379,7 +419,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -397,37 +437,26 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atomic-write-file" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" -dependencies = [ - "nix 0.27.1", - "rand 0.8.5", -] - [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.6.20" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", - "itoa 1.0.10", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "itoa 1.0.11", "matchit", "memchr", "mime", @@ -435,42 +464,45 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 1.0.1", + "tower 0.5.1", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", ] [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -481,9 +513,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" @@ -514,9 +546,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -548,51 +580,57 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "borsh" -version = "1.3.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" dependencies = [ "borsh-derive", - "cfg_aliases", + "cfg_aliases 0.2.1", ] [[package]] name = "borsh-derive" -version = "1.3.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" dependencies = [ "once_cell", - "proc-macro-crate 3.0.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", "syn_derive", ] [[package]] name = "brotli" -version = "3.4.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -601,9 +639,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -611,9 +649,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", "serde", @@ -621,15 +659,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-unit" -version = "5.1.3" +version = "5.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbda27216be70d08546aa506cecabce0c5eb0d494aaaedbd7ec82c8ae1a60b46" +checksum = "33ac19bdf0b2665407c39d82dbc937e951e7e2001609f0fb32edd0af45a2d63e" dependencies = [ "rust_decimal", "serde", @@ -638,9 +676,9 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -649,9 +687,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -660,9 +698,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] name = "byteorder" @@ -670,11 +708,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -700,7 +744,7 @@ checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -715,11 +759,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ + "jobserver", "libc", + "shlex", ] [[package]] @@ -750,9 +796,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.6" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -770,11 +816,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -782,14 +834,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "clap" -version = "4.4.14" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ "clap_builder", "clap_derive", @@ -797,9 +849,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", @@ -809,31 +861,29 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clipboard-win" -version = "4.5.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" dependencies = [ "error-code", - "str-buf", - "winapi", ] [[package]] @@ -845,9 +895,9 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation", - "core-graphics", - "foreign-types", + "core-foundation 0.9.4", + "core-graphics 0.22.3", + "foreign-types 0.3.2", "libc", "objc", ] @@ -860,7 +910,7 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation", + "core-foundation 0.9.4", "core-graphics-types", "libc", "objc", @@ -874,15 +924,15 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -890,9 +940,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -905,9 +955,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const-random" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] @@ -918,7 +968,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -939,11 +989,21 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -952,9 +1012,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types 0.5.0", "libc", ] @@ -965,24 +1038,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -995,18 +1068,18 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1041,9 +1114,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1085,30 +1158,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "ctor" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "fiat-crypto", - "platforms", "rustc_version", "subtle", "zeroize", @@ -1122,14 +1194,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "dark-light" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62007a65515b3cd88c733dd3464431f05d2ad066999a824259d8edc3cf6f645" +checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" dependencies = [ "dconf_rs", "detect-desktop-environment", @@ -1138,15 +1210,14 @@ dependencies = [ "rust-ini 0.18.0", "web-sys", "winreg 0.10.1", - "zbus", - "zvariant", + "zbus 4.4.0", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1154,27 +1225,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -1185,7 +1256,7 @@ checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" [[package]] name = "defguard-client" -version = "0.4.1" +version = "1.0.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -1197,13 +1268,13 @@ dependencies = [ "lazy_static", "local-ip-address", "log", - "nix 0.28.0", - "notify-debouncer-mini", + "nix 0.29.0", "prost", "prost-build", "rand 0.8.5", - "reqwest", - "rust-ini 0.20.0", + "regex", + "reqwest 0.12.8", + "rust-ini 0.21.1", "serde", "serde_json", "serde_with", @@ -1216,6 +1287,7 @@ dependencies = [ "tauri-plugin-single-instance", "tauri-plugin-window-state", "thiserror", + "time", "tokio", "tokio-util", "tonic", @@ -1223,15 +1295,18 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", + "vergen-git2", "webbrowser", + "widestring 0.4.3", + "winapi", "windows-service", "x25519-dalek", ] [[package]] name = "defguard_wireguard_rs" -version = "0.4.5" -source = "git+https://github.com/DefGuard/wireguard-rs.git?rev=v0.4.5#35345d54e7426f2678ad120378d59cf642acce5d" +version = "0.5.5" +source = "git+https://github.com/DefGuard/wireguard-rs.git?rev=v0.5.5#fbb88ee2296121459ab17985857915b680ade8a4" dependencies = [ "base64 0.22.1", "libc", @@ -1242,16 +1317,16 @@ dependencies = [ "netlink-packet-utils", "netlink-packet-wireguard", "netlink-sys", - "nix 0.28.0", + "nix 0.29.0", "serde", "thiserror", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -1279,17 +1354,59 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive-new" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "derive_builder" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" +dependencies = [ + "derive_builder_core", + "syn 2.0.79", +] + [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -1378,6 +1495,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.5", +] + [[package]] name = "dlv-list" version = "0.3.0" @@ -1399,6 +1525,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dtoa" version = "1.0.9" @@ -1407,40 +1539,40 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "dtoa-short" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" dependencies = [ "dtoa", ] [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] [[package]] name = "embed-resource" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bde55e389bea6a966bd467ad1ad7da0ae14546a5bc794d16d1e55e7fca44881" +checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.8", + "toml 0.8.19", "vswhom", - "winreg 0.51.0", + "winreg 0.52.0", ] [[package]] @@ -1451,18 +1583,24 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + [[package]] name = "enumflags2" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1470,13 +1608,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -1487,9 +1625,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1497,13 +1635,9 @@ dependencies = [ [[package]] name = "error-code" -version = "2.3.1" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" -dependencies = [ - "libc", - "str-buf", -] +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "etcetera" @@ -1535,9 +1669,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1546,11 +1680,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1565,15 +1699,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] @@ -1589,9 +1723,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "field-offset" @@ -1599,28 +1733,22 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset 0.9.1", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "fixedbitset" version = "0.4.2" @@ -1629,14 +1757,23 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "flume" version = "0.11.0" @@ -1645,7 +1782,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -1660,7 +1797,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -1669,6 +1827,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1678,15 +1842,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - [[package]] name = "funty" version = "2.0.0" @@ -1705,9 +1860,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1715,15 +1870,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1743,9 +1898,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1764,11 +1919,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.1.1", "futures-core", "futures-io", "parking", @@ -1777,32 +1932,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", @@ -1863,7 +2018,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -1880,7 +2035,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -1894,7 +2049,7 @@ dependencies = [ "gobject-sys", "libc", "pkg-config", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -1906,7 +2061,7 @@ dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", "x11", ] @@ -1935,12 +2090,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.3.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ "libc", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -1956,9 +2111,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1967,9 +2122,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" @@ -1997,10 +2152,23 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", "winapi", ] +[[package]] +name = "git2" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +dependencies = [ + "bitflags 2.6.0", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glib" version = "0.15.12" @@ -2043,7 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -2054,15 +2222,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -2073,7 +2241,7 @@ checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -2114,7 +2282,7 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -2133,17 +2301,36 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b553656127a00601c8ae5590fcfdc118e4083a7924b6cf4ffc1ea4b99dc429d7" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.1.0", + "http 0.2.12", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2156,26 +2343,32 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2192,15 +2385,24 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -2251,13 +2453,24 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", - "itoa 1.0.10", + "itoa 1.0.11", ] [[package]] @@ -2267,7 +2480,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2279,9 +2515,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2291,38 +2527,77 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.10", + "itoa 1.0.11", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.7", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa 1.0.11", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-timeout" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" dependencies = [ - "hyper", + "hyper 1.4.1", + "hyper-util", "pin-project-lite", "tokio", - "tokio-io-timeout", + "tower-service", ] [[package]] @@ -2332,17 +2607,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.30", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2389,15 +2699,15 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.8", "same-file", "walkdir", "winapi-util", @@ -2405,14 +2715,24 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", + "num-traits", +] + +[[package]] +name = "image" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +dependencies = [ + "bytemuck", + "byteorder-lite", "num-traits", "png", "tiff", @@ -2431,24 +2751,15 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.15.0", "serde", ] -[[package]] -name = "infer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f178e61cdbfe084aa75a2f4f7a25a5bb09701a47ae1753608f194b15783c937a" -dependencies = [ - "cfb", -] - [[package]] name = "infer" version = "0.13.0" @@ -2458,31 +2769,11 @@ dependencies = [ "cfb", ] -[[package]] -name = "inotify" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2493,31 +2784,28 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] -name = "itertools" -version = "0.11.0" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2530,9 +2818,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "javascriptcore-rs" @@ -2593,6 +2881,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" @@ -2601,43 +2898,34 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] [[package]] name = "json-patch" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ + "jsonptr", "serde", "serde_json", "thiserror", - "treediff", -] - -[[package]] -name = "kqueue" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" -dependencies = [ - "kqueue-sys", - "libc", ] [[package]] -name = "kqueue-sys" -version = "1.0.4" +name = "jsonptr" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" dependencies = [ - "bitflags 1.3.2", - "libc", + "fluent-uri", + "serde", + "serde_json", ] [[package]] @@ -2655,11 +2943,11 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] @@ -2682,15 +2970,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa" dependencies = [ "gtk-sys", - "libloading", + "libloading 0.7.4", "once_cell", ] [[package]] name = "libc" -version = "0.2.154" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libgit2-sys" +version = "0.17.0+1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] [[package]] name = "libloading" @@ -2702,6 +3002,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.8" @@ -2710,20 +3020,20 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "libc", "redox_syscall", ] [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -2731,12 +3041,15 @@ dependencies = [ ] [[package]] -name = "line-wrap" -version = "0.1.1" +name = "libz-sys" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ - "safemem", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] @@ -2747,27 +3060,27 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "local-ip-address" -version = "0.5.6" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66357e687a569abca487dc399a9c9ac19beb3f13991ed49f00c144e02cbd42ab" +checksum = "3669cf5561f8d27e8fc84cc15e58350e70f557d4d65f70e3154e54cd2f8e1782" dependencies = [ "libc", "neli", "thiserror", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2775,9 +3088,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" dependencies = [ "value-bag", ] @@ -2859,9 +3172,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -2874,9 +3187,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2895,39 +3208,38 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "mio" -version = "0.8.10" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "multimap" -version = "0.8.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -3017,14 +3329,15 @@ dependencies = [ [[package]] name = "netlink-packet-route" -version = "0.17.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +checksum = "55e5bda7ca0f9ac5e75b5debac3b75e29a8ac8e2171106a2c3bb466389a8dd83" dependencies = [ "anyhow", - "bitflags 1.3.2", + "bitflags 2.6.0", "byteorder", "libc", + "log", "netlink-packet-core", "netlink-packet-utils", ] @@ -3068,9 +3381,9 @@ dependencies = [ [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" @@ -3086,26 +3399,27 @@ dependencies = [ [[package]] name = "nix" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if", + "cfg_aliases 0.1.1", "libc", ] [[package]] name = "nix" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.2.1", "libc", - "memoffset 0.9.0", + "memoffset 0.9.1", ] [[package]] @@ -3125,40 +3439,10 @@ dependencies = [ ] [[package]] -name = "notify" -version = "6.1.1" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" -dependencies = [ - "bitflags 2.4.1", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "walkdir", - "windows-sys 0.48.0", -] - -[[package]] -name = "notify-debouncer-mini" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d40b221972a1fc5ef4d858a2f671fb34c75983eb385463dff3780eeff6a9d43" -dependencies = [ - "crossbeam-channel", - "log", - "notify", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", "winapi", @@ -3189,30 +3473,18 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -3221,24 +3493,14 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.5.11" @@ -3262,9 +3524,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -3290,6 +3552,105 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -3310,28 +3671,28 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -3346,7 +3707,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -3357,18 +3718,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.2.1+3.2.0" +version = "300.3.2+3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3" +checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -3395,12 +3756,12 @@ dependencies = [ [[package]] name = "ordered-multimap" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d6a8c22fc714f0c2373e6091bf6f5e9b37b1bc0b1184874b7e0a4e303d318f" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ "dlv-list 0.5.2", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -3413,6 +3774,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "os_pipe" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "overload" version = "0.1.1" @@ -3441,20 +3812,20 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3462,22 +3833,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem-rfc7468" @@ -3496,12 +3867,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.6.0", ] [[package]] @@ -3608,7 +3979,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -3640,29 +4011,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3672,12 +4043,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.1", "futures-io", ] @@ -3704,35 +4075,28 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" - -[[package]] -name = "platforms" -version = "3.3.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plist" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ - "base64 0.21.6", - "indexmap 2.1.0", - "line-wrap", - "quick-xml", + "base64 0.22.1", + "indexmap 2.6.0", + "quick-xml 0.32.0", "serde", "time", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3759,16 +4123,17 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.1" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.28", + "rustix 0.38.37", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3779,9 +4144,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3791,12 +4159,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -3811,11 +4179,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.22.22", ] [[package]] @@ -3850,18 +4218,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.12.3" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" dependencies = [ "bytes", "prost-derive", @@ -3869,13 +4237,13 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.3" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" dependencies = [ "bytes", - "heck 0.4.1", - "itertools 0.11.0", + "heck 0.5.0", + "itertools", "log", "multimap", "once_cell", @@ -3884,29 +4252,28 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.48", + "syn 2.0.79", "tempfile", - "which", ] [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "prost-types" -version = "0.12.3" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" dependencies = [ "prost", ] @@ -3933,18 +4300,27 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -4015,7 +4391,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", ] [[package]] @@ -4044,34 +4420,34 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -4085,13 +4461,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.5", ] [[package]] @@ -4102,35 +4478,35 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -4139,10 +4515,12 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "system-configuration", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", "tokio", "tokio-native-tls", "tokio-util", @@ -4155,6 +4533,49 @@ dependencies = [ "winreg 0.50.0", ] +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + [[package]] name = "rfd" version = "0.10.0" @@ -4179,11 +4600,26 @@ dependencies = [ "windows 0.37.0", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rkyv" -version = "0.7.43" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", @@ -4199,9 +4635,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.43" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", @@ -4240,19 +4676,20 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a" +checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" dependencies = [ "cfg-if", - "ordered-multimap 0.7.1", + "ordered-multimap 0.7.3", + "trim-in-place", ] [[package]] name = "rust_decimal" -version = "1.33.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", "borsh", @@ -4266,15 +4703,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] @@ -4295,34 +4732,76 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.12", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] [[package]] -name = "rustversion" -version = "1.0.14" +name = "rustls" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] [[package]] -name = "ryu" -version = "1.0.16" +name = "rustls-pemfile" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] [[package]] -name = "safemem" -version = "0.3.3" +name = "rustls-pki-types" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -4335,11 +4814,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4362,12 +4841,12 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", @@ -4375,9 +4854,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -4405,60 +4884,62 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.195" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ - "itoa 1.0.10", + "indexmap 2.6.0", + "itoa 1.0.11", + "memchr", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4470,23 +4951,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.10", + "itoa 1.0.11", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.5.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58c3a1b3e418f61c25b2aeb43fc6c95eaa252b8cecdda67f401943e9e08d33f" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.21.6", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.6.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -4494,21 +4976,21 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.5.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2068b437a31fc68f25dd7edc296b078f04b45145c199d8eed9866e45f1ff274" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -4517,13 +4999,13 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -4567,11 +5049,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4594,9 +5082,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" @@ -4615,9 +5103,12 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -4631,12 +5122,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4667,12 +5158,6 @@ dependencies = [ "system-deps 5.0.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -4694,20 +5179,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ - "itertools 0.12.0", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4718,28 +5202,27 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ - "ahash 0.8.7", "atoi", "byteorder", "bytes", "chrono", "crc", "crossbeam-queue", - "dotenvy", "either", - "event-listener 2.5.3", + "event-listener 5.3.1", "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", + "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.1.0", + "indexmap 2.6.0", "log", "memchr", "once_cell", @@ -4760,27 +5243,26 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ - "atomic-write-file", "dotenvy", "either", - "heck 0.4.1", + "heck 0.5.0", "hex", "once_cell", "proc-macro2", @@ -4792,7 +5274,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.79", "tempfile", "tokio", "url", @@ -4800,13 +5282,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", - "base64 0.21.6", - "bitflags 2.4.1", + "base64 0.22.1", + "bitflags 2.6.0", "byteorder", "bytes", "chrono", @@ -4822,7 +5304,7 @@ dependencies = [ "hex", "hkdf", "hmac", - "itoa 1.0.10", + "itoa 1.0.11", "log", "md-5", "memchr", @@ -4844,13 +5326,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64 0.21.6", - "bitflags 2.4.1", + "base64 0.22.1", + "bitflags 2.6.0", "byteorder", "chrono", "crc", @@ -4864,7 +5346,7 @@ dependencies = [ "hkdf", "hmac", "home", - "itoa 1.0.10", + "itoa 1.0.11", "log", "md-5", "memchr", @@ -4872,7 +5354,6 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", @@ -4885,9 +5366,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", "chrono", @@ -4901,10 +5382,10 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", "tracing", "url", - "urlencoding", "uuid", ] @@ -4929,12 +5410,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - [[package]] name = "string_cache" version = "0.8.7" @@ -4963,20 +5438,20 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "struct-patch" @@ -4995,36 +5470,36 @@ checksum = "f14a349c27ebe59faba22f933c9c734d428da7231e88a247e9d8c61eea964ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -5039,9 +5514,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -5057,7 +5532,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -5066,6 +5541,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -5073,8 +5557,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", ] [[package]] @@ -5087,6 +5582,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "5.0.0" @@ -5102,29 +5607,29 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.15.6", - "heck 0.4.1", + "cfg-expr 0.15.8", + "heck 0.5.0", "pkg-config", - "toml 0.8.8", - "version-compare 0.1.1", + "toml 0.8.19", + "version-compare 0.2.0", ] [[package]] name = "tao" -version = "0.16.5" +version = "0.16.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f5aefd6be4cd3ad3f047442242fd9f57cbfb3e565379f66b5e14749364fa4f" +checksum = "48d298c441a1da46e28e8ad8ec205aab7fd8cd71b9d10e05454224eef422e1ae" dependencies = [ "bitflags 1.3.2", "cairo-rs", "cc", "cocoa", - "core-foundation", - "core-graphics", + "core-foundation 0.9.4", + "core-graphics 0.22.3", "crossbeam-channel", "dirs-next", "dispatch", @@ -5137,7 +5642,7 @@ dependencies = [ "glib", "glib-sys", "gtk", - "image", + "image 0.24.9", "instant", "jni 0.20.0", "lazy_static", @@ -5164,13 +5669,13 @@ dependencies = [ [[package]] name = "tao-macros" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -5181,9 +5686,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" dependencies = [ "filetime", "libc", @@ -5192,38 +5697,43 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "1.5.4" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af" +checksum = "570a20223602ad990a30a048f2fdb957ae3e38de3ca9582e04cc09d01e8ccfad" dependencies = [ "anyhow", "bytes", "cocoa", "dirs-next", + "dunce", "embed_plist", "encoding_rs", "flate2", "futures-util", + "getrandom 0.2.15", "glib", "glob", "gtk", - "heck 0.4.1", - "http", + "heck 0.5.0", + "http 0.2.12", "ignore", - "infer 0.9.0", + "indexmap 1.9.3", + "infer", + "log", "objc", "once_cell", "percent-encoding", + "plist", "png", "rand 0.8.5", "raw-window-handle", - "reqwest", + "reqwest 0.11.27", "rfd", "semver", "serde", @@ -5248,14 +5758,14 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.5.1" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" +checksum = "586f3e677f940c8bb4f70c52eda05dc59b79e61543f1182de83516810bb8e35d" dependencies = [ "anyhow", "cargo_toml", "dirs-next", - "heck 0.4.1", + "heck 0.5.0", "json-patch", "semver", "serde", @@ -5267,11 +5777,11 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" +checksum = "93a9e3f5cebf779a63bf24903e714ec91196c307d8249a0008b882424328bcda" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "brotli", "ico", "json-patch", @@ -5292,11 +5802,11 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.4.3" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" +checksum = "d1d0e989f54fe06c5ef0875c5e19cf96453d099a0a774d5192ab47e80471cdab" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 1.0.109", @@ -5307,7 +5817,7 @@ dependencies = [ [[package]] name = "tauri-plugin-log" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#8cd4a39864986ae3600be9f23d089afd3988c43a" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#0b59bc7096dfc7ff1b141c31457a2a0a4a5f9ad1" dependencies = [ "byte-unit", "fern", @@ -5322,24 +5832,24 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#8cd4a39864986ae3600be9f23d089afd3988c43a" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#0b59bc7096dfc7ff1b141c31457a2a0a4a5f9ad1" dependencies = [ "log", "serde", "serde_json", "tauri", "thiserror", - "windows-sys 0.52.0", - "zbus", + "windows-sys 0.59.0", + "zbus 3.15.2", ] [[package]] name = "tauri-plugin-window-state" version = "0.1.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#8cd4a39864986ae3600be9f23d089afd3988c43a" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#0b59bc7096dfc7ff1b141c31457a2a0a4a5f9ad1" dependencies = [ "bincode", - "bitflags 2.4.1", + "bitflags 2.6.0", "log", "serde", "serde_json", @@ -5349,12 +5859,12 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" +checksum = "f33fda7d213e239077fad52e96c6b734cecedb30c2382118b64f94cb5103ff3a" dependencies = [ "gtk", - "http", + "http 0.2.12", "http-range", "rand 0.8.5", "raw-window-handle", @@ -5370,9 +5880,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.3" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158" +checksum = "18c447dcd9b0f09c7dc4b752cc33e72788805bfd761fbda5692d30c48289efec" dependencies = [ "arboard", "cocoa", @@ -5391,17 +5901,17 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.5.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db" +checksum = "83a0c939e88d82903a0a7dfb28388b12a3c03504d6bd6086550edaa3b6d8beaa" dependencies = [ "brotli", "ctor", "dunce", "glob", - "heck 0.4.1", + "heck 0.5.0", "html5ever", - "infer 0.13.0", + "infer", "json-patch", "kuchikiki", "log", @@ -5431,15 +5941,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.9.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.28", - "windows-sys 0.52.0", + "fastrand 2.1.1", + "once_cell", + "rustix 0.38.37", + "windows-sys 0.59.0", ] [[package]] @@ -5461,29 +5971,29 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -5507,7 +6017,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", - "itoa 1.0.10", + "itoa 1.0.11", "libc", "num-conv", "num_threads", @@ -5544,9 +6054,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -5559,42 +6069,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -5607,11 +6106,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -5620,16 +6130,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5655,21 +6164,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.22.22", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -5680,48 +6189,51 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.20", ] [[package]] name = "tonic" -version = "0.10.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.21.6", + "base64 0.22.1", "bytes", - "h2", - "http", - "http-body", - "hyper", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", "hyper-timeout", + "hyper-util", "percent-encoding", "pin-project", "prost", + "socket2 0.5.7", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -5729,15 +6241,16 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.10.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" dependencies = [ "prettyplease", "proc-macro2", "prost-build", + "prost-types", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -5760,17 +6273,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -5804,7 +6331,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] @@ -5860,14 +6387,25 @@ dependencies = [ ] [[package]] -name = "treediff" -version = "4.0.2" +name = "tree_magic_mini" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" dependencies = [ - "serde_json", + "fnv", + "home", + "memchr", + "nom", + "once_cell", + "petgraph", ] +[[package]] +name = "trim-in-place" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" + [[package]] name = "try-lock" version = "0.2.5" @@ -5886,37 +6424,43 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.0", + "memoffset 0.9.1", "tempfile", "winapi", ] [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode_categories" @@ -5924,11 +6468,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -5936,12 +6486,6 @@ dependencies = [ "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf-8" version = "0.7.6" @@ -5956,17 +6500,17 @@ checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", ] [[package]] @@ -5977,9 +6521,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503" +checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" [[package]] name = "vcpkg" @@ -5987,6 +6531,45 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vergen" +version = "9.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349ed9e45296a581f455bc18039878f409992999bc1d5da12a6800eb18c8752f" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", + "time", + "vergen-lib", +] + +[[package]] +name = "vergen-git2" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e771aff771c0d7c2f42e434e2766d304d917e29b40f0424e8faaaa936bbc3f29" +dependencies = [ + "anyhow", + "derive_builder", + "git2", + "rustversion", + "time", + "vergen", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229eaddb0050920816cf051e619affaf18caa3dd512de8de5839ccbc8e53abb0" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + [[package]] name = "version-compare" version = "0.0.11" @@ -5995,15 +6578,15 @@ checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" [[package]] name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vswhom" @@ -6027,15 +6610,15 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -6062,36 +6645,43 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -6101,9 +6691,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6111,28 +6701,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", @@ -6141,11 +6731,84 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.37", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags 2.6.0", + "rustix 0.38.37", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml 0.36.2", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -6153,17 +6816,18 @@ dependencies = [ [[package]] name = "webbrowser" -version = "0.8.12" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b2391658b02c27719fc5a0a73d6e696285138e8b12fba9d4baa70451023c71" +checksum = "2e5f07fb9bc8de2ddfe6b24a71a75430673fd679e568c48b52716cef1cfae923" dependencies = [ - "core-foundation", + "block2", + "core-foundation 0.10.0", "home", "jni 0.21.1", "log", "ndk-context", - "objc", - "raw-window-handle", + "objc2", + "objc2-foundation", "url", "web-sys", ] @@ -6212,7 +6876,7 @@ dependencies = [ "pango-sys", "pkg-config", "soup2-sys", - "system-deps 6.2.0", + "system-deps 6.2.2", ] [[package]] @@ -6255,33 +6919,31 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] -name = "which" -version = "4.4.2" +name = "whoami" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.28", + "redox_syscall", + "wasite", ] [[package]] -name = "whoami" -version = "1.4.1" +name = "widestring" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -6301,20 +6963,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-wsapoll" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" -dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -6375,7 +7028,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -6394,15 +7047,45 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-service" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9db37ecb5b13762d95468a2fc6009d4b2c62801243223aabd44fca13ad13c8" +checksum = "d24d6bcc7f734a4091ecf8d7a64c5f7d7066f45585c1861eba06449909609c8a" dependencies = [ - "bitflags 1.3.2", - "widestring", - "windows-sys 0.45.0", + "bitflags 2.6.0", + "widestring 1.1.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -6429,7 +7112,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -6464,17 +7156,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -6485,11 +7178,11 @@ checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" [[package]] name = "windows-version" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -6506,9 +7199,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6536,9 +7229,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6566,9 +7259,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6596,9 +7295,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6626,9 +7325,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6644,9 +7343,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6674,15 +7373,24 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -6708,24 +7416,44 @@ dependencies = [ [[package]] name = "winreg" -version = "0.51.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", ] +[[package]] +name = "wl-clipboard-rs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" +dependencies = [ + "derive-new", + "libc", + "log", + "nix 0.28.0", + "os_pipe", + "tempfile", + "thiserror", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", +] + [[package]] name = "wry" -version = "0.24.7" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" +checksum = "c55c80b12287eb1ff7c365fc2f7a5037cb6181bd44c9fce81c8d1cf7605ffad6" dependencies = [ "base64 0.13.1", "block", "cocoa", - "core-graphics", + "core-graphics 0.22.3", "crossbeam-channel", "dunce", "gdk", @@ -6733,7 +7461,7 @@ dependencies = [ "glib", "gtk", "html5ever", - "http", + "http 0.2.12", "kuchikiki", "libc", "log", @@ -6786,31 +7514,26 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "nix 0.26.4", - "winapi", - "winapi-wsapoll", + "rustix 0.38.37", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc" -dependencies = [ - "nix 0.26.4", -] +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", "rand_core 0.6.4", @@ -6820,37 +7543,37 @@ dependencies = [ [[package]] name = "xattr" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.12", - "rustix 0.38.28", + "linux-raw-sys 0.4.14", + "rustix 0.38.37", ] [[package]] name = "xdg-home" -version = "1.0.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" dependencies = [ - "nix 0.26.4", - "winapi", + "libc", + "windows-sys 0.59.0", ] [[package]] name = "zbus" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ - "async-broadcast", + "async-broadcast 0.5.1", "async-executor", - "async-fs", + "async-fs 1.6.0", "async-io 1.13.0", "async-lock 2.8.0", - "async-process", + "async-process 1.8.1", "async-recursion", "async-task", "async-trait", @@ -6875,61 +7598,124 @@ dependencies = [ "uds_windows", "winapi", "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", + "zbus_macros 3.15.2", + "zbus_names 2.6.1", + "zvariant 3.15.2", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast 0.7.1", + "async-executor", + "async-fs 2.1.2", + "async-io 2.3.4", + "async-lock 3.4.0", + "async-process 2.3.0", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.3.1", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", ] [[package]] name = "zbus_macros" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", "regex", "syn 1.0.109", - "zvariant_utils", + "zvariant_utils 1.0.1", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.79", + "zvariant_utils 2.1.0", ] [[package]] name = "zbus_names" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ "serde", "static_assertions", - "zvariant", + "zvariant 3.15.2", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant 4.2.0", ] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -6942,34 +7728,60 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.79", ] [[package]] name = "zvariant" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", "libc", "serde", "static_assertions", - "zvariant_derive", + "zvariant_derive 3.15.2", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.2.0", ] [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", - "zvariant_utils", + "zvariant_utils 1.0.1", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.79", + "zvariant_utils 2.1.0", ] [[package]] @@ -6982,3 +7794,14 @@ dependencies = [ "quote", "syn 1.0.109", ] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 0a443b49..bbecdd6b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,77 +1,80 @@ [package] name = "defguard-client" -version = "0.4.1" +version = "1.0.0" description = "Defguard desktop client" license = "" homepage = "https://github.com/DefGuard/client" repository = "https://github.com/DefGuard/client" default-run = "defguard-client" edition = "2021" -rust-version = "1.60" +rust-version = "1.80" authors = ["Defguard"] [build-dependencies] tauri-build = { version = "1.5", features = [] } -tonic-build = { version = "0.10" } -prost-build = { version = "0.12" } +tonic-build = { version = "0.12" } +prost-build = { version = "0.13" } +vergen-git2 = { version = "1.0", features = ["build"] } [dependencies] anyhow = "1.0" base64 = "0.22" -clap = { version = "4.4", features = ["derive", "env"] } +clap = { version = "4.5", features = ["derive", "env"] } chrono = { version = "0.4", features = ["serde"] } -defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.4.5" } +dark-light = "1.1" +defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.5.5" } dirs = "5.0" -lazy_static = "1.4" -local-ip-address = "0.5" +lazy_static = "1.5" +local-ip-address = "0.6" log = "0.4" -notify-debouncer-mini = "0.4" -prost = "0.12" +prost = "0.13" rand = "0.8" -rust-ini = "0.20" +regex = "1.11" +reqwest = { version = "0.12", features = ["json"] } +rust-ini = "0.21" serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -serde_with = "3.5" -sqlx = { version = "0.7", features = [ - "chrono", - "sqlite", - "runtime-tokio", - "uuid", - "macros", +serde_with = "3.9" +sqlx = { version = "0.8", features = [ + "chrono", + "sqlite", + "runtime-tokio", + "uuid", + "macros", ] } struct-patch = "0.4" -strum = { version = "0.25", features = ["derive"] } -dark-light = "1.0" -webbrowser = "0.8" - -tauri = { version = "1.5", features = [ - "dialog-all", - "clipboard-all", - "http-all", - "window-all", - "system-tray", - "native-tls-vendored", - "icon-png", - "fs-all", +strum = { version = "0.26", features = ["derive"] } +tauri = { version = "1.8", features = [ + "dialog-all", + "clipboard-all", + "http-all", + "window-all", + "system-tray", + "native-tls-vendored", + "icon-png", + "fs-all", ] } tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } thiserror = "1.0" -tokio = { version = "1", features = ["macros", "rt-multi-thread"] } +time = { version = "0.3", features = ["formatting"] } +tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal"] } tokio-util = "0.7" -tonic = "0.10" +tonic = "0.12" tracing = "0.1" tracing-appender = "0.2" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } +webbrowser = "1.0" x25519-dalek = { version = "2", features = ["getrandom", "static_secrets"] } -reqwest = { version = "0.11", features = ["json"] } [target.'cfg(target_os = "windows")'.dependencies] -windows-service = "0.6" +windows-service = "0.7" +winapi = { version = "0.3", features = ["winsvc", "winerror"] } +widestring = "0.4" [target.'cfg(target_os = "macos")'.dependencies] -nix = { version = "0.28", features = ["net"] } +nix = { version = "0.29", features = ["net"] } [features] # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. @@ -80,4 +83,4 @@ nix = { version = "0.28", features = ["net"] } custom-protocol = ["tauri/custom-protocol"] [dev-dependencies] -tokio = { version = "1.34", features = ["full"] } +tokio = { version = "1", features = ["full"] } diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 36881822..04be1045 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,4 +1,10 @@ +use vergen_git2::{Emitter, Git2Builder}; + fn main() -> Result<(), Box> { + // set VERGEN_GIT_SHA env variable based on git commit hash + let git2 = Git2Builder::default().branch(true).sha(true).build()?; + Emitter::default().add_instructions(&git2)?.emit()?; + // compiling protos using path on build time let mut config = prost_build::Config::new(); // enable optional fields @@ -11,7 +17,7 @@ fn main() -> Result<(), Box> { ); // Make all messages serde-serializable config.type_attribute(".", "#[derive(serde::Serialize,serde::Deserialize)]"); - tonic_build::configure().compile_with_config( + tonic_build::configure().compile_protos_with_config( config, &["proto/client/client.proto", "proto/core/proxy.proto"], &["proto/client", "proto/core"], diff --git a/src-tauri/migrations/20240717141723_add_selected_view_column.sql b/src-tauri/migrations/20240717141723_add_selected_view_column.sql new file mode 100644 index 00000000..4345af1d --- /dev/null +++ b/src-tauri/migrations/20240717141723_add_selected_view_column.sql @@ -0,0 +1 @@ +ALTER TABLE settings ADD COLUMN selected_view TEXT DEFAULT NULL; diff --git a/src-tauri/migrations/20240828072527_add_polling_token.sql b/src-tauri/migrations/20240828072527_add_polling_token.sql new file mode 100644 index 00000000..04636645 --- /dev/null +++ b/src-tauri/migrations/20240828072527_add_polling_token.sql @@ -0,0 +1 @@ +ALTER TABLE instance ADD COLUMN token TEXT; diff --git a/src-tauri/migrations/20240909092543_add_disable_route_all_traffic.sql b/src-tauri/migrations/20240909092543_add_disable_route_all_traffic.sql new file mode 100644 index 00000000..941194d4 --- /dev/null +++ b/src-tauri/migrations/20240909092543_add_disable_route_all_traffic.sql @@ -0,0 +1 @@ +ALTER TABLE instance ADD COLUMN disable_all_traffic BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/src-tauri/migrations/20240912084922_add_enterprise_enabled_flag.sql b/src-tauri/migrations/20240912084922_add_enterprise_enabled_flag.sql new file mode 100644 index 00000000..71f4566f --- /dev/null +++ b/src-tauri/migrations/20240912084922_add_enterprise_enabled_flag.sql @@ -0,0 +1 @@ +ALTER TABLE instance ADD COLUMN enterprise_enabled BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/src-tauri/proto b/src-tauri/proto index c71f3784..d41f95fd 160000 --- a/src-tauri/proto +++ b/src-tauri/proto @@ -1 +1 @@ -Subproject commit c71f37847279ee23220fcf9e0e45d2c365b3b8ee +Subproject commit d41f95fd442e810cf0db30d3086c38b29c30b399 diff --git a/src-tauri/resources-macos/resources/net.defguard.plist b/src-tauri/resources-macos/resources/net.defguard.plist index cba179ad..696d5cd5 100644 --- a/src-tauri/resources-macos/resources/net.defguard.plist +++ b/src-tauri/resources-macos/resources/net.defguard.plist @@ -14,5 +14,7 @@ http://www.apple.com/DTDs/PropertyList-1.0.dtd > /usr/local/bin/defguard-service KeepAlive + RunAtLoad + - \ No newline at end of file + diff --git a/src-tauri/resources-macos/scripts/postinstall b/src-tauri/resources-macos/scripts/postinstall index 747e3345..d660c2a9 100755 --- a/src-tauri/resources-macos/scripts/postinstall +++ b/src-tauri/resources-macos/scripts/postinstall @@ -22,6 +22,7 @@ ln -sf ${BINARY_PATH}/${SERVICE_BINARY} /usr/local/bin/${SERVICE_BINARY} # Launch daemon ln -sf ${RESOURCES_PATH}/${DAEMON_PROPERTY_FILE} /Library/LaunchDaemons/${DAEMON_PROPERTY_FILE} sudo launchctl load /Library/LaunchDaemons/${DAEMON_PROPERTY_FILE} -sudo launchctl start ${DAEMON_NAME} +# Restart +sudo launchctl stop ${DAEMON_NAME} echo "Post installation process finished" diff --git a/src-tauri/resources/icons/tray-32x32-black.png b/src-tauri/resources/icons/tray-32x32-black.png index 74946b12331f524d1c0fbf642918f7f6a6c48e78..62a64e76168484790a036cbc84b931c1000676be 100644 GIT binary patch delta 850 zcmV-Y1Figp2(br{B!6*fLqkw$V`BgSc-ocGIY40D@kA66MMNyNP%8yd5$!Yz zK~M-WLZTM#kqfe$u$y3$Qm_qJcr->WY^=4luoVQs1H{_GO3_BbIz!L|A%Zi_!#DE} zGyj0Mn9@zBegsS_YX|*4B^+5%nx1K-L(FcbRNcwU1Of}x9Dg6TcmQsO8!H z2af_w>lr&MyberkWHZvcK$o6S4dGK@$QBnAzL&XH_KS2}8ZXjzC^#$J1t{?6$dM#PmSK`uC^!W1wcjLnB2J9e;&6(wL~odgLGc?yVCW8wJ4A>Vt+S*L@p+rfnz{T=(rZGWTPjRK8W!WRTdCHTfNnw%(5jcL30#GEP+!U04b>Yniw7ihyK zM6F>RqBhX#M1c$z@d?2`I(-^l??Lc^1vHo|0CkB7N`EDSD+r!3WwJmPT_~3jvZe=7 z9-`uCMsZpYhp4>i$FLj65ack2demWF_XJ1iadHri;u?ZSJV11B#H~qKg($KriYhNg zaij9~UEoH63@lU{3mH=d-XKULjB*)3+T#H c!AdUp0pk_4Vbu)LOaK4?07*qoM6N<$g0TN<$p8QV delta 932 zcmV;V16%yD2ZacbB!7izLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq7>3`bYDFp{77=mC zP@OD@is+_QC_;r$E41oha_Jv5X-HCB90k{cgFlN^2N!2u9b5%L@CU@%!Aa3YO8hP< zw21YN;~w7o-j}=Y0HIoBn$mEM7 z-$i&<>$*Qjx08P93mETO{_FA%bObUBym{PbjlY}9;=+UIBUf+tKXBqFqqL-mbp%A2r(>T2@*so zD5HQPY(!|+Nq@1Bpz~-8|Dfxa$fc0007i}ll%PR&{osG_ySG+$V%$p#MuGMh$N3lr z0=q!1;yB;Oj#E1U{LjFZ-td>I!1O2Sm4+5R0(!QAi|dA_>;acMz`&Cso3bnUX$jdZ z@P0<$lm_~4fvz>LZ}oGWJ^)GTRs04xI0Qy=l)c{K-6NgNefzhj-oGE6TynU*%C+zS z000JJOGiWi{{a60|De66larnSPk#a2NklPhvrq|EeiBGfqoU?)=D{NOk{7dg z4+jSJcK^Hcznj^axh~bo7{24R4#^~bF9uqn!?IigJF%-1#JAukiqKmzw|`_8ELD1O z0YAg=ozMcma1raPAg~H2F&oC7VmMhJ#Ybfyw_d56st*2lj`S$v#}E$^}EXp9I^3n5#rm0-JFoF?!*t8)L0V_GC>&+wmyLjAyVmGT+&lEAS9Iau%b%ui-&V#r#Kni18E-R8fx0@<2CE zgs*2}++9^auuv`N4gKd@uyUE?rt9hnSGVW^T1g}JWRWl7h9}t526cXKV6)|cK8(g; z1;#N@f*Zg@VCL~PcT?Jr+sT_<4sw0C6h@l_`>X1Tg&Ufm_;YB1$JkwUTb>5lVZ6iJ z7&q$pFDSbmJuL$9Qym1#;$%FDlhL}H(yq`6Y{jv~Hv9pg40D@kA66MMNyNP%8yd5$!Yz zK~M-WLZTM#kqfe$u$y3$Qm_qJcr->WY^=4luoVQs1H{_GO3_BbIz!L|A%Zi_!#DE} zGyj0Mn9@zBegsS_YX|*4B^+5%nx1K-L(FcbRNcwU1Of}x9Dg6TcmQsO8!H z2af_w>lr&MyberkWHZvcK$o6S4dGK@$QBnAzL&XH_KS2}8ZXjzC^#$J1t{?6$dM#PmSK`uC^!W1wcjLnB2J9e;&6(wL~odgLGc?yVCW8wJ4A>Vt+S*L@p+rfnz{T=(O)>!XU1{FZ~xc4c*1LcgobK?mg#!&iyUUJ#%h`Tfe|ad>V}oN?i-E z3+sOe-~rXB@qau36PI8Cq83r&dH^QO!#Lg`SXF{|Od#KQ04B;p5AGq@M}w`u0S6GR z>BS)|6Ay1g9D*x!WDTA9e%1wPqpwqIL>UPnNTLsZ2lWB1O_~g_Yv48XJiw0Y0cdaj z@=IR`QC9+RAHfDhZ6cCtys-d!U5t5%n!zkY&7sJR0Dngq!wUrKD7V#=V-135j3U=q z0Gnep{ZZS56A13mWimhl6%OhnNSNM;ULk541u5zZwNKQm(bo`_*oGj9e&is40c{g( zp~|(5i0f9ILU4m?h_}1R* XQR6aCO3fLE00000NkvXXu0mjfOyi4) delta 1156 zcmV-~1bh472jdBlB!7izLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq7>3`bYDFp{77=mC zP@OD@is+_QC_;r$E41oha_Jv5X-HCB90k{cgFlN^2N!2u9b5%L@CU@%!Aa3YO8hP< zw21YN;~w7o-j}=Y0HIoBn$mEM7 z-$i&<>$*Qjx08P93mETO{_FA%bObUBym{PbjlY}9;=+UIBUf+tKXBqFqqL-mbp%A2r(>T2@*so zD5HQPY(!|+Nq@1Bpz~-8|Dfxa$fc0007i}ll%PR&{osG_ySG+$V%$p#MuGMh$N3lr z0=q!1;yB;Oj#E1U{LjFZ-td>I!1O2Sm4+5R0(!QAi|dA_>;acMz`&Cso3bnUX$jdZ z@P0<$lm_~4fvz>LZ}oGWJ^)GTRs04xI0Qy=l)c{K-6NgNefzhj-oGE6TynU*%C+zS z000JJOGiWi{{a60|De66larnSPk#csNklFTN4}zk{NLWFLP*!u5S_C2y1{p0}N}9Dajcj2B22oAB78zONBgt-? zb3sD6pWg54fp0Nq&YZ`8&iuav84_h(hqA6Rm0cE@lVYHIITHvaS!u$&OMh9nI~^Y@ z78$qzxCtDTbvIzV(eE>wfU<54&T!VjUG>7uYild1%Dtr6#`-4Pblk#7IAJ!SvRwsJn(lZc%VvIS2fS}0iZpq z9(e7I-a1QH4zvI}L^TMU^F|M5ng=!j*MK9UdMHIy0|Uys$G|0T^ry&pKoA%KdVo_v zHqb8>zY?2mg2+x_3b+e2d82NltE+d9M!K=)^z{_VmlpW6TSt`NJU41!^*l=fja?Q0?qx7)Bs;4=tub)L|5&NF846Jt2sz zA_#(EpfIWg)&p%aZuKeao+#^z=LlS^tm^@u0-Jz|$Yw$bPy|?DpZx3Z0as+Z2{;1^IA`^}bQ z@P$Z_&J$AB40D@kA66MMNyNP%8yd5$!Yz zK~M-WLZTM#kqfe$u$y3$Qm_qJcr->WY^=4luoVQs1H{_GO3_BbIz!L|A%Zi_!#DE} zGyj0Mn9@zBegsS_YX|*4B^+5%nx1K-L(FcbRNcwU1Of}x9Dg6TcmQsO8!H z2af_w>lr&MyberkWHZvcK$o6S4dGK@$QBnAzL&XH_KS2}8ZXjzC^#$J1t{?6$dM#PmSK`uC^!W1wcjLnB2J9e;&6(wL~odgLGc?yVCW8wJ4A>Vt+S*L@p+rfnz{T=(}BL?x)c>odlf*xE#v4sX- ze*?CmR?~|eCjmsH4Tn&ipd*z^d9Ulz>9j{*r`4!&5Pd^HtV zfZ`T?`0gx#&mNjSsBOYN6c^}n86b!M0qPUTxn79wp=K1n-l+R+eQNHVzJ{p8DinDL z?HfvvMIMS3RE4$>aomanD9&&SwQDVrtc08wp&L2VjiQK`V%r~};NOBM0_3`bYDFp{77=mC zP@OD@is+_QC_;r$E41oha_Jv5X-HCB90k{cgFlN^2N!2u9b5%L@CU@%!Aa3YO8hP< zw21YN;~w7o-j}=Y0HIoBn$mEM7 z-$i&<>$*Qjx08P93mETO{_FA%bObUBym{PbjlY}9;=+UIBUf+tKXBqFqqL-mbp%A2r(>T2@*so zD5HQPY(!|+Nq@1Bpz~-8|Dfxa$fc0007i}ll%PR&{osG_ySG+$V%$p#MuGMh$N3lr z0=q!1;yB;Oj#E1U{LjFZ-td>I!1O2Sm4+5R0(!QAi|dA_>;acMz`&Cso3bnUX$jdZ z@P0<$lm_~4fvz>LZ}oGWJ^)GTRs04xI0Qy=l)c{K-6NgNefzhj-oGE6TynU*%C+zS z000JJOGiWi{{a60|De66larnSPk#clNkl$H((MGb0WlH>xYR=ZDq< zjgp3@Gm6Dx3E-BQbpU69YJXs9R5kEXQY?(2q(LBNW@SL(V)DTFLhwMjnU&A5yc=js zx(m!K0lbm4X_Br8XaTmmss}hFsVCJuuoh?l_Pgr72T=jMFtdk1t)#D!@qlNb59k7p zd1ZHd#IM|Dvu9)*FbdoN>LmS&3c!SX2F^+9oWXW4&40D@kA66MMNyNP%8yd5$!Yz zK~M-WLZTM#kqfe$u$y3$Qm_qJcr->WY^=4luoVQs1H{_GO3_BbIz!L|A%Zi_!#DE} zGyj0Mn9@zBegsS_YX|*4B^+5%nx1K-L(FcbRNcwU1Of}x9Dg6TcmQsO8!H z2af_w>lr&MyberkWHZvcK$o6S4dGK@$QBnAzL&XH_KS2}8ZXjzC^#$J1t{?6$dM#PmSK`uC^!W1wcjLnB2J9e;&6(wL~odgLGc?yVCW8wJ4A>Vt+S*L@p+rfnz{T=(Okd|UT4H`I&h}FlSWd7FYcKGu@&dpyw9d7r z+LaUlT6#pD$7(gINU;F0N4LpyLpRBDOS`Km(A8!AA%EndrVBIEdO*l;UDEb+1@gSn z+y=9AdP~SRok>}sr+p>nTk54gh*rqc(ar&LyVN1iO44np{d!7BUl+7ZW4fq5Ay0Im zvV#aXp?8FQ(Pt5VJ6_942#jb!y=XxrwI9X6I2!u1ppF7vW##W7Q#VzCpM<>7Oo{m; zah6mCnrdomm5@bE4VatKeL~jsE9pxqFsXYYmbtEGbWLl8f|HfKmIE_|zxYRld9K5C zeHUb!*GGNOys}|@8Ew_*It%e@*#fE8$zoxhwCgUgS4+g5Qs$ojlySX+6*Ay@00000 LNkvXXu0mjf`W}^D delta 953 zcmV;q14jJR2bl3`bYDFp{77=mC zP@OD@is+_QC_;r$E41oha_Jv5X-HCB90k{cgFlN^2N!2u9b5%L@CU@%!Aa3YO8hP< zw21YN;~w7o-j}=Y0HIoBn$mEM7 z-$i&<>$*Qjx08P93mETO{_FA%bObUBym{PbjlY}9;=+UIBUf+tKXBqFqqL-mbp%A2r(>T2@*so zD5HQPY(!|+Nq@1Bpz~-8|Dfxa$fc0007i}ll%PR&{osG_ySG+$V%$p#MuGMh$N3lr z0=q!1;yB;Oj#E1U{LjFZ-td>I!1O2Sm4+5R0(!QAi|dA_>;acMz`&Cso3bnUX$jdZ z@P0<$lm_~4fvz>LZ}oGWJ^)GTRs04xI0Qy=l)c{K-6NgNefzhj-oGE6TynU*%C+zS z000JJOGiWi{{a60|De66larnSPk#aMNklo}HOJb2g=l0wdU$S``?_>|(gK)Z%Dc=3DNM*~xj zECgT%r?GYk_;rDu$w^@Rf7F4wmC%793^hsbPbpogWC>8i{nBQ8fLc|e^P2#+;zp_P zRa`4wU&odz2)w{~e2eRQ=zl9=`fxXLUvUl_auTS=OAIc69mK1^PU3h@0#n$&1bi*9 zS%v6(iO2{xHNb6-oYI(lLWCW7R8qz>SRcxFHtxYg?96r;&HoH>5EF6#1Kvk}0td1m z$4zvg9VcR~r=s6pi62<#EC_$lxtz0L^>WA+MKQTjp0J~l2UuX%ihq<+M=l}y9Lw+o z{Y${_4Qw_Y=)y2&DYwTyYTTFHP~M zXz&<&Dz)YF4CrCJ#hd6CmH!tsAkxvusK!S8SUG_v`((7VPli|8l&*?4mQvbQ6veT{ b2K)lMMQ3>ND>>, + pub db: Arc>>, pub active_connections: Arc>>, pub client: DesktopDaemonServiceClient, - pub log_watchers: Arc>>, + pub log_watchers: Arc>>, } impl Default for AppState { @@ -33,10 +35,10 @@ impl AppState { pub fn new() -> Self { let client = setup_client().expect("Failed to setup gRPC client"); AppState { - db: Arc::new(Mutex::new(None)), + db: Arc::new(std::sync::Mutex::new(None)), active_connections: Arc::new(Mutex::new(Vec::new())), client, - log_watchers: Arc::new(Mutex::new(HashMap::new())), + log_watchers: Arc::new(std::sync::Mutex::new(HashMap::new())), } } @@ -44,31 +46,26 @@ impl AppState { self.db .lock() .expect("Failed to lock dbpool mutex") - .as_ref() - .cloned() + .clone() .unwrap() } - pub fn get_connections(&self) -> Vec { - self.active_connections - .lock() - .expect("Failed to lock active connections mutex") - .clone() - } - pub fn find_and_remove_connection( + /// Try to remove a connection from the list of active connections. + /// Return removed connection, or `None` if not found. + pub async fn remove_connection( &self, - location_id: i64, + location_id: Id, connection_type: &ConnectionType, ) -> Option { - debug!("Removing active connection for location with id: {location_id}"); - let mut connections = self.active_connections.lock().unwrap(); + trace!("Removing active connection for location with id: {location_id}"); + let mut connections = self.active_connections.lock().await; if let Some(index) = connections.iter().position(|conn| { conn.location_id == location_id && conn.connection_type.eq(connection_type) }) { // Found a connection with the specified location_id let removed_connection = connections.remove(index); - info!("Removed connection from active connections: {removed_connection:#?}"); + trace!("Active connection has been removed from the active connections list."); Some(removed_connection) } else { debug!("No active connection found with location_id: {location_id}"); @@ -76,10 +73,10 @@ impl AppState { } } - pub fn get_connection_id_by_type(&self, connection_type: &ConnectionType) -> Vec { - let active_connections = self.active_connections.lock().unwrap(); + pub async fn get_connection_id_by_type(&self, connection_type: &ConnectionType) -> Vec { + let active_connections = self.active_connections.lock().await; - let connection_ids: Vec = active_connections + let connection_ids = active_connections .iter() .filter_map(|con| { if con.connection_type.eq(connection_type) { @@ -94,10 +91,11 @@ impl AppState { } pub async fn close_all_connections(&self) -> Result<(), crate::error::Error> { - info!("Closing all active connections..."); - let active_connections = self.get_connections(); - info!("Found {} active connections", active_connections.len()); - for connection in active_connections { + debug!("Closing all active connections..."); + let active_connections = self.active_connections.lock().await; + let active_connections_count = active_connections.len(); + debug!("Found {} active connections", active_connections_count); + for connection in active_connections.iter() { debug!( "Found active connection with location {}", connection.location_id @@ -106,18 +104,22 @@ impl AppState { debug!("Removing interface {}", connection.interface_name); disconnect_interface(connection, self).await?; } - info!("All active connections closed"); + if active_connections_count > 0 { + info!("All active connections ({active_connections_count}) have been closed."); + } else { + debug!("There were no active connections to close, nothing to do."); + } Ok(()) } - pub fn find_connection( + pub async fn find_connection( &self, - id: i64, + id: Id, connection_type: ConnectionType, ) -> Option { - let connections = self.active_connections.lock().unwrap(); - debug!( - "Checking for active connection with id: {id}, connection_type: {connection_type:?} in active connections: {connections:#?}" + let connections = self.active_connections.lock().await; + trace!( + "Checking for active connection with id: {id}, connection_type: {connection_type:?} in active connections." ); if let Some(connection) = connections @@ -125,11 +127,41 @@ impl AppState { .find(|conn| conn.location_id == id && conn.connection_type == connection_type) { // 'connection' now contains the first element with the specified id and connection_type - debug!("Found connection: {connection:#?}"); + trace!("Found connection: {connection:?}"); Some(connection.to_owned()) } else { - error!("Couldn't find connection with id: {id}, connection_type: {connection_type:?} in active connections."); + debug!("Couldn't find connection with id: {id}, connection_type: {connection_type:?} in active connections."); None } } + + /// Returns active connections for a given instance. + pub async fn active_connections( + &self, + instance: &Instance, + ) -> Result, crate::error::Error> { + let locations: HashSet = Location::find_by_instance_id(&self.get_pool(), instance.id) + .await? + .iter() + .map(|location| location.id) + .collect(); + Ok(self + .active_connections + .lock() + .await + .iter() + .filter(|connection| locations.contains(&connection.location_id)) + .cloned() + .collect()) + } + + /// Close all connections, then terminate the application. + pub fn quit(&self, app_handle: &AppHandle) { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + let _ = self.close_all_connections().await; + app_handle.exit(0); + }); + }); + } } diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index 1d792752..08131be7 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -3,35 +3,44 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -use lazy_static::lazy_static; -use log::{Level, LevelFilter}; -#[cfg(target_os = "macos")] -use tauri::{api::process, Env}; -use tauri::{Manager, State}; -use tauri_plugin_log::LogTarget; +use std::{env, str::FromStr}; +#[cfg(target_os = "windows")] +use defguard_client::utils::sync_connections; use defguard_client::{ __cmd__active_connection, __cmd__all_connections, __cmd__all_instances, __cmd__all_locations, __cmd__all_tunnels, __cmd__connect, __cmd__delete_instance, __cmd__delete_tunnel, __cmd__disconnect, __cmd__get_latest_app_version, __cmd__get_settings, __cmd__last_connection, __cmd__location_interface_details, __cmd__location_stats, __cmd__open_link, __cmd__parse_tunnel_config, __cmd__save_device_config, __cmd__save_tunnel, - __cmd__tunnel_details, __cmd__update_instance, __cmd__update_location_routing, - __cmd__update_settings, + __cmd__start_global_logwatcher, __cmd__stop_global_logwatcher, __cmd__tunnel_details, + __cmd__update_instance, __cmd__update_location_routing, __cmd__update_settings, + __cmd__update_tunnel, appstate::AppState, commands::{ active_connection, all_connections, all_instances, all_locations, all_tunnels, connect, delete_instance, delete_tunnel, disconnect, get_latest_app_version, get_settings, last_connection, location_interface_details, location_stats, open_link, - parse_tunnel_config, save_device_config, save_tunnel, tunnel_details, update_instance, - update_location_routing, update_settings, + parse_tunnel_config, save_device_config, save_tunnel, start_global_logwatcher, + stop_global_logwatcher, tunnel_details, update_instance, update_location_routing, + update_settings, update_tunnel, }, database::{self, models::settings::Settings}, - latest_app_version::fetch_latest_app_version_loop, - tray::{configure_tray_icon, create_tray_menu, handle_tray_event}, + enterprise::periodic::config::poll_config, + events::SINGLE_INSTANCE, + periodic::version::poll_version, + service, + tray::{configure_tray_icon, handle_tray_event, reload_tray_menu}, utils::load_log_targets, + VERSION, }; -use std::{env, str::FromStr}; +use lazy_static::lazy_static; +use log::{Level, LevelFilter}; +#[cfg(target_os = "macos")] +use tauri::{api::process, Env}; +use tauri::{Builder, Manager, RunEvent, State, SystemTray, WindowEvent}; +use tauri_plugin_log::LogTarget; +use time; #[derive(Clone, serde::Serialize)] struct Payload { @@ -44,6 +53,7 @@ extern crate log; // for tauri log plugin const LOG_TARGETS: [LogTarget; 2] = [LogTarget::Stdout, LogTarget::LogDir]; +const LOG_FILTER: [&str; 5] = ["tauri", "sqlx", "hyper", "h2", "tower"]; lazy_static! { static ref LOG_INCLUDES: Vec = load_log_targets(); @@ -70,14 +80,18 @@ async fn main() { debug!("Added binary dir {current_bin_dir:?} to PATH"); } - let tray_menu = create_tray_menu(); - let system_tray = tauri::SystemTray::new().with_menu(tray_menu); - let log_level = - LevelFilter::from_str(&env::var("DEFGUARD_CLIENT_LOG_LEVEL").unwrap_or("info".into())) + LevelFilter::from_str(&env::var("DEFGUARD_CLIENT_LOG_LEVEL").unwrap_or("debug".into())) .unwrap_or(LevelFilter::Info); - let app = tauri::Builder::default() + // Sets the time format. Service's logs have a subsecond part, so we also need to include it here, + // otherwise the logs couldn't be sorted correctly when displayed together in the UI. + let format = time::format_description::parse( + "[[[year]-[month]-[day]][[[hour]:[minute]:[second].[subsecond]]", + ) + .unwrap(); + + let app = Builder::default() .invoke_handler(tauri::generate_handler![ all_locations, save_device_config, @@ -99,24 +113,43 @@ async fn main() { all_tunnels, open_link, tunnel_details, + update_tunnel, delete_tunnel, get_latest_app_version, + start_global_logwatcher, + stop_global_logwatcher ]) .on_window_event(|event| match event.event() { - tauri::WindowEvent::CloseRequested { api, .. } => { - event.window().hide().unwrap(); + WindowEvent::CloseRequested { api, .. } => { + #[cfg(not(target_os = "macos"))] + let _ = event.window().hide(); + + #[cfg(target_os = "macos")] + let _ = tauri::AppHandle::hide(&event.window().app_handle()); + api.prevent_close(); } _ => {} }) - .system_tray(system_tray) + .system_tray(SystemTray::new()) .on_system_tray_event(handle_tray_event) .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { - app.emit_all("single-instance", Payload { args: argv, cwd }) - .unwrap(); + let _ = app.emit_all(SINGLE_INSTANCE, Payload { args: argv, cwd }); })) .plugin( tauri_plugin_log::Builder::default() + .format(move |out, message, record| { + out.finish(format_args!( + "{}[{}][{}] {}", + tauri_plugin_log::TimezoneStrategy::UseUtc + .get_now() + .format(&format) + .unwrap(), + record.level(), + record.target(), + message + )) + }) .targets(LOG_TARGETS) .level(log_level) .filter(|metadata| { @@ -133,54 +166,128 @@ async fn main() { } true }) + .filter(|metadata| { + // Log all errors, warnings and infos + if metadata.level() == LevelFilter::Error + || metadata.level() == LevelFilter::Warn + || metadata.level() == LevelFilter::Info + { + return true; + } + // Otherwise do not log the following targets + for target in LOG_FILTER.iter() { + if metadata.target().contains(target) { + return false; + } + } + true + }) .build(), ) .plugin(tauri_plugin_window_state::Builder::default().build()) .manage(AppState::default()) .build(tauri::generate_context!()) - .expect("error while running tauri application"); + .expect("error while building tauri application"); + info!("Starting Defguard client version {}", VERSION); // initialize database let app_handle = app.handle(); - debug!("Initializing database connection"); + + info!( + "The application data (database file) will be stored in: {:?} \ + and the application logs in: {:?}. Logs of the background defguard service responsible for \ + managing the VPN connections at the network level will be stored in: {:?}.", + // display the path to the app data direcory, convert option to option<&str> + app_handle + .path_resolver() + .app_data_dir() + .unwrap_or("UNDEFINED DATA DIRECTORY".into()), + app_handle + .path_resolver() + .app_log_dir() + .unwrap_or("UNDEFINED LOG DIRECTORY".into()), + service::config::DEFAULT_LOG_DIR + ); + + debug!("Performing database setup..."); let app_state: State = app_handle.state(); - let db = database::init_db(&app_handle) - .await - .expect("Database initialization failed"); + let db = match database::init_db(&app_handle).await { + Ok(db) => db, + Err(e) => { + error!("Failed to initialize database: {}", e); + return; + } + }; *app_state.db.lock().unwrap() = Some(db); - info!("Database initialization completed"); - info!("Starting main app thread."); - let result = database::info(&app_state.get_pool()).await; - info!("Database info result: {:#?}", result); + debug!("Database setup has been completed successfully."); + + // Sync already active connections on windows. + // When windows is restarted, the app doesn't close the active connections + // and they are still running after the restart. We sync them here to + // reflect the real system's state. + // TODO: Find a way to intercept the shutdown event and close all connections + #[cfg(target_os = "windows")] + { + match sync_connections(&app_handle).await { + Ok(_) => { + info!("Synchronized application's active connections with the connections already open on the system, if there were any.") + } + Err(e) => { + warn!( + "Failed to synchronize application's active connections with the connections already open on the system. \ + The connections' state in the application may not reflect system's state. Reconnect manually to reset them. Error details: {}", + e + ) + } + }; + } + // configure tray + debug!("Configuring tray icon..."); if let Ok(settings) = Settings::get(&app_state.get_pool()).await { - configure_tray_icon(&app_handle, &settings.tray_icon_theme).unwrap(); + let _ = configure_tray_icon(&app_handle, &settings.tray_icon_theme); } + debug!("Tray icon has been configured successfully"); - tauri::async_runtime::spawn( - async move { fetch_latest_app_version_loop(app_handle.clone()).await }, - ); + // run periodic tasks + debug!("Starting periodic tasks (config and version polling)..."); + tauri::async_runtime::spawn(poll_version(app_handle.clone())); + tauri::async_runtime::spawn(poll_config(app_handle.clone())); + debug!("Periodic tasks have been started"); + + // load tray menu after database initialization to show all instance and locations + debug!("Re-generating tray menu to show all available instances and locations as we have connected to the database..."); + reload_tray_menu(&app_handle).await; + debug!("Tray menu has been re-generated successfully"); + + // Handle Ctrl-C + debug!("Setting up Ctrl-C handler..."); + tauri::async_runtime::spawn(async move { + tokio::signal::ctrl_c() + .await + .expect("Signal handler failure"); + debug!("Ctrl-C handler: quitting the app"); + let app_state: State = app_handle.state(); + app_state.quit(&app_handle); + }); + debug!("Ctrl-C handler has been set up successfully"); // run app + debug!("Starting the main application event loop..."); app.run(|app_handle, event| match event { // prevent shutdown on window close - tauri::RunEvent::ExitRequested { api, .. } => { + RunEvent::ExitRequested { api, .. } => { debug!("Received exit request"); - api.prevent_exit() + api.prevent_exit(); } // handle shutdown - tauri::RunEvent::Exit => { - info!("Exiting event loop..."); + RunEvent::Exit => { + debug!("Exiting the application's main event loop..."); let app_state: State = app_handle.state(); - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - let _ = app_state.close_all_connections().await; - app_handle.exit(0); - }); - }); + app_state.quit(app_handle); } _ => { - trace!("Received event: {event:?}") + trace!("Received event: {event:?}"); } }); } diff --git a/src-tauri/src/bin/defguard-service.rs b/src-tauri/src/bin/defguard-service.rs index a50ff2f5..04e4e3a0 100644 --- a/src-tauri/src/bin/defguard-service.rs +++ b/src-tauri/src/bin/defguard-service.rs @@ -23,7 +23,5 @@ async fn main() -> anyhow::Result<()> { #[cfg(windows)] fn main() -> windows_service::Result<()> { - use defguard_client::service::windows_service::defguard_windows_service; - - defguard_windows_service::run() + defguard_client::service::windows::run() } diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 4218f1bf..e3a484b5 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,26 +1,44 @@ +use core::fmt; +use std::{ + collections::{HashMap, HashSet}, + env, + str::FromStr, +}; + +use chrono::{DateTime, Duration, NaiveDateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::{Sqlite, Transaction}; +use struct_patch::Patch; +use tauri::{AppHandle, Manager, State}; + use crate::{ appstate::AppState, database::{ - models::{instance::InstanceInfo, settings::SettingsPatch}, - ActiveConnection, Connection, ConnectionInfo, Instance, Location, LocationStats, Settings, - Tunnel, TunnelConnection, TunnelConnectionInfo, TunnelStats, WireguardKeys, + models::{ + instance::InstanceInfo, location_stats::LocationStats, settings::SettingsPatch, Id, + NoId, + }, + ActiveConnection, Connection, ConnectionInfo, Instance, Location, Settings, Tunnel, + TunnelConnection, TunnelConnectionInfo, TunnelStats, WireguardKeys, }, + enterprise::periodic::config::poll_instance, error::Error, + events::{CONNECTION_CHANGED, INSTANCE_UPDATE, LOCATION_UPDATE}, + log_watcher::{ + global_log_watcher::{spawn_global_log_watcher_task, stop_global_log_watcher_task}, + service_log_watcher::stop_log_watcher_task, + }, proto::{DeviceConfig, DeviceConfigResponse}, - service::{log_watcher::stop_log_watcher_task, proto::RemoveInterfaceRequest}, - tray::configure_tray_icon, + service::proto::RemoveInterfaceRequest, + tray::{configure_tray_icon, reload_tray_menu}, utils::{ disconnect_interface, execute_command, get_location_interface_details, - get_tunnel_interface_details, handle_connection_for_location, handle_connection_for_tunnel, + get_tunnel_interface_details, get_tunnel_or_location_name, handle_connection_for_location, + handle_connection_for_tunnel, }, wg_config::parse_wireguard_config, CommonConnection, CommonConnectionInfo, CommonLocationStats, ConnectionType, }; -use chrono::{DateTime, Duration, NaiveDateTime, Utc}; -use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, env, str::FromStr}; -use struct_patch::Patch; -use tauri::{AppHandle, Manager, State}; #[derive(Clone, serde::Serialize)] pub struct Payload { @@ -30,72 +48,144 @@ pub struct Payload { // Create new WireGuard interface #[tauri::command(async)] pub async fn connect( - location_id: i64, + location_id: Id, connection_type: ConnectionType, preshared_key: Option, handle: AppHandle, ) -> Result<(), Error> { - debug!("Connecting location {location_id} using connection type {connection_type:?}"); + debug!("Received a command to connect to a {connection_type} with ID {location_id}"); let state = handle.state::(); - if connection_type.eq(&ConnectionType::Location) { + if connection_type == ConnectionType::Location { if let Some(location) = Location::find_by_id(&state.get_pool(), location_id).await? { - handle_connection_for_location(&location, preshared_key, handle).await? + debug!( + "Identified location with ID {location_id} as \"{}\", handling connection...", + location.name + ); + handle_connection_for_location(&location, preshared_key, handle.clone()).await?; + reload_tray_menu(&handle).await; + info!("Connected to location {location}"); } else { - error!("Location {location_id} not found"); + error!("Location with ID {location_id} not found in the database, aborting connection attempt"); return Err(Error::NotFound); } } else if let Some(tunnel) = Tunnel::find_by_id(&state.get_pool(), location_id).await? { - handle_connection_for_tunnel(&tunnel, handle).await? + debug!( + "Identified tunnel with ID {location_id} as \"{}\", handling connection...", + tunnel.name + ); + handle_connection_for_tunnel(&tunnel, handle).await?; + info!("Successfully connected to tunnel {tunnel}"); } else { error!("Tunnel {location_id} not found"); return Err(Error::NotFound); } - info!("Connected to location with id: {location_id}"); Ok(()) } +#[tauri::command(async)] +pub async fn start_global_logwatcher(handle: AppHandle) -> Result<(), Error> { + let result = spawn_global_log_watcher_task(&handle, tracing::Level::DEBUG).await; + if let Err(err) = result { + error!("Error while spawning the global log watcher task: {}", err) + } + Ok(()) +} + +#[tauri::command(async)] +pub async fn stop_global_logwatcher(handle: AppHandle) -> Result<(), Error> { + stop_global_log_watcher_task(&handle) +} + #[tauri::command] pub async fn disconnect( - location_id: i64, + location_id: Id, connection_type: ConnectionType, handle: AppHandle, ) -> Result<(), Error> { - debug!("Disconnecting location {location_id}"); let state = handle.state::(); - if let Some(connection) = state.find_and_remove_connection(location_id, &connection_type) { - let interface_name = connection.interface_name.clone(); - debug!("Found active connection"); - trace!("Connection: {:#?}", connection); - disconnect_interface(connection, &state).await?; - debug!("Connection saved"); + let name = get_tunnel_or_location_name(location_id, connection_type, &state).await; + debug!("Received a command to disconnect from the {connection_type} {name}({location_id})"); + + debug!("Removing active connection for {connection_type} {name}({location_id}) from the application's state, if it exists..."); + if let Some(connection) = state.remove_connection(location_id, &connection_type).await { + debug!("Found and removed active connection from the application's state for {connection_type} {name}({location_id})"); + trace!("Connection: {connection:?}"); + disconnect_interface(&connection, &state).await?; + debug!("Emitting the event informing the frontend about the disconnection from {connection_type} {name}({location_id})"); handle.emit_all( - "connection-changed", + CONNECTION_CHANGED, Payload { message: "Created new connection".into(), }, )?; - stop_log_watcher_task(handle, interface_name)?; - info!("Disconnected from location with id: {location_id}"); + debug!("Event emitted successfully"); + stop_log_watcher_task(&handle, &connection.interface_name)?; + reload_tray_menu(&handle).await; + if connection_type == ConnectionType::Location { + let name = get_tunnel_or_location_name(location_id, connection_type, &state).await; + if let Err(err) = maybe_update_instance_config(location_id, &handle).await { + match err { + Error::CoreNotEnterprise => { + debug!( + "Tried to fetch instance config from core after disconnecting from {name}(ID: {location_id}), but the core is not enterprise, so we can't fetch the config." + ); + } + Error::NoToken => { + debug!( + "Tried to fetch instance config from core after disconnecting from {name}(ID: {location_id}), but this location's instance has no polling token, so we can't fetch the config." + ); + } + _ => { + warn!("Error while trying to fetch instance config after disconnecting from {name}(ID: {location_id}): {err}"); + } + } + }; + } + + info!("Disconnected from {connection_type} {name}(ID: {location_id})"); Ok(()) } else { - error!("Error while disconnecting from location with id: {location_id} not found"); + warn!("Couldn't disconnect from {connection_type} {name}(ID: {location_id}), as no active connection was found."); Err(Error::NotFound) } } +/// Triggers poll on location's instance config. Config will be updated if there are no more active +/// connections for this instance. +async fn maybe_update_instance_config(location_id: Id, handle: &AppHandle) -> Result<(), Error> { + let state: State<'_, AppState> = handle.state(); + let mut transaction = state.get_pool().begin().await?; + let Some(location) = Location::find_by_id(&mut *transaction, location_id).await? else { + error!("Location {location_id} not found, skipping config update check"); + return Err(Error::NotFound); + }; + let Some(mut instance) = Instance::find_by_id(&mut *transaction, location.instance_id).await? + else { + error!( + "Instance {} not found, skipping config update check", + location.instance_id + ); + return Err(Error::NotFound); + }; + poll_instance(&mut transaction, &mut instance, handle).await?; + transaction.commit().await?; + handle.emit_all(INSTANCE_UPDATE, ())?; + Ok(()) +} + #[derive(Debug, Serialize, Deserialize)] pub struct Device { - pub id: i64, + pub id: Id, pub name: String, pub pubkey: String, - pub user_id: i64, + pub user_id: Id, pub created_at: i64, } #[must_use] -pub fn device_config_to_location(device_config: DeviceConfig, instance_id: i64) -> Location { +pub fn device_config_to_location(device_config: DeviceConfig, instance_id: Id) -> Location { Location { - id: None, + id: NoId, instance_id, network_id: device_config.network_id, name: device_config.network_name, @@ -109,6 +199,7 @@ pub fn device_config_to_location(device_config: DeviceConfig, instance_id: i64) keepalive_interval: device_config.keepalive_interval.into(), } } + #[derive(Serialize, Deserialize, Debug)] pub struct InstanceResponse { // uuid @@ -119,8 +210,8 @@ pub struct InstanceResponse { #[derive(Serialize, Deserialize, Debug)] pub struct SaveDeviceConfigResponse { - locations: Vec, - instance: Instance, + locations: Vec>, + instance: Instance, } #[tauri::command(async)] @@ -130,70 +221,86 @@ pub async fn save_device_config( app_state: State<'_, AppState>, handle: AppHandle, ) -> Result { - debug!("Received device configuration: {response:#?}."); + debug!("Saving device configuration: {response:#?}."); let mut transaction = app_state.get_pool().begin().await?; let instance_info = response .instance .expect("Missing instance info in device config response"); let mut instance: Instance = instance_info.into(); + if response.token.is_some() { + debug!("The newly saved device config has a polling token, automatic configuration polling will be possible if the core has an enterprise license.") + } else { + warn!( + "Missing polling token for instance {}, core and/or proxy services may need an update, configuration polling won't work", + instance.name, + ); + } + instance.token = response.token; - instance.save(&mut *transaction).await?; + debug!("Saving instance {}", instance.name); + let instance = instance.save(&mut *transaction).await?; + debug!("Saved instance {}", instance.name); let device = response .device .expect("Missing device info in device config response"); - let mut keys = WireguardKeys::new( - instance.id.expect("Missing instance ID"), - device.pubkey, - private_key, + let keys = WireguardKeys::new(instance.id, device.pubkey, private_key); + debug!( + "Saving wireguard key {} for instance {}({})", + keys.pubkey, instance.name, instance.id + ); + let keys = keys.save(&mut *transaction).await?; + debug!( + "Saved wireguard key {} for instance {}({})", + keys.pubkey, instance.name, instance.id ); - keys.save(&mut *transaction).await?; for location in response.configs { - let mut new_location = - device_config_to_location(location, instance.id.expect("Missing instance ID")); - new_location.save(&mut *transaction).await?; + let new_location = device_config_to_location(location, instance.id); + debug!( + "Saving location {} for instance {}({})", + new_location.name, instance.name, instance.id + ); + let new_location = new_location.save(&mut *transaction).await?; + debug!( + "Saved location {} for instance {}({})", + new_location.name, instance.name, instance.id + ); } transaction.commit().await?; - info!("Instance created."); + info!("New instance {} created.", instance); trace!("Created following instance: {instance:#?}"); - let locations = Location::find_by_instance_id( - &app_state.get_pool(), - instance.id.expect("Missing instance ID"), - ) - .await?; + let locations = Location::find_by_instance_id(&app_state.get_pool(), instance.id).await?; trace!("Created following locations: {locations:#?}"); - handle.emit_all("instance-update", ())?; + handle.emit_all(INSTANCE_UPDATE, ())?; let res: SaveDeviceConfigResponse = SaveDeviceConfigResponse { locations, instance, }; - info!("Device configuration saved."); + reload_tray_menu(&handle).await; Ok(res) } #[tauri::command(async)] -pub async fn all_instances(app_state: State<'_, AppState>) -> Result, Error> { - debug!("Retrieving all instances."); - +pub async fn all_instances(app_state: State<'_, AppState>) -> Result>, Error> { + debug!("Getting information about all instances."); let instances = Instance::all(&app_state.get_pool()).await?; - debug!("Found ({}) instances", instances.len()); + trace!( + "Found {} instances to return information about.", + instances.len() + ); trace!("Instances found: {instances:#?}"); - let mut instance_info: Vec = vec![]; - let connection_ids: Vec = app_state.get_connection_id_by_type(&ConnectionType::Location); + let mut instance_info = Vec::new(); + let connection_ids = app_state + .get_connection_id_by_type(&ConnectionType::Location) + .await; for instance in instances { - let Some(instance_id) = instance.id else { - continue; - }; - let locations = Location::find_by_instance_id(&app_state.get_pool(), instance_id).await?; - let location_ids: Vec = locations - .iter() - .filter_map(|location| location.id) - .collect(); + let locations = Location::find_by_instance_id(&app_state.get_pool(), instance.id).await?; + let location_ids: Vec = locations.iter().map(|location| location.id).collect(); let connected = connection_ids .iter() .any(|item1| location_ids.iter().any(|item2| item1 == item2)); - let keys = WireguardKeys::find_by_instance_id(&app_state.get_pool(), instance_id) + let keys = WireguardKeys::find_by_instance_id(&app_state.get_pool(), instance.id) .await? .ok_or(Error::NotFound)?; instance_info.push(InstanceInfo { @@ -204,17 +311,22 @@ pub async fn all_instances(app_state: State<'_, AppState>) -> Result) -> fmt::Result { + write!(f, "{}", self.name) + } } #[tauri::command(async)] pub async fn all_locations( - instance_id: i64, + instance_id: Id, app_state: State<'_, AppState>, ) -> Result, Error> { - debug!("Retrieving all locations."); + let instance = match Instance::find_by_id(&app_state.get_pool(), instance_id).await? { + Some(instance) => instance, + None => { + error!("Tried to get all locations for the instance with ID {instance_id}, but the instance was not found."); + return Err(Error::NotFound); + } + }; + trace!( + "Getting information about all locations for instance {}.", + instance.name + ); let locations = Location::find_by_instance_id(&app_state.get_pool(), instance_id).await?; - let active_locations_ids: Vec = - app_state.get_connection_id_by_type(&ConnectionType::Location); - let mut location_info = vec![]; + trace!( + "Found {} locations for instance {instance} to return information about.", + locations.len() + ); + let active_locations_ids: Vec = app_state + .get_connection_id_by_type(&ConnectionType::Location) + .await; + let mut location_info = Vec::new(); for location in locations { let info = LocationInfo { - id: location.id.expect("Missing location ID"), + id: location.id, instance_id: location.instance_id, name: location.name, address: location.address, endpoint: location.endpoint, - active: active_locations_ids.contains(&location.id.expect("Missing location ID")), + active: active_locations_ids.contains(&location.id), route_all_traffic: location.route_all_traffic, connection_type: ConnectionType::Location, pubkey: location.pubkey, @@ -252,10 +385,9 @@ pub async fn all_locations( }; location_info.push(info); } - info!("Locations retrieved({})", location_info.len()); - debug!( - "Returning {} locations for instance {instance_id}", - location_info.len(), + trace!( + "Returning information about {} locations for instance {instance}", + location_info.len() ); trace!("Locations returned:\n{location_info:#?}"); @@ -264,7 +396,7 @@ pub async fn all_locations( #[derive(Serialize, Debug)] pub struct LocationInterfaceDetails { - pub location_id: i64, + pub location_id: Id, // client interface config pub name: String, // interface name generated from location name pub pubkey: String, // own pubkey of client interface @@ -281,7 +413,7 @@ pub struct LocationInterfaceDetails { #[tauri::command(async)] pub async fn location_interface_details( - location_id: i64, + location_id: Id, connection_type: ConnectionType, app_state: State<'_, AppState>, ) -> Result { @@ -294,37 +426,125 @@ pub async fn location_interface_details( #[tauri::command(async)] pub async fn update_instance( - instance_id: i64, + instance_id: Id, response: DeviceConfigResponse, app_state: State<'_, AppState>, app_handle: AppHandle, ) -> Result<(), Error> { - debug!("Received update_instance command"); + debug!("Received command to update instance with id {instance_id}"); trace!("Processing following response:\n {response:#?}"); let pool = app_state.get_pool(); if let Some(mut instance) = Instance::find_by_id(&pool, instance_id).await? { - // fetch existing locations for given instance - let mut current_locations = Location::find_by_instance_id(&pool, instance_id).await?; - + debug!("The instance with id {instance_id} to update was found: {instance}"); let mut transaction = pool.begin().await?; + do_update_instance(&mut transaction, &mut instance, response).await?; + transaction.commit().await?; - // update instance - debug!("Updating instance {instance_id}."); - let instance_info = response - .instance - .expect("Missing instance info in device config response"); - instance.name = instance_info.name; - instance.url = instance_info.url; - instance.proxy_url = instance_info.proxy_url; - instance.username = instance_info.username; - instance.save(&mut *transaction).await?; + app_handle.emit_all(INSTANCE_UPDATE, ())?; + reload_tray_menu(&app_handle).await; + Ok(()) + } else { + error!("Instance to update with id {instance_id} was not found, aborting update"); + Err(Error::NotFound) + } +} + +/// Returns true if configuration in instance_info differs from current configuration +pub async fn locations_changed( + transaction: &mut Transaction<'_, Sqlite>, + instance: &Instance, + device_config: &DeviceConfigResponse, +) -> Result { + let db_locations: Vec> = + Location::find_by_instance_id(transaction.as_mut(), instance.id) + .await? + .into_iter() + .map(Location::::from) + // ignore route_all_traffic flag as core does not have it + .map(|mut location| { + location.route_all_traffic = false; + location + }) + .collect(); + let db_locations: HashSet> = HashSet::from_iter(db_locations); + let core_locations: Vec> = device_config + .configs + .iter() + .map(|config| device_config_to_location(config.clone(), instance.id)) + .map(Location::::from) + // just to make sure we are really on the same page + .map(|mut location| { + location.route_all_traffic = false; + location + }) + .collect(); + let core_locations: HashSet> = HashSet::from_iter(core_locations); + + Ok(db_locations != core_locations) +} + +pub async fn do_update_instance( + transaction: &mut Transaction<'_, Sqlite>, + instance: &mut Instance, + response: DeviceConfigResponse, +) -> Result<(), Error> { + // update instance + debug!("Updating instance {}", instance); + let locations_changed = locations_changed(transaction, instance, &response).await?; + let instance_info = response + .instance + .expect("Missing instance info in device config response"); + instance.name = instance_info.name; + instance.url = instance_info.url; + instance.proxy_url = instance_info.proxy_url; + instance.username = instance_info.username; + // Make sure to update the locations too if we are disabling all traffic + if instance.disable_all_traffic != instance_info.disable_all_traffic + && instance_info.disable_all_traffic + { + debug!( + "Disabling all traffic for all locations of instance {}.", + instance + ); + Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; + debug!( + "Disabled all traffic for all locations of instance {}.", + instance + ); + } + instance.disable_all_traffic = instance_info.disable_all_traffic; + instance.enterprise_enabled = instance_info.enterprise_enabled; + // Token may be empty if it was not issued + // This happens during polling, as core doesn't issue a new token for polling request + if response.token.is_some() { + instance.token = response.token; + debug!("Set polling token for instance {}", instance.name); + } else { + debug!( + "No polling token received for instance {}, not updating", + instance.name + ); + } + instance.save(transaction.as_mut()).await?; + debug!( + "A new base configuration has been applied to instance {}, even if nothing changed", + instance + ); + // check if locations have changed + if locations_changed { // process locations received in response - debug!("Updating locations for instance {instance_id}."); + debug!( + "Updating locations for instance {}({}).", + instance.name, instance.id + ); + // fetch existing locations for given instance + let mut current_locations = + Location::find_by_instance_id(transaction.as_mut(), instance.id).await?; for location in response.configs { // parse device config - let mut new_location = device_config_to_location(location, instance_id); + let new_location = device_config_to_location(location, instance.id); // check if location is already present in current locations if let Some(position) = current_locations @@ -334,8 +554,8 @@ pub async fn update_instance( // remove from list of existing locations let mut current_location = current_locations.remove(position); debug!( - "Updating existing location {} for instance {instance_id}.", - current_location.name + "Updating existing location {}({}) for instance {}({}).", + current_location.name, current_location.id, instance.name, instance.id, ); // update existing location current_location.name = new_location.name; @@ -346,37 +566,43 @@ pub async fn update_instance( current_location.mfa_enabled = new_location.mfa_enabled; current_location.keepalive_interval = new_location.keepalive_interval; current_location.dns = new_location.dns; - current_location.save(&mut *transaction).await?; + current_location.save(transaction.as_mut()).await?; info!( - "Location {} updated for instance {instance_id}.", - current_location.name + "Location {} configuration updated for instance {}", + current_location, instance, ); } else { // create new location - debug!("Creating new location for instance {instance_id}."); - new_location.save(&mut *transaction).await?; - info!("New location created for instance {instance_id}."); + debug!( + "Creating new location {new_location} for instance {}", + instance + ); + let new_location = new_location.save(transaction.as_mut()).await?; + info!( + "New location {} created for instance {}", + new_location, instance + ); } } - info!("Locations updated for instance {instance_id}."); // remove locations which were present in current locations // but no longer found in core response - debug!("Removing locations for instance {instance_id}."); + debug!("Removing locations for instance {}.", instance); for removed_location in current_locations { - removed_location.delete(&mut *transaction).await?; + removed_location.delete(transaction.as_mut()).await?; + info!( + "Removed location {} for instance {} during instance update", + removed_location, instance + ); } - info!("Locations removed for instance {instance_id}."); - - transaction.commit().await?; - - info!("Instance {instance_id} updated"); - app_handle.emit_all("instance-update", ())?; - Ok(()) + debug!("Finished updating locations for instance {}", instance); } else { - error!("Instance with id {instance_id} not found"); - Err(Error::NotFound) + info!( + "Locations for instance {} didn't change. Not updating them.", + instance + ); } + Ok(()) } /// If `datetime` is Some, parses the date string, otherwise returns `DateTime` one hour ago. @@ -395,12 +621,11 @@ pub enum DateTimeAggregation { impl DateTimeAggregation { /// Returns database format string for given aggregation variant #[must_use] - pub fn fstring(&self) -> String { + pub fn fstring(&self) -> &'static str { match self { Self::Hour => "%Y-%m-%d %H:00:00", Self::Second => "%Y-%m-%d %H:%M:%S", } - .into() } } @@ -409,26 +634,25 @@ fn get_aggregation(from: NaiveDateTime) -> Result { let aggregation = match Utc::now().naive_utc() - from { duration if duration >= Duration::hours(8) => Ok(DateTimeAggregation::Hour), duration if duration < Duration::zero() => Err(Error::InternalError(format!( - "Negative duration between dates: now ({}) and {}", + "Negative duration between dates: now ({}) and {from}", Utc::now().naive_utc(), - from ))), _ => Ok(DateTimeAggregation::Second), }?; Ok(aggregation) } -#[tauri::command] +#[tauri::command(async)] pub async fn location_stats( - location_id: i64, + location_id: Id, connection_type: ConnectionType, from: Option, app_state: State<'_, AppState>, -) -> Result, Error> { +) -> Result>, Error> { trace!("Location stats command received"); let from = parse_timestamp(from)?.naive_utc(); let aggregation = get_aggregation(from)?; - let stats: Vec = match connection_type { + let stats = match connection_type { ConnectionType::Location => LocationStats::all_by_location_id( &app_state.get_pool(), location_id, @@ -451,9 +675,9 @@ pub async fn location_stats( Ok(stats) } -#[tauri::command] +#[tauri::command(async)] pub async fn all_connections( - location_id: i64, + location_id: Id, connection_type: ConnectionType, app_state: State<'_, AppState>, ) -> Result, Error> { @@ -474,89 +698,123 @@ pub async fn all_connections( .collect() } }; - info!("Connections retrieved({})", connections.len()); - trace!("Connections found:\n{:#?}", connections); + debug!("Connections retrieved({})", connections.len()); + trace!("Connections found:\n{connections:#?}"); Ok(connections) } -#[tauri::command] +#[tauri::command(async)] pub async fn all_tunnel_connections( - location_id: i64, + location_id: Id, app_state: State<'_, AppState>, ) -> Result, Error> { debug!("Retrieving connections for location {location_id}"); let connections = TunnelConnectionInfo::all_by_tunnel_id(&app_state.get_pool(), location_id).await?; - info!("Tunnel connections retrieved({})", connections.len()); - trace!("Connections found:\n{:#?}", connections); + debug!("Tunnel connections retrieved({})", connections.len()); + trace!("Connections found:\n{connections:#?}"); Ok(connections) } -#[tauri::command] +#[tauri::command(async)] pub async fn active_connection( - location_id: i64, + location_id: Id, connection_type: ConnectionType, handle: AppHandle, ) -> Result, Error> { let state = handle.state::(); - debug!("Retrieving active connection for location with id: {location_id}"); - debug!("Location found"); - let connection = state.find_connection(location_id, connection_type); + let name = get_tunnel_or_location_name(location_id, connection_type, &state).await; + debug!( + "Checking if there is an active connection for location {}(ID: {})", + name, location_id + ); + let connection = state.find_connection(location_id, connection_type).await; if connection.is_some() { - debug!("Active connection found"); + debug!( + "Found active connection for location {}(ID: {})", + name, location_id + ) } - trace!("Connection retrieved:\n{:#?}", connection); - info!("Connection retrieved"); + trace!("Connection retrieved:\n{connection:#?}"); + debug!( + "Active connection information for location {}(ID: {}) has been found, returning connection information", + name, location_id + ); Ok(connection) } -#[tauri::command] +#[tauri::command(async)] pub async fn last_connection( - location_id: i64, + location_id: Id, connection_type: ConnectionType, app_state: State<'_, AppState>, -) -> Result, Error> { - debug!("Retrieving last connection for location {location_id} with type {connection_type:?}"); +) -> Result>, Error> { + let name = get_tunnel_or_location_name(location_id, connection_type, &app_state).await; + + debug!( + "Retrieving last connection information for {connection_type} {name}(ID: {location_id})" + ); if connection_type == ConnectionType::Location { if let Some(connection) = Connection::latest_by_location_id(&app_state.get_pool(), location_id).await? { - info!("Found last connection at {}", connection.end); + debug!( + "Last connection to {connection_type} {name} has been made at {}", + connection.end + ); Ok(Some(connection.into())) } else { + debug!("No previous connections to {connection_type} {name} have been found."); Ok(None) } } else if let Some(connection) = TunnelConnection::latest_by_tunnel_id(&app_state.get_pool(), location_id).await? { - info!("Found last connection at {}", connection.end); + debug!( + "Last connection to {connection_type} {name} has been made at {}", + connection.end + ); Ok(Some(connection.into())) } else { - info!("No last connection found"); + debug!("No previous connections to {connection_type} {name} have been found."); Ok(None) } } -#[tauri::command] +#[tauri::command(async)] pub async fn update_location_routing( - location_id: i64, + location_id: Id, route_all_traffic: bool, connection_type: ConnectionType, handle: AppHandle, ) -> Result<(), Error> { let app_state = handle.state::(); debug!("Updating location routing {location_id} with {connection_type:?}"); + let name = get_tunnel_or_location_name(location_id, connection_type, &app_state).await; match connection_type { ConnectionType::Location => { if let Some(mut location) = Location::find_by_id(&app_state.get_pool(), location_id).await? { + // Check if the instance has route_all_traffic disabled + let instance = Instance::find_by_id(&app_state.get_pool(), location.instance_id) + .await? + .ok_or(Error::NotFound)?; + if instance.disable_all_traffic && route_all_traffic { + error!( + "Couldn't update location routing: instance with id {} has route_all_traffic disabled.", instance.id + ); + return Err(Error::InternalError( + "Instance has route_all_traffic disabled".into(), + )); + } + location.route_all_traffic = route_all_traffic; location.save(&app_state.get_pool()).await?; - info!("Location routing updated for location {location_id}"); + debug!("Location routing updated for location {name}(ID: {location_id})"); handle.emit_all( - "location-update", + LOCATION_UPDATE, Payload { message: "Location routing updated".into(), }, @@ -576,7 +834,7 @@ pub async fn update_location_routing( tunnel.save(&app_state.get_pool()).await?; info!("Tunnel routing updated for tunnel {location_id}"); handle.emit_all( - "location-update", + LOCATION_UPDATE, Payload { message: "Tunnel routing updated".into(), }, @@ -590,17 +848,16 @@ pub async fn update_location_routing( } } -#[tauri::command] +#[tauri::command(async)] pub async fn get_settings(handle: AppHandle) -> Result { - debug!("Retrieving settings"); let app_state = handle.state::(); let settings = Settings::get(&app_state.get_pool()).await?; - info!("Settings retrieved"); Ok(settings) } -#[tauri::command] +#[tauri::command(async)] pub async fn update_settings(data: SettingsPatch, handle: AppHandle) -> Result { + debug!("Updating settings"); let app_state = handle.state::(); let pool = &app_state.get_pool(); trace!("Pool received"); @@ -609,9 +866,9 @@ pub async fn update_settings(data: SettingsPatch, handle: AppHandle) -> Result {} + Ok(()) => {} Err(e) => { error!( "Tray configuration update failed during settings update. err : {}", @@ -619,69 +876,89 @@ pub async fn update_settings(data: SettingsPatch, handle: AppHandle) -> Result Result<(), Error> { - debug!("Deleting instance {instance_id}"); +pub async fn delete_instance(instance_id: Id, handle: AppHandle) -> Result<(), Error> { + debug!("Deleting instance with ID {instance_id}"); let app_state = handle.state::(); let mut client = app_state.client.clone(); let pool = &app_state.get_pool(); - if let Some(instance) = Instance::find_by_id(pool, instance_id).await? { - let instance_locations = Location::find_by_instance_id(pool, instance_id).await?; - for location in instance_locations.iter() { - if let Some(location_id) = location.id { - if let Some(connection) = - app_state.find_and_remove_connection(location_id, &ConnectionType::Location) - { - debug!("Found active connection for location({location_id}), closing...",); - let request = RemoveInterfaceRequest { - interface_name: connection.interface_name.clone(), - pre_down: None, - post_down: None, - }; - client.remove_interface(request).await.map_err(|status| { - let msg = - format!("Error occured while removing interface {} for location {location_id}, status: {status}", - connection.interface_name - ); - error!("{msg}"); - Error::InternalError(msg) - })?; - info!("Connection closed and interface removed"); - } - } - } - instance.delete(pool).await?; - } else { - error!("Instance {instance_id} not found"); + let Some(instance) = Instance::find_by_id(pool, instance_id).await? else { + error!("Couldn't delete instance: instance with ID {instance_id} could not be found."); return Err(Error::NotFound); + }; + debug!("The instance that is being deleted has been identified as {instance}"); + + let instance_locations = Location::find_by_instance_id(pool, instance_id).await?; + if !instance_locations.is_empty() { + debug!( + "Found locations associated with the instance {instance}, closing their connections..." + ) } - handle.emit_all("instance-update", ())?; - info!("Instance {instance_id}, deleted"); + for location in instance_locations { + if let Some(connection) = app_state + .remove_connection(location.id, &ConnectionType::Location) + .await + { + debug!("Found active connection for location {location}, closing..."); + let request = RemoveInterfaceRequest { + interface_name: connection.interface_name.clone(), + endpoint: location.endpoint.clone(), + }; + client.remove_interface(request).await.map_err(|status| { + error!("Error occured while removing interface {} for location {location}, status: {status}", connection.interface_name); + Error::InternalError(format!( + "There was an error while removing interface for location {location}, error message: {}. Check logs for more details.", status.message() + )) + })?; + info!("The connection to location {location} has been closed, as it was associated with the instance {instance} that is being deleted."); + } + } + instance.delete(pool).await?; + reload_tray_menu(&handle).await; + + handle.emit_all(INSTANCE_UPDATE, ())?; + info!("Successfully deleted instance {instance}."); Ok(()) } -#[tauri::command(async)] -pub async fn parse_tunnel_config(config: String) -> Result { + +#[tauri::command] +pub fn parse_tunnel_config(config: &str) -> Result { debug!("Parsing config file"); - let tunnel_config = parse_wireguard_config(&config).map_err(|error| { + let tunnel_config = parse_wireguard_config(config).map_err(|error| { error!("{error}"); Error::ConfigParseError(error.to_string()) })?; info!("Config file parsed"); Ok(tunnel_config) } + #[tauri::command(async)] -pub async fn save_tunnel(mut tunnel: Tunnel, handle: AppHandle) -> Result<(), Error> { +pub async fn update_tunnel(mut tunnel: Tunnel, handle: AppHandle) -> Result<(), Error> { let app_state = handle.state::(); - debug!("Received tunnel configuration: {tunnel:#?}"); + debug!("Received tunnel configuration to update: {tunnel:?}"); tunnel.save(&app_state.get_pool()).await?; - info!("Saved tunnel {tunnel:#?}"); + info!("The tunnel {tunnel} configuration has been updated."); handle.emit_all( - "location-update", + LOCATION_UPDATE, + Payload { + message: "Tunnel saved".into(), + }, + )?; + Ok(()) +} + +#[tauri::command(async)] +pub async fn save_tunnel(tunnel: Tunnel, handle: AppHandle) -> Result<(), Error> { + let app_state = handle.state::(); + debug!("Received tunnel configuration to save: {tunnel:?}"); + let tunnel = tunnel.save(&app_state.get_pool()).await?; + info!("The tunnel {tunnel} configuration has been saved."); + handle.emit_all( + LOCATION_UPDATE, Payload { message: "Tunnel saved".into(), }, @@ -690,8 +967,8 @@ pub async fn save_tunnel(mut tunnel: Tunnel, handle: AppHandle) -> Result<(), Er } #[derive(Debug, Serialize, Deserialize)] -pub struct TunnelInfo { - pub id: Option, +pub struct TunnelInfo { + pub id: I, pub name: String, pub address: String, pub endpoint: String, @@ -701,14 +978,16 @@ pub struct TunnelInfo { } #[tauri::command(async)] -pub async fn all_tunnels(app_state: State<'_, AppState>) -> Result, Error> { - debug!("Retrieving all instances."); +pub async fn all_tunnels(app_state: State<'_, AppState>) -> Result>, Error> { + trace!("Getting information about all tunnels"); let tunnels = Tunnel::all(&app_state.get_pool()).await?; - debug!("Found ({}) tunnels", tunnels.len()); + trace!("Found ({}) tunnels to get information about", tunnels.len()); trace!("Tunnels found: {tunnels:#?}"); - let mut tunnel_info: Vec = vec![]; - let active_tunnel_ids: Vec = app_state.get_connection_id_by_type(&ConnectionType::Tunnel); + let mut tunnel_info = Vec::new(); + let active_tunnel_ids = app_state + .get_connection_id_by_type(&ConnectionType::Tunnel) + .await; for tunnel in tunnels { tunnel_info.push(TunnelInfo { @@ -717,82 +996,89 @@ pub async fn all_tunnels(app_state: State<'_, AppState>) -> Result, -) -> Result { - debug!("Retrieving Tunnel with ID {tunnel_id}."); +) -> Result, Error> { + debug!("Retrieving details about tunnel with ID {tunnel_id}."); if let Some(tunnel) = Tunnel::find_by_id(&app_state.get_pool(), tunnel_id).await? { - info!("Found tunnel {tunnel_id}"); + debug!("The tunnel {tunnel} has been found, returning its details."); Ok(tunnel) } else { - error!("Tunnel with ID: {tunnel_id}, not found"); + error!("Tunnel with ID {tunnel_id} not found, cannot retrieve its details."); Err(Error::NotFound) } } #[tauri::command(async)] -pub async fn delete_tunnel(tunnel_id: i64, handle: AppHandle) -> Result<(), Error> { - debug!("Deleting tunnel {tunnel_id}"); +pub async fn delete_tunnel(tunnel_id: Id, handle: AppHandle) -> Result<(), Error> { + debug!("Deleting tunnel with ID {tunnel_id}"); let app_state = handle.state::(); let mut client = app_state.client.clone(); let pool = &app_state.get_pool(); - if let Some(tunnel) = Tunnel::find_by_id(pool, tunnel_id).await? { - if let Some(connection) = - app_state.find_and_remove_connection(tunnel_id, &ConnectionType::Tunnel) - { - debug!("Found active connection for tunnel({tunnel_id}), closing...",); - if let Some(pre_down) = &tunnel.pre_down { - debug!("Executing specified PreDown command: {pre_down}"); - let _ = execute_command(pre_down); - info!("Executed specified PreDown command: {pre_down}"); - } - let request = RemoveInterfaceRequest { - interface_name: connection.interface_name.clone(), - pre_down: None, - post_down: None, - }; - client - .remove_interface(request) - .await - .map_err(|status| { - let msg = - format!("Error occured while removing interface {} for tunnel {tunnel_id}, status: {status}", - connection.interface_name - ); - error!("{msg}"); - Error::InternalError(msg) - })?; - if let Some(post_down) = &tunnel.post_down { - debug!("Executing specified PostDown command: {post_down}"); - let _ = execute_command(post_down); - info!("Executed specified PostDown command: {post_down}"); - } - info!("Connection closed and interface removed"); - } - tunnel.delete(pool).await?; - } else { - error!("Tunnel {tunnel_id} not found"); + let Some(tunnel) = Tunnel::find_by_id(pool, tunnel_id).await? else { + error!("The tunnel to delete with ID {tunnel_id} could not be found, cannot delete."); return Err(Error::NotFound); + }; + debug!("The tunnel to delete with ID {tunnel_id} has been identified as {tunnel}, proceeding with deletion."); + + if let Some(connection) = app_state + .remove_connection(tunnel_id, &ConnectionType::Tunnel) + .await + { + debug!("Found active connection for tunnel {tunnel} which is being deleted, closing the connection."); + if let Some(pre_down) = &tunnel.pre_down { + debug!("Executing defined PreDown command before removing the interface {} for the tunnel {tunnel}: {pre_down}", connection.interface_name); + let _ = execute_command(pre_down); + info!("Executed defined PreDown command before removing the interface {} for the tunnel {tunnel}: {pre_down}", connection.interface_name); + } + let request = RemoveInterfaceRequest { + interface_name: connection.interface_name.clone(), + endpoint: tunnel.endpoint.clone(), + }; + client + .remove_interface(request) + .await + .map_err(|status| { + error!("An error occured while removing interface {} for tunnel {tunnel}, status: {status}", + connection.interface_name); + Error::InternalError( + format!( + "An error occured while removing interface {} for tunnel {tunnel}, error message: {}. Check logs for more details.", connection.interface_name, status.message() + ) + ) + })?; + info!("Network interface {} has been removed and the connection to tunnel {tunnel} has been closed.", connection.interface_name); + if let Some(post_down) = &tunnel.post_down { + debug!("Executing defined PostDown command after removing the interface {} for the tunnel {tunnel}: {post_down}", connection.interface_name); + let _ = execute_command(post_down); + info!("Executed defined PostDown command after removing the interface {} for the tunnel {tunnel}: {post_down}", connection.interface_name); + } } - info!("Tunnel {tunnel_id}, deleted"); + tunnel.delete(pool).await?; + + info!("Successfully deleted tunnel {tunnel}"); Ok(()) } #[tauri::command] -pub async fn open_link(link: &str) -> Result<(), Error> { +pub fn open_link(link: &str) -> Result<(), Error> { match webbrowser::open(link) { - Ok(_) => Ok(()), + Ok(()) => Ok(()), Err(e) => Err(Error::CommandError(e.to_string())), } } @@ -818,7 +1104,7 @@ pub async fn get_latest_app_version(handle: AppHandle) -> Result Result = - response.json::().await; + let response_json = response.json::().await; let response = response_json.map_err(|err| { error!("Failed to deserialize latest application version response {err}"); Error::CommandError(err.to_string()) })?; - info!("Latest application version fetched: {}", response.version); + info!( + "The latest release version of the application available for download is {}, it was released on {}.", + response.version, response.release_date + ); Ok(response) } else { let err = res.err().unwrap(); diff --git a/src-tauri/src/database/mod.rs b/src-tauri/src/database/mod.rs index e0dca6d5..27696978 100644 --- a/src-tauri/src/database/mod.rs +++ b/src-tauri/src/database/mod.rs @@ -1,7 +1,16 @@ pub mod models; -use std::fs; +use std::{env, fs}; +pub use models::{ + connection::{ActiveConnection, Connection, ConnectionInfo}, + instance::{Instance, InstanceInfo}, + location::Location, + location_stats::LocationStats, + settings::{Settings, SettingsLogLevel, SettingsTheme, TrayIconTheme}, + tunnel::{Tunnel, TunnelConnection, TunnelConnectionInfo, TunnelStats}, + wireguard_keys::WireguardKeys, +}; use tauri::AppHandle; use crate::error::Error; @@ -10,64 +19,73 @@ const DB_NAME: &str = "defguard.db"; pub type DbPool = sqlx::SqlitePool; -// Check if a database file exists, and create one if it does not. +/// Initializes the database pub async fn init_db(app_handle: &AppHandle) -> Result { - let app_dir = app_handle - .path_resolver() - .app_data_dir() - .ok_or(Error::Config)?; - // Create app data directory if it doesnt exist - debug!("Creating app data dir at: {}", app_dir.to_string_lossy()); - fs::create_dir_all(&app_dir)?; - info!("Created app data dir at: {}", app_dir.to_string_lossy()); - let db_path = app_dir.join(DB_NAME); - if db_path.exists() { - info!( - "Database exists skipping creating database. Database path: {}", - db_path.to_string_lossy() - ); - } else { - debug!( - "Database not found creating database file at: {}", - db_path.to_string_lossy() - ); - fs::File::create(&db_path)?; - info!( - "Database file succesfully created at: {}", - db_path.to_string_lossy() - ); - } - debug!("Connecting to database: {}", db_path.to_string_lossy()); - let pool = DbPool::connect(&format!( - "sqlite://{}", - db_path.to_str().expect("Failed to format DB path") - )) - .await?; - debug!("Running migrations."); + let db_url = prepare_db_url(app_handle)?; + debug!("Connecting to database: {}", db_url); + let pool = DbPool::connect(&db_url).await?; + debug!("Running database migrations, if there are any."); sqlx::migrate!().run(&pool).await?; + debug!("Applied all database migrations that were pending. If any."); Settings::init_defaults(&pool).await?; - info!("Applied migrations."); Ok(pool) } -pub async fn info(pool: &DbPool) -> Result<(), Error> { - let instances = Instance::all(pool).await?; - let locations = Location::all(pool).await?; - debug!( - "Found {} locations in {} instances", - locations.len(), - instances.len() - ); - trace!("Instances Found:\n {instances:#?}"); - trace!("Locations Found:\n {locations:#?}"); - Ok(()) +/// Returns database url. Checks for custom url in `DATABASE_URL` env variable. +/// Handles creating appropriate directories if they don't exist. +fn prepare_db_url(app_handle: &AppHandle) -> Result { + if let Ok(url) = env::var("DATABASE_URL") { + info!("The default database location has been just overridden by the DATABASE_URL environment variable. The application will use the database located at: {url}"); + Ok(url) + } else { + debug!("A production database will be used as no custom DATABASE_URL was provided."); + // Check if database directory and file exists, create if they don't. + let app_dir = app_handle + .path_resolver() + .app_data_dir() + .ok_or(Error::Config( + "Application data directory is not defined. Cannot proceed. Is the application running on a supported platform?".to_string() + ))?; + if app_dir.exists() { + debug!( + "Application data directory already exists at: {}, skipping its creation.", + app_dir.to_string_lossy() + ); + } else { + debug!( + "Creating application data directory at: {}", + app_dir.to_string_lossy() + ); + fs::create_dir_all(&app_dir)?; + debug!( + "Created application data directory at: {}", + app_dir.to_string_lossy() + ); + } + let db_path = app_dir.join(DB_NAME); + if db_path.exists() { + debug!( + "Database file already exists at: {}. Skipping its creation.", + db_path.to_string_lossy() + ); + } else { + debug!( + "Database file not found at {}. Creating a new one.", + db_path.to_string_lossy() + ); + fs::File::create(&db_path)?; + info!( + "A new, empty database file has been created at: {} as no previous database file was found. This file will be used to store application data.", + db_path.to_string_lossy() + ); + } + debug!( + "Application's database file is located at: {}", + db_path.to_string_lossy() + ); + Ok(format!( + "sqlite://{}", + db_path.to_str().expect("Failed to format DB path") + )) + } } - -pub use models::{ - connection::{ActiveConnection, Connection, ConnectionInfo}, - instance::{Instance, InstanceInfo}, - location::{Location, LocationStats}, - settings::{Settings, SettingsLogLevel, SettingsTheme, TrayIconTheme}, - tunnel::{Tunnel, TunnelConnection, TunnelConnectionInfo, TunnelStats}, - wireguard_keys::WireguardKeys, -}; diff --git a/src-tauri/src/database/models/connection.rs b/src-tauri/src/database/models/connection.rs index 581e9fb6..6dd712fc 100644 --- a/src-tauri/src/database/models/connection.rs +++ b/src-tauri/src/database/models/connection.rs @@ -1,84 +1,94 @@ use chrono::{NaiveDateTime, Utc}; use serde::Serialize; -use sqlx::{query, query_as, FromRow}; +use sqlx::{query_as, query_scalar, SqliteExecutor}; -use crate::{ - database::DbPool, error::Error, CommonConnection, CommonConnectionInfo, ConnectionType, -}; +use super::{Id, NoId}; +use crate::{error::Error, CommonConnection, CommonConnectionInfo, ConnectionType}; -#[derive(FromRow, Debug, Serialize, Clone)] -pub struct Connection { - pub id: Option, - pub location_id: i64, +#[derive(Debug, Serialize, Clone)] +pub struct Connection { + pub id: I, + pub location_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, } -impl Connection { - pub async fn save(&mut self, pool: &DbPool) -> Result<(), Error> { - let result = query!( +impl Connection { + pub async fn save<'e, E>(self, executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let id = query_scalar!( "INSERT INTO connection (location_id, connected_from, start, end) \ - VALUES ($1, $2, $3, $4) \ - RETURNING id;", + VALUES ($1, $2, $3, $4) RETURNING id \"id!\"", self.location_id, self.connected_from, self.start, self.end, ) - .fetch_one(pool) + .fetch_one(executor) .await?; - self.id = Some(result.id); - Ok(()) + + Ok(Connection:: { + id, + location_id: self.location_id, + connected_from: self.connected_from, + start: self.start, + end: self.end, + }) } - pub async fn all_by_location_id(pool: &DbPool, location_id: i64) -> Result, Error> { + pub async fn all_by_location_id<'e, E>( + executor: E, + location_id: Id, + ) -> Result>, Error> + where + E: SqliteExecutor<'e>, + { let connections = query_as!( Connection, - r#" - SELECT id, location_id, connected_from, start, end - FROM connection - WHERE location_id = $1 - "#, + "SELECT id, location_id, connected_from, start, end \ + FROM connection WHERE location_id = $1", location_id ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(connections) } - pub async fn latest_by_location_id( - pool: &DbPool, - location_id: i64, - ) -> Result, Error> { + pub async fn latest_by_location_id<'e, E>( + executor: E, + location_id: Id, + ) -> Result>, Error> + where + E: SqliteExecutor<'e>, + { let connection = query_as!( Connection, - r#" - SELECT id, location_id, connected_from, start, end - FROM connection - WHERE location_id = $1 - ORDER BY end DESC - LIMIT 1 - "#, + "SELECT id, location_id, connected_from, start, end \ + FROM connection WHERE location_id = $1 \ + ORDER BY end DESC LIMIT 1", location_id ) - .fetch_optional(pool) + .fetch_optional(executor) .await?; Ok(connection) } } /// Historical connection -#[derive(FromRow, Debug, Serialize)] +#[derive(Debug, Serialize)] pub struct ConnectionInfo { - pub id: i64, - pub location_id: i64, + pub id: Id, + pub location_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, pub upload: Option, pub download: Option, } + impl From for CommonConnectionInfo { fn from(val: ConnectionInfo) -> Self { CommonConnectionInfo { @@ -94,43 +104,39 @@ impl From for CommonConnectionInfo { } impl ConnectionInfo { - pub async fn all_by_location_id(pool: &DbPool, location_id: i64) -> Result, Error> { + pub async fn all_by_location_id<'e, E>(executor: E, location_id: Id) -> Result, Error> + where + E: SqliteExecutor<'e>, + { // Because we store interface information for given timestamp select last upload and download // before connection ended // FIXME: Optimize query let connections = query_as!( ConnectionInfo, - r#" - SELECT - c.id as "id!", - c.location_id as "location_id!", - c.connected_from as "connected_from!", - c.start as "start!", - c.end as "end!", - COALESCE(( - SELECT ls.upload - FROM location_stats AS ls - WHERE ls.location_id = c.location_id - AND ls.collected_at >= c.start - AND ls.collected_at <= c.end - ORDER BY ls.collected_at DESC - LIMIT 1 - ), 0) as "upload: _", - COALESCE(( - SELECT ls.download - FROM location_stats AS ls - WHERE ls.location_id = c.location_id - AND ls.collected_at >= c.start - AND ls.collected_at <= c.end - ORDER BY ls.collected_at DESC - LIMIT 1 - ), 0) as "download: _" - FROM connection AS c WHERE location_id = $1 - ORDER BY start DESC; - "#, + "SELECT c.id, c.location_id, \ + c.connected_from \"connected_from!\", c.start \"start!\", \ + c.end \"end!\", \ + COALESCE(( \ + SELECT ls.upload \ + FROM location_stats ls \ + WHERE ls.location_id = c.location_id \ + AND ls.collected_at >= c.start \ + AND ls.collected_at <= c.end \ + ORDER BY ls.collected_at DESC LIMIT 1 \ + ), 0) \"upload: _\", \ + COALESCE(( \ + SELECT ls.download \ + FROM location_stats ls \ + WHERE ls.location_id = c.location_id \ + AND ls.collected_at >= c.start \ + AND ls.collected_at <= c.end \ + ORDER BY ls.collected_at DESC LIMIT 1 \ + ), 0) \"download: _\" \ + FROM connection c WHERE location_id = $1 \ + ORDER BY start DESC", location_id ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(connections) @@ -140,16 +146,17 @@ impl ConnectionInfo { /// Connections stored in memory after creating interface #[derive(Debug, Serialize, Clone)] pub struct ActiveConnection { - pub location_id: i64, + pub location_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub interface_name: String, pub connection_type: ConnectionType, } + impl ActiveConnection { #[must_use] pub fn new( - location_id: i64, + location_id: Id, connected_from: String, interface_name: String, connection_type: ConnectionType, @@ -165,20 +172,20 @@ impl ActiveConnection { } } -impl From for Connection { - fn from(active_connection: ActiveConnection) -> Self { +impl From<&ActiveConnection> for Connection { + fn from(active_connection: &ActiveConnection) -> Self { Connection { - id: None, + id: NoId, location_id: active_connection.location_id, - connected_from: active_connection.connected_from, + connected_from: active_connection.connected_from.clone(), start: active_connection.start, end: Utc::now().naive_utc(), } } } -// Implementing From for Connection into CommonConnection -impl From for CommonConnection { - fn from(connection: Connection) -> Self { + +impl From> for CommonConnection { + fn from(connection: Connection) -> Self { CommonConnection { id: connection.id, location_id: connection.location_id, diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 108f487c..c5c8afe0 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -1,135 +1,228 @@ -use crate::{database::DbPool, error::Error, proto}; +use core::fmt; + use serde::{Deserialize, Serialize}; -use sqlx::{query, query_as, FromRow}; +use sqlx::{query, query_as, SqliteExecutor}; + +use super::{Id, NoId}; +use crate::{error::Error, proto}; -#[derive(FromRow, Serialize, Deserialize, Debug)] -pub struct Instance { - pub id: Option, +#[derive(Serialize, Deserialize, Debug)] +pub struct Instance { + pub id: I, pub name: String, pub uuid: String, pub url: String, pub proxy_url: String, pub username: String, + pub token: Option, + pub disable_all_traffic: bool, + pub enterprise_enabled: bool, +} + +impl fmt::Display for Instance { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}(ID: {})", self.name, self.id) + } } -impl From for Instance { +impl From for Instance { fn from(instance_info: proto::InstanceInfo) -> Self { Self { - id: None, + id: NoId, name: instance_info.name, uuid: instance_info.id, url: instance_info.url, proxy_url: instance_info.proxy_url, username: instance_info.username, + token: None, + disable_all_traffic: instance_info.disable_all_traffic, + enterprise_enabled: instance_info.enterprise_enabled, } } } -impl Instance { - #[must_use] - pub fn new( - name: String, - uuid: String, - url: String, - proxy_url: String, - username: String, - ) -> Self { - Instance { - id: None, - name, - uuid, - url, - proxy_url, - username, - } - } - +impl Instance { pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), Error> where - E: sqlx::Executor<'e, Database = sqlx::Sqlite>, + E: SqliteExecutor<'e>, { let url = self.url.to_string(); let proxy_url = self.proxy_url.to_string(); - match self.id { - None => { - let result = query!( - "INSERT INTO instance (name, uuid, url, proxy_url, username) VALUES ($1, $2, $3, $4, $5) RETURNING id;", - self.name, - self.uuid, - url, - proxy_url, - self.username, - ) - .fetch_one(executor) - .await?; - self.id = Some(result.id); - Ok(()) - } - Some(id) => { - // Update the existing record when there is an ID - query!( - "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5 WHERE id = $6;", - self.name, - self.uuid, - url, - proxy_url, - self.username, - id - ) - .execute(executor) - .await?; - Ok(()) - } - } + // Update the existing record when there is an ID + query!( + "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, disable_all_traffic = $6, enterprise_enabled = $7, token = $8 WHERE id = $9;", + self.name, + self.uuid, + url, + proxy_url, + self.username, + self.disable_all_traffic, + self.enterprise_enabled, + self.token, + self.id + ) + .execute(executor) + .await?; + Ok(()) } - pub async fn all(pool: &DbPool) -> Result, Error> { + pub async fn all<'e, E>(executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { let instances = query_as!( Self, - "SELECT id \"id?\", name, uuid, url, proxy_url, username FROM instance;" + "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance;" ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(instances) } - pub async fn find_by_id(pool: &DbPool, id: i64) -> Result, Error> { + pub async fn find_by_id<'e, E>(executor: E, id: Id) -> Result, Error> + where + E: SqliteExecutor<'e>, + { let instance = query_as!( Self, - "SELECT id \"id?\", name, uuid, url, proxy_url, username FROM instance WHERE id = $1;", + "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance WHERE id = $1;", id ) - .fetch_optional(pool) + .fetch_optional(executor) .await?; Ok(instance) } - pub async fn delete_by_id(pool: &DbPool, id: i64) -> Result<(), Error> { + pub async fn find_by_uuid<'e, E>(executor: E, uuid: &str) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let instance = query_as!( + Self, + "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled FROM instance WHERE uuid = $1;", + uuid + ) + .fetch_optional(executor) + .await?; + Ok(instance) + } + + pub async fn delete_by_id<'e, E>(executor: E, id: Id) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { // delete instance query!("DELETE FROM instance WHERE id = $1", id) - .execute(pool) + .execute(executor) .await?; Ok(()) } - pub async fn delete(&self, pool: &DbPool) -> Result<(), Error> { - match self.id { - Some(id) => { - Instance::delete_by_id(pool, id).await?; - Ok(()) - } - None => Err(Error::NotFound), + pub async fn delete<'e, E>(&self, executor: E) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { + Instance::delete_by_id(executor, self.id).await?; + Ok(()) + } + + pub async fn all_with_token<'e, E>(executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let instances = query_as!( + Self, + "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled FROM instance WHERE token IS NOT NULL;" + ) + .fetch_all(executor) + .await?; + Ok(instances) + } +} + +// This compares proto::InstanceInfo, not to be confused with regular InstanceInfo defined below +impl PartialEq for Instance { + fn eq(&self, other: &proto::InstanceInfo) -> bool { + self.name == other.name + && self.uuid == other.id + && self.url == other.url + && self.proxy_url == other.proxy_url + && self.username == other.username + && self.disable_all_traffic == other.disable_all_traffic + && self.enterprise_enabled == other.enterprise_enabled + } +} + +impl Instance { + #[must_use] + pub fn new( + name: String, + uuid: String, + url: String, + proxy_url: String, + username: String, + ) -> Instance { + Instance { + id: NoId, + name, + uuid, + url, + proxy_url, + username, + token: None, + disable_all_traffic: false, + enterprise_enabled: false, } } + + pub async fn save<'e, E>(self, executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let url = self.url.clone(); + let proxy_url = self.proxy_url.clone(); + let result = query!( + "INSERT INTO instance (name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", + self.name, + self.uuid, + url, + proxy_url, + self.username, + self.token, + self.disable_all_traffic, + self.enterprise_enabled + ) + .fetch_one(executor) + .await?; + Ok(Instance:: { + id: result.id, + name: self.name, + uuid: self.uuid, + url: self.url, + proxy_url: self.proxy_url, + username: self.username, + token: self.token, + disable_all_traffic: self.disable_all_traffic, + enterprise_enabled: self.enterprise_enabled, + }) + } } -#[derive(FromRow, Debug, Serialize, Deserialize)] -pub struct InstanceInfo { - pub id: Option, +#[derive(Debug, Serialize, Deserialize)] +pub struct InstanceInfo { + pub id: I, pub name: String, pub uuid: String, pub url: String, pub proxy_url: String, pub active: bool, pub pubkey: String, + pub disable_all_traffic: bool, + pub enterprise_enabled: bool, +} + +impl fmt::Display for InstanceInfo { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}(ID: {})", self.name, self.id) + } } diff --git a/src-tauri/src/database/models/location.rs b/src-tauri/src/database/models/location.rs index 88fe47e2..572fd522 100644 --- a/src-tauri/src/database/models/location.rs +++ b/src-tauri/src/database/models/location.rs @@ -1,23 +1,17 @@ -use chrono::{NaiveDateTime, Utc}; -use sqlx::{query, query_as, Error as SqlxError, FromRow}; -use std::{ - fmt::{Display, Formatter}, - time::SystemTime, -}; +use std::fmt; -use crate::{ - commands::DateTimeAggregation, database::DbPool, error::Error, CommonLocationStats, - ConnectionType, -}; -use defguard_wireguard_rs::host::Peer; use serde::{Deserialize, Serialize}; +use sqlx::{query, query_as, query_scalar, Error as SqlxError, SqliteExecutor}; -#[derive(FromRow, Debug, Serialize, Deserialize)] -pub struct Location { - pub id: Option, - pub instance_id: i64, - // Native id of network from defguard - pub network_id: i64, +use super::{Id, NoId}; +use crate::error::Error; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct Location { + pub id: I, + pub instance_id: Id, + // Native ID of network from Defguard + pub network_id: Id, pub name: String, pub address: String, pub pubkey: String, @@ -29,265 +23,191 @@ pub struct Location { pub keepalive_interval: i64, } -#[derive(FromRow, Debug, Serialize, Deserialize)] -pub struct LocationStats { - id: Option, - location_id: i64, - upload: i64, - download: i64, - last_handshake: i64, - collected_at: NaiveDateTime, - listen_port: u32, - persistent_keepalive_interval: Option, -} - -impl From for CommonLocationStats { - fn from(location_stats: LocationStats) -> Self { - CommonLocationStats { - id: location_stats.id, - location_id: location_stats.location_id, - upload: location_stats.upload, - download: location_stats.download, - last_handshake: location_stats.last_handshake, - collected_at: location_stats.collected_at, - listen_port: location_stats.listen_port, - persistent_keepalive_interval: location_stats.persistent_keepalive_interval, - connection_type: ConnectionType::Location, - } +impl fmt::Display for Location { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}(ID: {})", self.name, self.id) } } -pub async fn peer_to_location_stats( - peer: &Peer, - listen_port: u32, - pool: &DbPool, -) -> Result { - let location = Location::find_by_public_key(pool, &peer.public_key.to_string()).await?; - Ok(LocationStats { - id: None, - location_id: location.id.unwrap(), - upload: peer.tx_bytes as i64, - download: peer.rx_bytes as i64, - last_handshake: peer.last_handshake.map_or(0, |ts| { - ts.duration_since(SystemTime::UNIX_EPOCH) - .map_or(0, |duration| duration.as_secs() as i64) - }), - collected_at: Utc::now().naive_utc(), - listen_port, - persistent_keepalive_interval: peer.persistent_keepalive_interval, - }) -} - -impl Display for Location { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self.id { - Some(location_id) => write!(f, "[ID {location_id}] {}", self.name), - None => write!(f, "{}", self.name), - } +impl fmt::Display for Location { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) } } -impl Location { - pub async fn all(pool: &DbPool) -> Result, Error> { - let locations = query_as!( +impl Location { + pub async fn all<'e, E>(executor: E) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + query_as!( Self, - "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id,\ - route_all_traffic, mfa_enabled, keepalive_interval \ - FROM location;" + "SELECT id, instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id,\ + route_all_traffic, mfa_enabled, keepalive_interval \ + FROM location;" ) - .fetch_all(pool) - .await?; - Ok(locations) + .fetch_all(executor) + .await } - pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), Error> + pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), SqlxError> where - E: sqlx::Executor<'e, Database = sqlx::Sqlite>, + E: SqliteExecutor<'e>, { - match self.id { - None => { - // Insert a new record when there is no ID - let result = query!( - "INSERT INTO location (instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, mfa_enabled, keepalive_interval) \ - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) \ - RETURNING id;", - self.instance_id, - self.name, - self.address, - self.pubkey, - self.endpoint, - self.allowed_ips, - self.dns, - self.network_id, - self.route_all_traffic, - self.mfa_enabled, - self.keepalive_interval - ) - .fetch_one(executor) - .await?; - self.id = Some(result.id); - } - Some(id) => { - // Update the existing record when there is an ID - query!( - "UPDATE location SET instance_id = $1, name = $2, address = $3, pubkey = $4, endpoint = $5, allowed_ips = $6, dns = $7, \ - network_id = $8, route_all_traffic = $9, mfa_enabled = $10, keepalive_interval = $11 WHERE id = $12;", - self.instance_id, - self.name, - self.address, - self.pubkey, - self.endpoint, - self.allowed_ips, - self.dns, - self.network_id, - self.route_all_traffic, - self.mfa_enabled, - self.keepalive_interval, - id, - ) - .execute(executor) - .await?; - } - } + // Update the existing record when there is an ID + query!( + "UPDATE location SET instance_id = $1, name = $2, address = $3, pubkey = $4, endpoint = $5, allowed_ips = $6, dns = $7, \ + network_id = $8, route_all_traffic = $9, mfa_enabled = $10, keepalive_interval = $11 WHERE id = $12", + self.instance_id, + self.name, + self.address, + self.pubkey, + self.endpoint, + self.allowed_ips, + self.dns, + self.network_id, + self.route_all_traffic, + self.mfa_enabled, + self.keepalive_interval, + self.id, + ) + .execute(executor) + .await?; Ok(()) } - pub async fn find_by_id(pool: &DbPool, location_id: i64) -> Result, SqlxError> { + pub async fn find_by_id<'e, E>(executor: E, location_id: Id) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { query_as!( Self, - "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ - route_all_traffic, mfa_enabled, keepalive_interval \ - FROM location WHERE id = $1;", + "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ + route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE id = $1", location_id ) - .fetch_optional(pool) + .fetch_optional(executor) .await } - pub async fn find_by_instance_id( - pool: &DbPool, - instance_id: i64, - ) -> Result, SqlxError> { + pub async fn find_by_instance_id<'e, E>( + executor: E, + instance_id: Id, + ) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { query_as!( Self, - "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ - route_all_traffic, mfa_enabled, keepalive_interval \ - FROM location WHERE instance_id = $1;", + "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ + route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE instance_id = $1", instance_id ) - .fetch_all(pool) + .fetch_all(executor) .await } - pub async fn find_by_public_key(pool: &DbPool, pubkey: &str) -> Result { + pub async fn find_by_public_key<'e, E>(executor: E, pubkey: &str) -> Result + where + E: SqliteExecutor<'e>, + { query_as!( Self, - "SELECT id \"id?\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ - route_all_traffic, mfa_enabled, keepalive_interval \ - FROM location WHERE pubkey = $1;", + "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, \ + route_all_traffic, mfa_enabled, keepalive_interval FROM location WHERE pubkey = $1;", pubkey ) - .fetch_one(pool) + .fetch_one(executor) .await } pub async fn delete<'e, E>(&self, executor: E) -> Result<(), SqlxError> where - E: sqlx::Executor<'e, Database = sqlx::Sqlite>, + E: SqliteExecutor<'e>, { - info!("Removing location {self}"); - if let Some(id) = self.id { - query!("DELETE FROM location WHERE id = $1;", id) - .execute(executor) - .await?; - } + query!("DELETE FROM location WHERE id = $1;", self.id) + .execute(executor) + .await?; Ok(()) } -} - -impl LocationStats { - #[must_use] - pub fn new( - location_id: i64, - upload: i64, - download: i64, - last_handshake: i64, - collected_at: NaiveDateTime, - listen_port: u32, - persistent_keepalive_interval: Option, - ) -> Self { - LocationStats { - id: None, - location_id, - upload, - download, - last_handshake, - collected_at, - listen_port, - persistent_keepalive_interval, - } - } - pub async fn save(&mut self, pool: &DbPool) -> Result<(), Error> { - let result = query!( - "INSERT INTO location_stats (location_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) \ - VALUES ($1, $2, $3, $4, $5, $6, $7) \ - RETURNING id;", - self.location_id, - self.upload, - self.download, - self.last_handshake, - self.collected_at, - self.listen_port, - self.persistent_keepalive_interval, + /// Disables all traffic for locations related to the given instance + pub async fn disable_all_traffic_for_all<'e, E>( + executor: E, + instance_id: Id, + ) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { + query!( + "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1;", + instance_id ) - .fetch_one(pool) + .execute(executor) .await?; - self.id = Some(result.id); Ok(()) } +} - pub async fn all_by_location_id( - pool: &DbPool, - location_id: i64, - from: &NaiveDateTime, - aggregation: &DateTimeAggregation, - ) -> Result, Error> { - let aggregation = aggregation.fstring(); - let stats = query_as!( - LocationStats, - r#" - WITH cte AS ( - SELECT - id, location_id, - COALESCE(upload - LAG(upload) OVER (PARTITION BY location_id ORDER BY collected_at), 0) as upload, - COALESCE(download - LAG(download) OVER (PARTITION BY location_id ORDER BY collected_at), 0) as download, - last_handshake, strftime($1, collected_at) as collected_at, listen_port, persistent_keepalive_interval - FROM location_stats - ORDER BY collected_at - LIMIT -1 OFFSET 1 - ) - SELECT - id, location_id, - SUM(MAX(upload, 0)) as "upload!: i64", - SUM(MAX(download, 0)) as "download!: i64", - last_handshake, - collected_at as "collected_at!: NaiveDateTime", - listen_port as "listen_port!: u32", - persistent_keepalive_interval as "persistent_keepalive_interval?: u16" - FROM cte - WHERE location_id = $2 - AND collected_at >= $3 - GROUP BY collected_at - ORDER BY collected_at; - "#, - aggregation, - location_id, - from +impl Location { + pub async fn save<'e, E>(self, executor: E) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + // Insert a new record when there is no ID + let id = query_scalar!( + "INSERT INTO location (instance_id, name, address, pubkey, endpoint, allowed_ips, dns, \ + network_id, route_all_traffic, mfa_enabled, keepalive_interval) \ + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) \ + RETURNING id \"id!\"", + self.instance_id, + self.name, + self.address, + self.pubkey, + self.endpoint, + self.allowed_ips, + self.dns, + self.network_id, + self.route_all_traffic, + self.mfa_enabled, + self.keepalive_interval ) - .fetch_all(pool) + .fetch_one(executor) .await?; - Ok(stats) + + Ok(Location:: { + id, + instance_id: self.instance_id, + name: self.name, + address: self.address, + pubkey: self.pubkey, + endpoint: self.endpoint, + allowed_ips: self.allowed_ips, + dns: self.dns, + network_id: self.network_id, + route_all_traffic: self.route_all_traffic, + mfa_enabled: self.mfa_enabled, + keepalive_interval: self.keepalive_interval, + }) + } +} + +impl From> for Location { + fn from(location: Location) -> Self { + Self { + id: NoId, + instance_id: location.instance_id, + network_id: location.network_id, + name: location.name, + address: location.address, + pubkey: location.pubkey, + endpoint: location.endpoint, + allowed_ips: location.allowed_ips, + dns: location.dns, + route_all_traffic: location.route_all_traffic, + mfa_enabled: location.mfa_enabled, + keepalive_interval: location.keepalive_interval, + } } } diff --git a/src-tauri/src/database/models/location_stats.rs b/src-tauri/src/database/models/location_stats.rs new file mode 100644 index 00000000..462865af --- /dev/null +++ b/src-tauri/src/database/models/location_stats.rs @@ -0,0 +1,177 @@ +use std::time::SystemTime; + +use chrono::{NaiveDateTime, Utc}; +use defguard_wireguard_rs::host::Peer; +use serde::{Deserialize, Serialize}; +use sqlx::{query_as, query_scalar, Error as SqlxError, SqliteExecutor}; + +use super::{Id, NoId}; +use crate::{ + commands::DateTimeAggregation, database::Location, error::Error, CommonLocationStats, + ConnectionType, +}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct LocationStats { + id: I, + location_id: Id, + upload: i64, + download: i64, + last_handshake: i64, + collected_at: NaiveDateTime, + listen_port: u32, + persistent_keepalive_interval: Option, +} + +impl From> for CommonLocationStats { + fn from(location_stats: LocationStats) -> Self { + CommonLocationStats { + id: location_stats.id, + location_id: location_stats.location_id, + upload: location_stats.upload, + download: location_stats.download, + last_handshake: location_stats.last_handshake, + collected_at: location_stats.collected_at, + listen_port: location_stats.listen_port, + persistent_keepalive_interval: location_stats.persistent_keepalive_interval, + connection_type: ConnectionType::Location, + } + } +} + +pub async fn peer_to_location_stats<'e, E>( + peer: &Peer, + listen_port: u32, + executor: E, +) -> Result, Error> +where + E: SqliteExecutor<'e>, +{ + let location = Location::find_by_public_key(executor, &peer.public_key.to_string()).await?; + Ok(LocationStats { + id: NoId, + location_id: location.id, + upload: peer.tx_bytes as i64, + download: peer.rx_bytes as i64, + last_handshake: peer.last_handshake.map_or(0, |ts| { + ts.duration_since(SystemTime::UNIX_EPOCH) + .map_or(0, |duration| duration.as_secs() as i64) + }), + collected_at: Utc::now().naive_utc(), + listen_port, + persistent_keepalive_interval: peer.persistent_keepalive_interval, + }) +} + +impl LocationStats { + pub async fn get_name<'e, E>(&self, executor: E) -> Result + where + E: SqliteExecutor<'e>, + { + Ok( + query_scalar!("SELECT name FROM location WHERE id = $1", self.location_id) + .fetch_one(executor) + .await?, + ) + } +} + +impl LocationStats { + #[must_use] + pub fn new( + location_id: Id, + upload: i64, + download: i64, + last_handshake: i64, + collected_at: NaiveDateTime, + listen_port: u32, + persistent_keepalive_interval: Option, + ) -> Self { + LocationStats { + id: NoId, + location_id, + upload, + download, + last_handshake, + collected_at, + listen_port, + persistent_keepalive_interval, + } + } + + pub async fn save<'e, E>(self, executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let id = query_scalar!( + "INSERT INTO location_stats (location_id, upload, download, last_handshake, \ + collected_at, listen_port, persistent_keepalive_interval) \ + VALUES ($1, $2, $3, $4, $5, $6, $7) \ + RETURNING id \"id!\"", + self.location_id, + self.upload, + self.download, + self.last_handshake, + self.collected_at, + self.listen_port, + self.persistent_keepalive_interval, + ) + .fetch_one(executor) + .await?; + + Ok(LocationStats:: { + id, + location_id: self.location_id, + upload: self.upload, + download: self.download, + last_handshake: self.last_handshake, + collected_at: self.collected_at, + listen_port: self.listen_port, + persistent_keepalive_interval: self.persistent_keepalive_interval, + }) + } +} + +impl LocationStats { + pub async fn all_by_location_id<'e, E>( + executor: E, + location_id: Id, + from: &NaiveDateTime, + aggregation: &DateTimeAggregation, + ) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let aggregation = aggregation.fstring(); + let stats = query_as!( + LocationStats, + "WITH cte AS ( \ + SELECT \ + id, location_id, \ + COALESCE(upload - LAG(upload) OVER (PARTITION BY location_id ORDER BY collected_at), 0) upload, \ + COALESCE(download - LAG(download) OVER (PARTITION BY location_id ORDER BY collected_at), 0) download, \ + last_handshake, strftime($1, collected_at) collected_at, listen_port, persistent_keepalive_interval \ + FROM location_stats \ + ORDER BY collected_at \ + LIMIT -1 OFFSET 1 \ + ) \ + SELECT \ + id, location_id, \ + SUM(MAX(upload, 0)) \"upload!: i64\", \ + SUM(MAX(download, 0)) \"download!: i64\", \ + last_handshake, \ + collected_at \"collected_at!: NaiveDateTime\", \ + listen_port \"listen_port!: u32\", \ + persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" \ + FROM cte \ + WHERE location_id = $2 AND collected_at >= $3 \ + GROUP BY collected_at ORDER BY collected_at", + aggregation, + location_id, + from + ) + .fetch_all(executor) + .await?; + Ok(stats) + } +} diff --git a/src-tauri/src/database/models/mod.rs b/src-tauri/src/database/models/mod.rs index 93155f45..3fcc07e8 100644 --- a/src-tauri/src/database/models/mod.rs +++ b/src-tauri/src/database/models/mod.rs @@ -1,6 +1,14 @@ +use serde::{Deserialize, Serialize}; + pub mod connection; pub mod instance; pub mod location; +pub mod location_stats; pub mod settings; pub mod tunnel; pub mod wireguard_keys; + +// Typestate structs to make working with optional IDs easier +pub type Id = i64; +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +pub struct NoId; diff --git a/src-tauri/src/database/models/settings.rs b/src-tauri/src/database/models/settings.rs index 761e2a4a..51a7fa60 100644 --- a/src-tauri/src/database/models/settings.rs +++ b/src-tauri/src/database/models/settings.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use serde::{Deserialize, Serialize}; -use sqlx::{query, FromRow, Type}; +use sqlx::{query, SqliteExecutor, Type}; use struct_patch::Patch; use strum::{AsRefStr, EnumString}; use tracing::Level; @@ -50,7 +50,16 @@ pub enum TrayIconTheme { Gray, } -#[derive(FromRow, Debug, Serialize, Deserialize, Patch)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Type, EnumString, AsRefStr)] +#[sqlx(type_name = "selected_view", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] +#[strum(serialize_all = "snake_case")] +pub enum ClientView { + Grid = 0, + Detail, +} + +#[derive(Debug, Serialize, Deserialize, Patch)] #[patch_derive(Debug, Serialize, Deserialize)] pub struct Settings { #[serde(skip)] @@ -59,12 +68,29 @@ pub struct Settings { pub log_level: SettingsLogLevel, pub tray_icon_theme: TrayIconTheme, pub check_for_updates: bool, + pub selected_view: Option, +} + +impl Default for Settings { + fn default() -> Self { + Self { + id: None, + log_level: SettingsLogLevel::Info, + theme: SettingsTheme::Light, + tray_icon_theme: TrayIconTheme::Color, + check_for_updates: true, + selected_view: None, + } + } } impl Settings { - pub async fn get(pool: &DbPool) -> Result { + pub async fn get<'e, E>(executor: E) -> Result + where + E: SqliteExecutor<'e>, + { let query_res = query!("SELECT * FROM settings WHERE id = 1;") - .fetch_one(pool) + .fetch_one(executor) .await?; let settings = Self { id: Some(query_res.id), @@ -72,54 +98,65 @@ impl Settings { theme: SettingsTheme::from_str(&query_res.theme)?, tray_icon_theme: TrayIconTheme::from_str(&query_res.tray_icon_theme)?, check_for_updates: query_res.check_for_updates, + selected_view: match &query_res.selected_view { + Some(selected_view) => Some(ClientView::from_str(selected_view)?), + None => None, + }, }; Ok(settings) } - pub async fn save(&mut self, pool: &DbPool) -> Result<(), Error> { + pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { query!( "UPDATE settings \ - SET theme = $1, log_level = $2, tray_icon_theme = $3, check_for_updates = $4 \ + SET theme = $1, log_level = $2, tray_icon_theme = $3, check_for_updates = $4, selected_view = $5 \ WHERE id = 1;", self.theme, self.log_level, self.tray_icon_theme, self.check_for_updates, + self.selected_view ) - .execute(pool) + .execute(executor) .await?; Ok(()) } - // checks if settings is empty and insert default settings if they not exist, this should be called before app start + /// Checks if settings are empty and inserts default settings if they do not exist. This should be called before app starts. pub async fn init_defaults(pool: &DbPool) -> Result<(), Error> { let current_config = query!("SELECT * FROM settings WHERE id = 1;") .fetch_optional(pool) .await?; if current_config.is_none() { - debug!("No settings found on app init."); - let mut init_theme = SettingsTheme::Light; + debug!("No previous application settings found, inserting defaults."); // check what system theme is currently in use and default to it. - if dark_light::detect() == dark_light::Mode::Dark { - debug!("Detected system theme dark, init theme ajusted."); - init_theme = SettingsTheme::Dark; + let theme = match dark_light::detect() { + dark_light::Mode::Default | dark_light::Mode::Light => SettingsTheme::Light, + dark_light::Mode::Dark => { + debug!("Detected system theme dark, init theme adjusted."); + SettingsTheme::Dark + } }; - let default_settings = Settings { - id: None, - log_level: SettingsLogLevel::Info, - theme: init_theme, - tray_icon_theme: TrayIconTheme::Color, - check_for_updates: true, + let settings = Settings { + theme, + ..Default::default() }; query!( - "INSERT INTO settings (log_level, theme, tray_icon_theme, check_for_updates) VALUES ($1, $2, $3, $4);", - default_settings.log_level, - default_settings.theme, - default_settings.tray_icon_theme, - default_settings.check_for_updates, + "INSERT INTO settings (log_level, theme, tray_icon_theme, check_for_updates, selected_view) VALUES ($1, $2, $3, $4, $5);", + settings.log_level, + settings.theme, + settings.tray_icon_theme, + settings.check_for_updates, + settings.selected_view ) .execute(pool) .await?; + } else { + debug!("Found previous app settings, using them."); + debug!("Found settings: {:?}", current_config); } Ok(()) } diff --git a/src-tauri/src/database/models/tunnel.rs b/src-tauri/src/database/models/tunnel.rs index 989d99d8..b4664a1f 100644 --- a/src-tauri/src/database/models/tunnel.rs +++ b/src-tauri/src/database/models/tunnel.rs @@ -1,20 +1,22 @@ -use crate::{ - commands::DateTimeAggregation, - database::{ActiveConnection, DbPool}, - error::Error, - CommonConnection, CommonConnectionInfo, CommonLocationStats, ConnectionType, -}; +use core::fmt; +use std::time::SystemTime; + use chrono::{NaiveDateTime, Utc}; use defguard_wireguard_rs::host::Peer; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, NoneAsEmptyString}; -use sqlx::{query, query_as, Error as SqlxError, FromRow}; -use std::time::SystemTime; +use sqlx::{query, query_as, query_scalar, Error as SqlxError, SqliteExecutor}; + +use super::{Id, NoId}; +use crate::{ + commands::DateTimeAggregation, database::ActiveConnection, error::Error, CommonConnection, + CommonConnectionInfo, CommonLocationStats, ConnectionType, +}; #[serde_as] -#[derive(Debug, FromRow, Serialize, Deserialize)] -pub struct Tunnel { - pub id: Option, +#[derive(Debug, Serialize, Deserialize)] +pub struct Tunnel { + pub id: I, pub name: String, // user keys pub pubkey: String, @@ -43,7 +45,112 @@ pub struct Tunnel { pub post_down: Option, } -impl Tunnel { +impl fmt::Display for Tunnel { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}(ID: {})", self.name, self.id) + } +} + +impl Tunnel { + pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), SqlxError> + where + E: SqliteExecutor<'e>, + { + query!( + "UPDATE tunnel SET name = $1, pubkey = $2, prvkey = $3, address = $4, \ + server_pubkey = $5, preshared_key = $6, allowed_ips = $7, endpoint = $8, dns = $9, \ + persistent_keep_alive = $10, route_all_traffic = $11, pre_up = $12, post_up = $13, pre_down = $14, post_down = $15 \ + WHERE id = $16;", + self.name, + self.pubkey, + self.prvkey, + self.address, + self.server_pubkey, + self.preshared_key, + self.allowed_ips, + self.endpoint, + self.dns, + self.persistent_keep_alive, + self.route_all_traffic, + self.pre_up, + self.post_up, + self.pre_down, + self.post_down, + self.id, + ) + .execute(executor) + .await?; + + Ok(()) + } + + pub async fn delete<'e, E>(&self, executor: E) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { + Tunnel::delete_by_id(executor, self.id).await?; + Ok(()) + } + + pub async fn find_by_id<'e, E>(executor: E, tunnel_id: Id) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + query_as!( + Self, + "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, \ + persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE id = $1;", + tunnel_id + ) + .fetch_optional(executor) + .await + } + + pub async fn all<'e, E>(executor: E) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + let tunnels = query_as!( + Self, + "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, \ + persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel;" + ) + .fetch_all(executor) + .await?; + Ok(tunnels) + } + + pub async fn find_by_server_public_key<'e, E>( + executor: E, + pubkey: &str, + ) -> Result + where + E: SqliteExecutor<'e>, + { + query_as!( + Self, + "SELECT id \"id: _\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, \ + route_all_traffic, pre_up, post_up, pre_down, post_down \ + FROM tunnel WHERE server_pubkey = $1;", + pubkey + ) + .fetch_one(executor) + .await + } + + pub async fn delete_by_id<'e, E>(executor: E, id: Id) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { + // delete instance + query!("DELETE FROM tunnel WHERE id = $1", id) + .execute(executor) + .await?; + Ok(()) + } +} + +impl Tunnel { #[allow(clippy::too_many_arguments)] #[must_use] pub fn new( @@ -64,7 +171,7 @@ impl Tunnel { post_down: Option, ) -> Self { Tunnel { - id: None, + id: NoId, name, pubkey, prvkey, @@ -83,123 +190,59 @@ impl Tunnel { } } - pub async fn save(&mut self, pool: &DbPool) -> Result<(), SqlxError> { - match self.id { - None => { - // Insert a new record when there is no ID - let result = query!( - "INSERT INTO tunnel (name, pubkey, prvkey, address, server_pubkey, allowed_ips, preshared_key, \ - endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down) \ - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id;", - self.name, - self.pubkey, - self.prvkey, - self.address, - self.server_pubkey, - self.allowed_ips, - self.preshared_key, - self.endpoint, - self.dns, - self.persistent_keep_alive, - self.route_all_traffic, - self.pre_up, - self.post_up, - self.pre_down, - self.post_down, - ) - .fetch_one(pool) - .await?; - self.id = Some(result.id); - } - Some(id) => { - // Update the existing record when there is an ID - query!( - "UPDATE tunnel SET name = $1, pubkey = $2, prvkey = $3, address = $4, \ - server_pubkey = $5, preshared_key = $6, allowed_ips = $7, endpoint = $8, dns = $9, \ - persistent_keep_alive = $10, route_all_traffic = $11, pre_up = $12, post_up = $13, pre_down = $14, post_down = $15 \ - WHERE id = $16;", - self.name, - self.pubkey, - self.prvkey, - self.address, - self.server_pubkey, - self.preshared_key, - self.allowed_ips, - self.endpoint, - self.dns, - self.persistent_keep_alive, - self.route_all_traffic, - self.pre_up, - self.post_up, - self.pre_down, - self.post_down, - id, - ) - .execute(pool) - .await?; - } - } - - Ok(()) - } - - pub async fn find_by_id(pool: &DbPool, tunnel_id: i64) -> Result, SqlxError> { - query_as!( - Self, - "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, \ - persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel WHERE id = $1;", - tunnel_id - ) - .fetch_optional(pool) - .await - } - - pub async fn all(pool: &DbPool) -> Result, SqlxError> { - let tunnels = query_as!( - Self, - "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, \ - persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down FROM tunnel;" + pub async fn save<'e, E>(self, executor: E) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + // Insert a new record when there is no ID + let result = query!( + "INSERT INTO tunnel (name, pubkey, prvkey, address, server_pubkey, allowed_ips, preshared_key, \ + endpoint, dns, persistent_keep_alive, route_all_traffic, pre_up, post_up, pre_down, post_down) \ + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id;", + self.name, + self.pubkey, + self.prvkey, + self.address, + self.server_pubkey, + self.allowed_ips, + self.preshared_key, + self.endpoint, + self.dns, + self.persistent_keep_alive, + self.route_all_traffic, + self.pre_up, + self.post_up, + self.pre_down, + self.post_down, ) - .fetch_all(pool) + .fetch_one(executor) .await?; - Ok(tunnels) - } - - pub async fn find_by_server_public_key(pool: &DbPool, pubkey: &str) -> Result { - query_as!( - Self, - "SELECT id \"id?\", name, pubkey, prvkey, address, server_pubkey, preshared_key, allowed_ips, endpoint, dns, persistent_keep_alive, - route_all_traffic, pre_up, post_up, pre_down, post_down \ - FROM tunnel WHERE server_pubkey = $1;", - pubkey - ) - .fetch_one(pool) - .await - } - pub async fn delete_by_id(pool: &DbPool, id: i64) -> Result<(), Error> { - // delete instance - query!("DELETE FROM tunnel WHERE id = $1", id) - .execute(pool) - .await?; - Ok(()) - } - - pub async fn delete(&self, pool: &DbPool) -> Result<(), Error> { - match self.id { - Some(id) => { - Tunnel::delete_by_id(pool, id).await?; - Ok(()) - } - None => Err(Error::NotFound), - } + Ok(Tunnel:: { + id: result.id, + name: self.name, + pubkey: self.pubkey, + prvkey: self.prvkey, + address: self.address, + server_pubkey: self.server_pubkey, + allowed_ips: self.allowed_ips, + preshared_key: self.preshared_key, + endpoint: self.endpoint, + dns: self.dns, + persistent_keep_alive: self.persistent_keep_alive, + route_all_traffic: self.route_all_traffic, + pre_up: self.pre_up, + post_up: self.post_up, + pre_down: self.pre_down, + post_down: self.post_down, + }) } } -#[derive(FromRow, Debug, Serialize, Deserialize)] -pub struct TunnelStats { - id: Option, - tunnel_id: i64, +#[derive(Debug, Serialize, Deserialize)] +pub struct TunnelStats { + id: I, + tunnel_id: Id, upload: i64, download: i64, last_handshake: i64, @@ -209,9 +252,20 @@ pub struct TunnelStats { } impl TunnelStats { + pub async fn get_name<'e, E>(&self, executor: E) -> Result + where + E: SqliteExecutor<'e>, + { + query_scalar!("SELECT name FROM tunnel WHERE id = $1;", self.tunnel_id) + .fetch_one(executor) + .await + } +} + +impl TunnelStats { #[must_use] pub fn new( - tunnel_id: i64, + tunnel_id: Id, upload: i64, download: i64, last_handshake: i64, @@ -220,7 +274,7 @@ impl TunnelStats { persistent_keepalive_interval: Option, ) -> Self { TunnelStats { - id: None, + id: NoId, tunnel_id, upload, download, @@ -231,11 +285,14 @@ impl TunnelStats { } } - pub async fn save(&mut self, pool: &DbPool) -> Result<(), SqlxError> { - let result = query!( - "INSERT INTO tunnel_stats (tunnel_id, upload, download, last_handshake, collected_at, listen_port, persistent_keepalive_interval) \ - VALUES ($1, $2, $3, $4, $5, $6, $7) \ - RETURNING id;", + pub async fn save<'e, E>(self, executor: E) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + let id = query_scalar!( + "INSERT INTO tunnel_stats (tunnel_id, upload, download, last_handshake, collected_at, \ + listen_port, persistent_keepalive_interval) \ + VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id \"id!\"", self.tunnel_id, self.upload, self.download, @@ -244,64 +301,76 @@ impl TunnelStats { self.listen_port, self.persistent_keepalive_interval, ) - .fetch_one(pool) + .fetch_one(executor) .await?; - self.id = Some(result.id); - Ok(()) + + Ok(TunnelStats:: { + id, + tunnel_id: self.tunnel_id, + upload: self.upload, + download: self.download, + last_handshake: self.last_handshake, + collected_at: self.collected_at, + listen_port: self.listen_port, + persistent_keepalive_interval: self.persistent_keepalive_interval, + }) } +} - pub async fn all_by_tunnel_id( - pool: &DbPool, - tunnel_id: i64, +impl TunnelStats { + pub async fn all_by_tunnel_id<'e, E>( + executor: E, + tunnel_id: Id, from: &NaiveDateTime, aggregation: &DateTimeAggregation, - ) -> Result, SqlxError> { + ) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { let aggregation = aggregation.fstring(); let stats = query_as!( TunnelStats, - r#" - WITH cte AS ( - SELECT - id, tunnel_id, - COALESCE(upload - LAG(upload) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) as upload, - COALESCE(download - LAG(download) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) as download, - last_handshake, strftime($1, collected_at) as collected_at, listen_port, persistent_keepalive_interval - FROM tunnel_stats - ORDER BY collected_at - LIMIT -1 OFFSET 1 - ) - SELECT - id, tunnel_id, - SUM(MAX(upload, 0)) as "upload!: i64", - SUM(MAX(download, 0)) as "download!: i64", - last_handshake, - collected_at as "collected_at!: NaiveDateTime", - listen_port as "listen_port!: u32", - persistent_keepalive_interval as "persistent_keepalive_interval?: u16" - FROM cte - WHERE tunnel_id = $2 - AND collected_at >= $3 - GROUP BY collected_at - ORDER BY collected_at; - "#, + "WITH cte AS ( \ + SELECT \ + id, tunnel_id, \ + COALESCE(upload - LAG(upload) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) upload, \ + COALESCE(download - LAG(download) OVER (PARTITION BY tunnel_id ORDER BY collected_at), 0) download, \ + last_handshake, strftime($1, collected_at) collected_at, listen_port, persistent_keepalive_interval \ + FROM tunnel_stats ORDER BY collected_at LIMIT -1 OFFSET 1 \ + ) \ + SELECT \ + id, tunnel_id, \ + SUM(MAX(upload, 0)) \"upload!: i64\", \ + SUM(MAX(download, 0)) \"download!: i64\", \ + last_handshake, \ + collected_at \"collected_at!: NaiveDateTime\", \ + listen_port \"listen_port!: u32\", \ + persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" \ + FROM cte \ + WHERE tunnel_id = $2 AND collected_at >= $3 \ + GROUP BY collected_at ORDER BY collected_at", aggregation, tunnel_id, from ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(stats) } } -pub async fn peer_to_tunnel_stats( + +pub async fn peer_to_tunnel_stats<'e, E>( peer: &Peer, listen_port: u32, - pool: &DbPool, -) -> Result { - let tunnel = Tunnel::find_by_server_public_key(pool, &peer.public_key.to_string()).await?; + executor: E, +) -> Result, Error> +where + E: SqliteExecutor<'e>, +{ + let tunnel = Tunnel::find_by_server_public_key(executor, &peer.public_key.to_string()).await?; Ok(TunnelStats { - id: None, - tunnel_id: tunnel.id.unwrap(), + id: NoId, + tunnel_id: tunnel.id, upload: peer.tx_bytes as i64, download: peer.rx_bytes as i64, last_handshake: peer.last_handshake.map_or(0, |ts| { @@ -314,10 +383,10 @@ pub async fn peer_to_tunnel_stats( }) } -#[derive(FromRow, Debug, Serialize, Clone)] -pub struct TunnelConnection { - pub id: Option, - pub tunnel_id: i64, +#[derive(Debug, Serialize, Clone)] +pub struct TunnelConnection { + pub id: I, + pub tunnel_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, @@ -337,61 +406,76 @@ impl From for CommonConnectionInfo { } } -impl TunnelConnection { - pub async fn save(&mut self, pool: &DbPool) -> Result<(), Error> { - let result = query!( - "INSERT INTO tunnel_connection (tunnel_id, connected_from, start, end) \ - VALUES ($1, $2, $3, $4) \ - RETURNING id;", - self.tunnel_id, - self.connected_from, - self.start, - self.end, - ) - .fetch_one(pool) - .await?; - self.id = Some(result.id); - Ok(()) - } - - pub async fn all_by_tunnel_id(pool: &DbPool, tunnel_id: i64) -> Result, Error> { +impl TunnelConnection { + pub async fn all_by_tunnel_id<'e, E>( + executor: E, + tunnel_id: Id, + ) -> Result>, Error> + where + E: SqliteExecutor<'e>, + { let connections = query_as!( TunnelConnection, - r#" - SELECT id, tunnel_id, connected_from, start, end - FROM tunnel_connection - WHERE tunnel_id = $1 - "#, + "SELECT id, tunnel_id, connected_from, start, end \ + FROM tunnel_connection WHERE tunnel_id = $1", tunnel_id ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(connections) } - pub async fn latest_by_tunnel_id(pool: &DbPool, tunnel_id: i64) -> Result, Error> { + pub async fn latest_by_tunnel_id<'e, E>( + executor: E, + tunnel_id: Id, + ) -> Result>, Error> + where + E: SqliteExecutor<'e>, + { let connection = query_as!( TunnelConnection, - r#" - SELECT id, tunnel_id, connected_from, start, end - FROM tunnel_connection - WHERE tunnel_id = $1 - ORDER BY end DESC - LIMIT 1 - "#, + "SELECT id, tunnel_id, connected_from, start, end \ + FROM tunnel_connection WHERE tunnel_id = $1 \ + ORDER BY end DESC LIMIT 1", tunnel_id ) - .fetch_optional(pool) + .fetch_optional(executor) .await?; Ok(connection) } } +impl TunnelConnection { + pub async fn save<'e, E>(self, executor: E) -> Result, Error> + where + E: SqliteExecutor<'e>, + { + let id = query_scalar!( + "INSERT INTO tunnel_connection (tunnel_id, connected_from, start, end) \ + VALUES ($1, $2, $3, $4) RETURNING id \"id!\"", + self.tunnel_id, + self.connected_from, + self.start, + self.end, + ) + .fetch_one(executor) + .await?; + + Ok(TunnelConnection:: { + id, + tunnel_id: self.tunnel_id, + connected_from: self.connected_from, + start: self.start, + end: self.end, + }) + } +} + /// Historical connection -#[derive(FromRow, Debug, Serialize)] +#[derive(Debug, Serialize)] pub struct TunnelConnectionInfo { - pub id: i64, - pub tunnel_id: i64, + pub id: Id, + pub tunnel_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, @@ -400,64 +484,60 @@ pub struct TunnelConnectionInfo { } impl TunnelConnectionInfo { - pub async fn all_by_tunnel_id(pool: &DbPool, tunnel_id: i64) -> Result, Error> { + pub async fn all_by_tunnel_id<'e, E>(executor: E, tunnel_id: Id) -> Result, Error> + where + E: SqliteExecutor<'e>, + { // Because we store interface information for given timestamp select last upload and download // before connection ended // FIXME: Optimize query let connections = query_as!( TunnelConnectionInfo, - r#" - SELECT - c.id as "id!", - c.tunnel_id as "tunnel_id!", - c.connected_from as "connected_from!", - c.start as "start!", - c.end as "end!", - COALESCE(( - SELECT ls.upload - FROM tunnel_stats AS ls - WHERE ls.tunnel_id = c.tunnel_id - AND ls.collected_at >= c.start - AND ls.collected_at <= c.end - ORDER BY ls.collected_at DESC - LIMIT 1 - ), 0) as "upload: _", - COALESCE(( - SELECT ls.download - FROM tunnel_stats AS ls - WHERE ls.tunnel_id = c.tunnel_id - AND ls.collected_at >= c.start - AND ls.collected_at <= c.end - ORDER BY ls.collected_at DESC - LIMIT 1 - ), 0) as "download: _" - FROM tunnel_connection AS c WHERE tunnel_id = $1 - ORDER BY start DESC; - "#, + "SELECT c.id, c.tunnel_id, \ + c.connected_from \"connected_from!\", c.start \"start!\", \ + c.end \"end!\", \ + COALESCE(( \ + SELECT ls.upload \ + FROM tunnel_stats ls \ + WHERE ls.tunnel_id = c.tunnel_id \ + AND ls.collected_at >= c.start \ + AND ls.collected_at <= c.end \ + ORDER BY ls.collected_at DESC LIMIT 1 \ + ), 0) \"upload: _\", \ + COALESCE(( \ + SELECT ls.download \ + FROM tunnel_stats ls \ + WHERE ls.tunnel_id = c.tunnel_id \ + AND ls.collected_at >= c.start \ + AND ls.collected_at <= c.end \ + ORDER BY ls.collected_at DESC LIMIT 1 \ + ), 0) \"download: _\" \ + FROM tunnel_connection c WHERE tunnel_id = $1 \ + ORDER BY start DESC", tunnel_id ) - .fetch_all(pool) + .fetch_all(executor) .await?; Ok(connections) } } -impl From for TunnelConnection { - fn from(active_connection: ActiveConnection) -> Self { - TunnelConnection { - id: None, + +impl From<&ActiveConnection> for TunnelConnection { + fn from(active_connection: &ActiveConnection) -> Self { + Self { + id: NoId, tunnel_id: active_connection.location_id, - connected_from: active_connection.connected_from, + connected_from: active_connection.connected_from.clone(), start: active_connection.start, end: Utc::now().naive_utc(), } } } -// Implementing From for TunnelConnection into CommonConnection -impl From for CommonConnection { - fn from(tunnel_connection: TunnelConnection) -> Self { - CommonConnection { +impl From> for CommonConnection { + fn from(tunnel_connection: TunnelConnection) -> Self { + Self { id: tunnel_connection.id, location_id: tunnel_connection.tunnel_id, // Assuming you want to map tunnel_id to location_id connected_from: tunnel_connection.connected_from, @@ -467,10 +547,10 @@ impl From for CommonConnection { } } } -// Implement From trait for converting TunnelStats to CommonLocationStats -impl From for CommonLocationStats { - fn from(tunnel_stats: TunnelStats) -> Self { - CommonLocationStats { + +impl From> for CommonLocationStats { + fn from(tunnel_stats: TunnelStats) -> Self { + Self { id: tunnel_stats.id, location_id: tunnel_stats.tunnel_id, upload: tunnel_stats.upload, diff --git a/src-tauri/src/database/models/wireguard_keys.rs b/src-tauri/src/database/models/wireguard_keys.rs index ce776078..4cb7ad09 100644 --- a/src-tauri/src/database/models/wireguard_keys.rs +++ b/src-tauri/src/database/models/wireguard_keys.rs @@ -1,56 +1,65 @@ -use crate::{database::DbPool, error::Error}; -use sqlx::{query, query_as, Error as SqlxError}; +use sqlx::{query_as, query_scalar, Error as SqlxError, SqliteExecutor}; + +use super::{Id, NoId}; +use crate::error::Error; // User key pair #[derive(Debug)] -pub struct WireguardKeys { - pub id: Option, - pub instance_id: i64, +pub struct WireguardKeys { + pub id: I, + pub instance_id: Id, pub pubkey: String, pub prvkey: String, } -impl WireguardKeys { +impl WireguardKeys { + pub async fn find_by_instance_id<'e, E>( + executor: E, + instance_id: Id, + ) -> Result, SqlxError> + where + E: SqliteExecutor<'e>, + { + query_as!( + Self, + "SELECT id \"id: _\", instance_id, pubkey, prvkey \ + FROM wireguard_keys WHERE instance_id = $1", + instance_id + ) + .fetch_optional(executor) + .await + } +} + +impl WireguardKeys { #[must_use] - pub fn new(instance_id: i64, pubkey: String, prvkey: String) -> Self { + pub fn new(instance_id: Id, pubkey: String, prvkey: String) -> Self { WireguardKeys { - id: None, + id: NoId, instance_id, pubkey, prvkey, } } - pub async fn save<'e, E>(&mut self, executor: E) -> Result<(), Error> + pub async fn save<'e, E>(self, executor: E) -> Result, Error> where - E: sqlx::Executor<'e, Database = sqlx::Sqlite>, + E: SqliteExecutor<'e>, { - let result = query!( + let id = query_scalar!( "INSERT INTO wireguard_keys (instance_id, pubkey, prvkey) \ - VALUES ($1, $2, $3) \ - RETURNING id; - ", + VALUES ($1, $2, $3) RETURNING id \"id!\"", self.instance_id, self.pubkey, self.prvkey, ) .fetch_one(executor) .await?; - self.id = Some(result.id); - Ok(()) - } - - pub async fn find_by_instance_id( - pool: &DbPool, - instance_id: i64, - ) -> Result, SqlxError> { - query_as!( - Self, - "SELECT id \"id?\", instance_id, pubkey, prvkey \ - FROM wireguard_keys WHERE instance_id = $1;", - instance_id - ) - .fetch_optional(pool) - .await + Ok(WireguardKeys:: { + id, + instance_id: self.instance_id, + pubkey: self.pubkey, + prvkey: self.prvkey, + }) } } diff --git a/src-tauri/src/enterprise/mod.rs b/src-tauri/src/enterprise/mod.rs new file mode 100644 index 00000000..f9a20825 --- /dev/null +++ b/src-tauri/src/enterprise/mod.rs @@ -0,0 +1,2 @@ +pub mod models; +pub mod periodic; diff --git a/src-tauri/src/enterprise/models/instance.rs b/src-tauri/src/enterprise/models/instance.rs new file mode 100644 index 00000000..3cd5cc10 --- /dev/null +++ b/src-tauri/src/enterprise/models/instance.rs @@ -0,0 +1,24 @@ +use crate::database::models::Id; +use crate::database::Instance; +use crate::error::Error; +use sqlx::SqliteExecutor; + +impl Instance { + pub async fn disable_enterprise_features<'e, E>(&mut self, executor: E) -> Result<(), Error> + where + E: SqliteExecutor<'e>, + { + debug!( + "Disabling enterprise features for instance {}({})", + self.name, self.id + ); + self.enterprise_enabled = false; + self.disable_all_traffic = false; + self.save(executor).await?; + debug!( + "Disabled enterprise features for instance {}({})", + self.name, self.id + ); + Ok(()) + } +} diff --git a/src-tauri/src/enterprise/models/mod.rs b/src-tauri/src/enterprise/models/mod.rs new file mode 100644 index 00000000..1d5ea990 --- /dev/null +++ b/src-tauri/src/enterprise/models/mod.rs @@ -0,0 +1 @@ +pub mod instance; diff --git a/src-tauri/src/enterprise/periodic/config.rs b/src-tauri/src/enterprise/periodic/config.rs new file mode 100644 index 00000000..b34ef364 --- /dev/null +++ b/src-tauri/src/enterprise/periodic/config.rs @@ -0,0 +1,248 @@ +use std::{str::FromStr, time::Duration}; + +use reqwest::StatusCode; +use sqlx::{Sqlite, Transaction}; +use tauri::{AppHandle, Manager, State, Url}; +use tokio::time::sleep; + +use crate::{ + appstate::AppState, + commands::{do_update_instance, locations_changed}, + database::{models::Id, Instance}, + error::Error, + events::{CONFIG_CHANGED, INSTANCE_UPDATE}, + proto::{DeviceConfigResponse, InstanceInfoRequest, InstanceInfoResponse}, +}; + +const INTERVAL_SECONDS: Duration = Duration::from_secs(30); +const POLLING_ENDPOINT: &str = "/api/v1/poll"; + +/// Periodically retrieves and updates configuration for all [`Instance`]s. +/// Updates are only performed if no connections are established to the [`Instance`], +/// otherwise event is emmited and UI message is displayed. +pub async fn poll_config(handle: AppHandle) { + debug!("Starting the configuration polling loop..."); + let state: State = handle.state(); + let pool = state.get_pool(); + loop { + let Ok(mut transaction) = pool.begin().await else { + error!( + "Failed to begin database transaction for config polling, retrying in {}s", + INTERVAL_SECONDS.as_secs() + ); + sleep(INTERVAL_SECONDS).await; + continue; + }; + let Ok(mut instances) = Instance::all_with_token(&mut *transaction).await else { + error!( + "Failed to retireve instances for config polling, retrying in {}s", + INTERVAL_SECONDS.as_secs() + ); + let _ = transaction.rollback().await; + sleep(INTERVAL_SECONDS).await; + continue; + }; + debug!("Found {} instances with a config polling token, proceeding with polling their configuration...", instances.len()); + let mut config_retrieved = 0; + for instance in &mut instances { + if instance.token.is_some() { + if let Err(err) = poll_instance(&mut transaction, instance, &handle).await { + match err { + Error::CoreNotEnterprise => { + debug!( + "Tried to contact core for instance {} config but it's not enterprise, can't retrieve config", + instance, + ); + } + Error::NoToken => { + debug!( + "Instance {} has no token, can't retrieve its config from the core", + instance, + ); + } + _ => { + error!( + "Failed to retrieve instance {} config from core: {err}", + instance + ); + } + } + } else { + config_retrieved += 1; + debug!( + "Finished processing configuration polling request for instance {}", + instance + ); + } + } + } + if let Err(err) = transaction.commit().await { + error!("Failed to commit config polling transaction, configuration won't be updated: {err}"); + } + if let Err(err) = handle.emit_all(INSTANCE_UPDATE, ()) { + error!("Failed to emit instance update event to the frontend: {err}"); + } + if config_retrieved > 0 { + info!( + "Automatically retrieved the newest instance configuration from core for {} instances, sleeping for {}s", + config_retrieved, + INTERVAL_SECONDS.as_secs(), + ); + debug!("Instances for which configuration was retrieved from core: {instances:?}"); + } else { + debug!( + "No configuration updates retrieved, sleeping {}s", + INTERVAL_SECONDS.as_secs(), + ); + } + sleep(INTERVAL_SECONDS).await; + } +} + +/// Retrieves configuration for given [`Instance`]. +/// Updates the instance if there aren't any active connections, otherwise displays UI message. +pub async fn poll_instance( + transaction: &mut Transaction<'_, Sqlite>, + instance: &mut Instance, + handle: &AppHandle, +) -> Result<(), Error> { + debug!("Getting config from core for instance {}", instance.name); + // Query proxy api + let request = build_request(instance)?; + let url = Url::from_str(&instance.proxy_url) + .and_then(|url| url.join(POLLING_ENDPOINT)) + .map_err(|_| { + Error::InternalError(format!( + "Can't build polling url: {}/{POLLING_ENDPOINT}", + instance.proxy_url + )) + })?; + let response = reqwest::Client::new() + .post(url) + .json(&request) + .timeout(Duration::from_secs(5)) + .send() + .await; + let response = response.map_err(|err| { + Error::InternalError(format!( + "HTTP request failed for instance {}({}), url: {}, {err}", + instance.name, instance.id, instance.proxy_url + )) + })?; + debug!( + "Got the following config response for instance {} from core: {response:?}", + instance.name + ); + + // Return early if the enterprise features are disabled in the core + if response.status() == StatusCode::PAYMENT_REQUIRED { + debug!( + "Instance {}({}) has enterprise features disabled, checking if this state is reflected on our end...", + instance.name, instance.id + ); + if instance.enterprise_enabled { + info!( + "Instance {}({}) has enterprise features disabled, but we have them enabled, disabling...", + instance.name, instance.id + ); + instance + .disable_enterprise_features(transaction.as_mut()) + .await?; + } else { + debug!( + "Instance {}({}) has enterprise features disabled, and we have them disabled as well, no action needed", + instance.name, instance.id + ); + } + return Err(Error::CoreNotEnterprise); + } + + // Parse the response + debug!( + "Parsing the config response for instance {}...", + instance.name + ); + let response: InstanceInfoResponse = response.json().await.map_err(|err| { + Error::InternalError(format!( + "Failed to parse InstanceInfoResponse for instance {}({}): {err}", + instance.name, instance.id, + )) + })?; + let device_config = response + .device_config + .as_ref() + .ok_or_else(|| Error::InternalError("Device config not present in response".to_string()))?; + debug!("Parsed the config for instance {}", instance.name); + trace!("Parsed config: {device_config:?}"); + + // Early return if config didn't change + if !config_changed(transaction, instance, device_config).await? { + debug!( + "Config for instance {}({}) didn't change", + instance.name, instance.id + ); + return Ok(()); + } + + debug!( + "Config for instance {}({}) changed", + instance.name, instance.id + ); + + // Config changed. If there are no active connections for this instance, update the database. + // Otherwise just display a message to reconnect. + let state: State<'_, AppState> = handle.state(); + if state.active_connections(instance).await?.is_empty() { + debug!( + "Updating instance {}({}) configuration: {device_config:?}", + instance.name, instance.id, + ); + do_update_instance(transaction, instance, device_config.clone()).await?; + info!( + "Updated instance {}({}) configuration based on core's response", + instance.name, instance.id + ); + } else { + debug!( + "Emitting config-changed event for instance {}({})", + instance.name, instance.id, + ); + let _ = handle.emit_all(CONFIG_CHANGED, &instance.name); + info!( + "Emitted config-changed event for instance {}({})", + instance.name, instance.id, + ); + } + + Ok(()) +} + +async fn config_changed( + transaction: &mut Transaction<'_, Sqlite>, + instance: &Instance, + device_config: &DeviceConfigResponse, +) -> Result { + debug!( + "Checking if config and any of the locations changed for instance {}({})", + instance.name, instance.id + ); + let locations_changed = locations_changed(transaction, instance, device_config).await?; + let info_changed = match &device_config.instance { + Some(info) => instance != info, + None => false, + }; + debug!( + "Did the locations change?: {}. Did the instance information change?: {}", + locations_changed, info_changed + ); + Ok(locations_changed || info_changed) +} + +/// Retrieves pubkey & token to build InstanceInfoRequest +fn build_request(instance: &Instance) -> Result { + let token = &instance.token.as_ref().ok_or_else(|| Error::NoToken)?; + + Ok(InstanceInfoRequest { + token: (*token).to_string(), + }) +} diff --git a/src-tauri/src/enterprise/periodic/mod.rs b/src-tauri/src/enterprise/periodic/mod.rs new file mode 100644 index 00000000..ef68c369 --- /dev/null +++ b/src-tauri/src/enterprise/periodic/mod.rs @@ -0,0 +1 @@ +pub mod config; diff --git a/src-tauri/src/error.rs b/src-tauri/src/error.rs index 11817d04..bdd2ac57 100644 --- a/src-tauri/src/error.rs +++ b/src-tauri/src/error.rs @@ -1,17 +1,14 @@ use std::net::AddrParseError; -use base64; use defguard_wireguard_rs::{error::WireguardInterfaceError, net::IpAddrParseError}; -use local_ip_address::Error as LocalIpError; -use sqlx; use thiserror::Error; #[derive(Debug, Error)] pub enum Error { #[error(transparent)] Io(#[from] std::io::Error), - #[error("Config directory error")] - Config, + #[error("Application config directory error: {0}")] + Config(String), #[error("Database error: {0}")] Database(#[from] sqlx::Error), #[error("Migrate error: {0}")] @@ -25,7 +22,7 @@ pub enum Error { #[error("IP address parse error: {0}")] AddrParse(#[from] AddrParseError), #[error("Local Ip Error: {0}")] - LocalIpError(#[from] LocalIpError), + LocalIpError(#[from] local_ip_address::Error), #[error("Internal error: {0}")] InternalError(String), #[error("Failed to parse timestamp")] @@ -40,10 +37,12 @@ pub enum Error { ResourceNotFound(String), #[error("Config parse error {0}")] ConfigParseError(String), - #[error("Failed to acquire mutex lock")] - MutexError, #[error("Command failed: {0}")] CommandError(String), + #[error("Core is not enterprise")] + CoreNotEnterprise, + #[error("Instance has no config polling token")] + NoToken, } // we must manually implement serde::Serialize diff --git a/src-tauri/src/events.rs b/src-tauri/src/events.rs new file mode 100644 index 00000000..f3bcec6a --- /dev/null +++ b/src-tauri/src/events.rs @@ -0,0 +1,6 @@ +pub static SINGLE_INSTANCE: &str = "single-instance"; +pub static CONNECTION_CHANGED: &str = "connection-changed"; +pub static INSTANCE_UPDATE: &str = "instance-update"; +pub static LOCATION_UPDATE: &str = "location-update"; +pub static APP_VERSION_FETCH: &str = "app-version-fetch"; +pub static CONFIG_CHANGED: &str = "config-changed"; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e6f6000d..c6a90dd4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,41 +1,53 @@ use chrono::NaiveDateTime; +use database::models::NoId; use serde::{Deserialize, Serialize}; pub mod appstate; pub mod commands; pub mod database; +pub mod enterprise; pub mod error; -pub mod latest_app_version; +pub mod events; +pub mod log_watcher; +pub mod periodic; pub mod service; pub mod tray; pub mod utils; pub mod wg_config; +use std::fmt; -pub mod proto { +mod proto { tonic::include_proto!("defguard.proxy"); } -#[derive(Clone, serde::Serialize)] -struct Payload { - args: Vec, - cwd: String, -} +pub const VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), "-", env!("VERGEN_GIT_SHA")); /// Location type used in commands to check if we using tunnel or location -#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)] +#[derive(Debug, PartialEq, Deserialize, Serialize, Clone, Copy)] pub enum ConnectionType { Tunnel, Location, } +impl fmt::Display for ConnectionType { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ConnectionType::Tunnel => write!(f, "tunnel"), + ConnectionType::Location => write!(f, "location"), + } + } +} + #[macro_use] extern crate log; +use self::database::models::Id; + /// Common fields for Tunnel and Location #[derive(Debug, Serialize, Deserialize)] pub struct CommonWireguardFields { - pub instance_id: i64, + pub instance_id: Id, // Native id of network from defguard - pub network_id: i64, + pub network_id: Id, pub name: String, pub address: String, pub pubkey: String, @@ -47,9 +59,9 @@ pub struct CommonWireguardFields { /// Common fields for Connection and TunnelConnection due to shared command #[derive(Debug, Serialize, Deserialize)] -pub struct CommonConnection { - pub id: Option, - pub location_id: i64, +pub struct CommonConnection { + pub id: I, + pub location_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, @@ -58,9 +70,9 @@ pub struct CommonConnection { // Common fields for LocationStats and TunnelStats due to shared command #[derive(Debug, Serialize, Deserialize)] -pub struct CommonLocationStats { - pub id: Option, - pub location_id: i64, +pub struct CommonLocationStats { + pub id: I, + pub location_id: Id, pub upload: i64, pub download: i64, pub last_handshake: i64, @@ -72,8 +84,8 @@ pub struct CommonLocationStats { // Common fields for ConnectionInfo and TunnelConnectionInfo due to shared command #[derive(Debug, Serialize)] pub struct CommonConnectionInfo { - pub id: i64, - pub location_id: i64, + pub id: Id, + pub location_id: Id, pub connected_from: String, pub start: NaiveDateTime, pub end: NaiveDateTime, diff --git a/src-tauri/src/log_watcher/global_log_watcher.rs b/src-tauri/src/log_watcher/global_log_watcher.rs new file mode 100644 index 00000000..26ad2cc3 --- /dev/null +++ b/src-tauri/src/log_watcher/global_log_watcher.rs @@ -0,0 +1,492 @@ +//! Global log watcher that monitors both the service and client logs. +//! +// FIXME: Some of the code here overlaps with the `log_watcher` module and could be refactored to avoid duplication. + +use std::{ + fs::{read_dir, File}, + io::{BufRead, BufReader}, + path::PathBuf, + str::FromStr, + thread::sleep, + time::Duration, +}; + +use chrono::{DateTime, NaiveDate, NaiveDateTime, TimeZone, Utc}; +use regex::Regex; +use tauri::{async_runtime::TokioJoinHandle, AppHandle, Manager}; +use tokio_util::sync::CancellationToken; +use tracing::Level; + +use crate::{ + appstate::AppState, + error::Error, + log_watcher::{extract_timestamp, LogLine, LogLineFields, LogSource, LogWatcherError}, + utils::get_service_log_dir, +}; + +/// Helper struct to handle log directory logic +#[derive(Debug)] +pub struct LogDirs { + // Service + service_log_dir: PathBuf, + current_service_log_file: Option, + // Client + client_log_dir: PathBuf, +} + +const DELAY: Duration = Duration::from_secs(2); + +impl LogDirs { + #[must_use] + pub fn new(handle: &AppHandle) -> Result { + debug!("Getting log directories for service and client to watch."); + let service_log_dir = get_service_log_dir().to_path_buf(); + let client_log_dir = + handle + .path_resolver() + .app_log_dir() + .ok_or(LogWatcherError::LogPathError( + "Path to client logs directory is empty.".to_string(), + ))?; + debug!( + "Log directories of service and client have been identified by the global log watcher: {:?} and {:?}", + service_log_dir, client_log_dir + ); + + return Ok(Self { + service_log_dir, + current_service_log_file: None, + client_log_dir, + }); + } + + /// Find the latest log file in directory for the service + /// + /// Log files are rotated daily and have a known naming format, + /// with the last 10 characters specifying a date (e.g. `2023-12-15`). + fn get_latest_log_file(&self) -> Result, LogWatcherError> { + trace!( + "Getting latest log file from directory: {:?}", + self.service_log_dir + ); + let entries = read_dir(&self.service_log_dir)?; + + let mut latest_log = None; + let mut latest_time = NaiveDate::MIN; + for entry in entries.flatten() { + // skip directories + if entry.metadata()?.is_file() { + let filename = entry.file_name().to_string_lossy().into_owned(); + if let Some(timestamp) = extract_timestamp(&filename) { + if timestamp > latest_time { + latest_time = timestamp; + latest_log = Some(entry.path()); + } + } + } + } + + Ok(latest_log) + } + + fn get_current_service_file(&self) -> Result { + trace!( + "Opening service log file: {:?}", + self.current_service_log_file + ); + match &self.current_service_log_file { + Some(path) => { + let file = File::open(path)?; + trace!( + "Successfully opened service log file at {:?}", + self.current_service_log_file + ); + Ok(file) + } + None => Err(LogWatcherError::LogPathError(format!( + "Couldn't find service log file at: {:?}", + self.current_service_log_file + ))), + } + } + + fn get_client_file(&self) -> Result { + trace!( + "Opening the log file for the client, using directory: {:?}", + self.client_log_dir + ); + let dir_str = self + .client_log_dir + .to_str() + .ok_or(LogWatcherError::LogPathError(format!( + "Couldn't convert the client log directory path ({:?}) to a string slice", + self.client_log_dir + )))?; + let path = format!("{}/defguard-client.log", dir_str); + trace!("Constructed client log file path: {path}"); + let file = File::open(&path)?; + trace!("Client log file at {:?} opened successfully", path); + Ok(file) + } +} + +#[derive(Debug)] +pub struct GlobalLogWatcher { + log_level: Level, + from: Option>, + log_dirs: LogDirs, + handle: AppHandle, + cancellation_token: CancellationToken, + event_topic: String, +} + +impl GlobalLogWatcher { + #[must_use] + pub fn new( + handle: AppHandle, + cancellation_token: CancellationToken, + event_topic: String, + log_level: Level, + from: Option>, + ) -> Result { + Ok(Self { + log_level, + from, + log_dirs: LogDirs::new(&handle)?, + handle, + cancellation_token, + event_topic, + }) + } + + /// Start log watching, calls the [`parse_log_dirs`] function. + pub fn run(&mut self) -> Result<(), LogWatcherError> { + self.parse_log_dirs() + } + + /// Parse the log files + /// + /// This function will open the log files and read them line by line, parsing each line + /// into a [`LogLine`] struct and emitting it to the frontend. It can be stopped by cancelling + /// the token by calling [`stop_global_log_watcher_task()`] + fn parse_log_dirs(&mut self) -> Result<(), LogWatcherError> { + trace!("Processing log directories for service and client."); + self.log_dirs.current_service_log_file = self.log_dirs.get_latest_log_file()?; + trace!( + "Latest service log file found: {:?}", + self.log_dirs.current_service_log_file + ); + + let mut service_reader = if let Ok(file) = self.log_dirs.get_current_service_file() { + Some(BufReader::new(file)) + } else { + None + }; + let mut client_reader = if let Ok(file) = self.log_dirs.get_client_file() { + Some(BufReader::new(file)) + } else { + None + }; + + trace!("Checking if log files are available"); + if service_reader.is_none() && client_reader.is_none() { + warn!( + "Couldn't read files at {:?} and {:?}, there will be no logs reported in the client.", + self.log_dirs.current_service_log_file, self.log_dirs.client_log_dir + ); + // Wait for logs to appear. + sleep(DELAY); + return Ok(()); + } + trace!("Log files are available, starting to read lines."); + + let mut service_line = String::new(); + let mut client_line = String::new(); + let mut parsed_lines = Vec::new(); + + // Track the amount of bytes read from the log lines + let mut service_line_read; + let mut client_line_read; + + debug!("Global log watcher is starting the loop for reading client and service log files"); + loop { + if self.cancellation_token.is_cancelled() { + debug!("Received cancellation request. Stopping global log watcher"); + break; + } + // Service + // If the reader is present, read the log file to the end. + // Parse every line. If we hit EOF, check if there's a new log file. + // If there is, switch to it and leave the loop. + if let Some(reader) = &mut service_reader { + trace!("Reading service log lines"); + loop { + service_line_read = reader.read_line(&mut service_line)?; + if service_line_read == 0 { + trace!("Read 0 bytes from service log file, probably reached EOF."); + let latest_log_file = self.log_dirs.get_latest_log_file()?; + if latest_log_file.is_some() + && latest_log_file != self.log_dirs.current_service_log_file + { + debug!( + "Found a new service log file: {:?}, switching to it.", + latest_log_file + ); + self.log_dirs.current_service_log_file = latest_log_file; + break; + } + } else { + trace!("Read service log line: {service_line:?}"); + if let Some(parsed_line) = self.parse_service_log_line(&service_line)? { + trace!("Parsed service log line: {parsed_line:?}"); + parsed_lines.push(parsed_line); + } + service_line.clear(); + } + + if service_line_read == 0 { + break; + } + } + } else { + debug!("Service log reader is not present, not reading service log lines."); + } + + // Client + // If the reader is present, read the log file to the end. + // Parse every line. + // Warning: don't use anything other than a trace log level in this loop for logs that would appear on every iteration (or very often) + // This could result in the reader constantly producing and consuming logs without any progress. + if let Some(reader) = &mut client_reader { + loop { + client_line_read = reader.read_line(&mut client_line)?; + if client_line_read > 0 { + match self.parse_client_log_line(&client_line) { + Ok(Some(parsed_line)) => { + trace!("Parsed client log line: {parsed_line:?}"); + parsed_lines.push(parsed_line); + } + Ok(None) => { + trace!("The following log line was filtered out: {client_line:?}"); + } + Err(err) => { + // trace here is intentional, adding error logs would loop the reader infinitely + trace!("Couldn't parse client log line: {client_line:?}: {err}"); + } + } + client_line.clear(); + } else { + break; + } + } + } else { + debug!("Client log file reader is not present, not reading client logs."); + } + + trace!("Read 0 bytes from both log files, we've reached EOF in both cases."); + if !parsed_lines.is_empty() { + parsed_lines.sort_by(|a, b| a.timestamp.cmp(&b.timestamp)); + trace!("Emitting parsed lines for the frontend"); + self.handle.emit_all(&self.event_topic, &parsed_lines)?; + trace!("Emitted {} lines to the frontend", parsed_lines.len()); + parsed_lines.clear(); + } + trace!("Sleeping for {DELAY:?} seconds before reading again"); + sleep(DELAY); + } + + Ok(()) + } + + /// Parse a service log line + /// + /// Deserializes the log line into a known struct. + /// Also performs filtering by log level and optional timestamp. + fn parse_service_log_line(&self, line: &str) -> Result, LogWatcherError> { + trace!("Parsing service log line: {line}"); + let mut log_line = if let Ok(line) = serde_json::from_str::(line) { + line + } else { + warn!("Failed to parse service log line: {line}"); + return Ok(None); + }; + trace!("Parsed service log line into: {log_line:?}"); + + // filter by log level + if log_line.level > self.log_level { + trace!( + "Log level {} is above configured verbosity threshold {}. Skipping line...", + log_line.level, + self.log_level + ); + return Ok(None); + } + + // filter by optional timestamp + if let Some(from) = self.from { + if log_line.timestamp < from { + trace!( + "Timestamp {} is below configured threshold {from}. Skipping line...", + log_line.timestamp + ); + return Ok(None); + } + } + + log_line.source = Some(LogSource::Service); + + trace!("Successfully parsed service log line."); + + Ok(Some(log_line)) + } + + /// Parse a client log line into a known struct using regex. + /// If the line doesn't match the regex, it's filtered out. + fn parse_client_log_line(&self, line: &str) -> Result, LogWatcherError> { + trace!("Parsing client log line: {line}"); + // Example log: + // [2024-10-09][09:08:41][DEBUG][defguard_client::commands] Retrieving all locations. + let regex = Regex::new(r"\[(.*?)\]\[(.*?)\]\[(.*?)\]\[(.*?)\] (.*)")?; + let captures = regex + .captures(line) + .ok_or(LogWatcherError::LogParseError(line.to_string()))?; + let timestamp_date = captures + .get(1) + .ok_or(LogWatcherError::LogParseError(line.to_string()))? + .as_str(); + let timestamp_time = captures + .get(2) + .ok_or(LogWatcherError::LogParseError(line.to_string()))? + .as_str(); + + let timestamp = format!("{} {}", timestamp_date, timestamp_time); + let timestamp = Utc.from_utc_datetime( + &NaiveDateTime::parse_from_str(×tamp, "%Y-%m-%d %H:%M:%S%.f").map_err(|e| { + LogWatcherError::LogParseError(format!( + "Failed to parse timestamp {} with error: {}", + timestamp, e + )) + })?, + ); + + let level = tracing::Level::from_str( + captures + .get(3) + .ok_or(LogWatcherError::LogParseError(line.to_string()))? + .as_str(), + ) + .map_err(|e| { + LogWatcherError::LogParseError(format!("Failed to parse log level with error: {}", e)) + })?; + + let target = captures + .get(4) + .ok_or(LogWatcherError::LogParseError(line.to_string()))? + .as_str() + .to_string(); + + let message = captures + .get(5) + .ok_or(LogWatcherError::LogParseError(line.to_string()))? + .as_str(); + + let fields = LogLineFields { + message: message.to_string(), + }; + + let log_line = LogLine { + timestamp, + level, + target, + fields, + span: None, + source: Some(LogSource::Client), + }; + + if log_line.level > self.log_level { + trace!( + "Log level {} is above configured verbosity threshold {}. Skipping line...", + log_line.level, + self.log_level + ); + return Ok(None); + } + + if let Some(from) = self.from { + if log_line.timestamp < from { + trace!("Timestamp is before configured threshold {from}. Skipping line..."); + return Ok(None); + } + } + + trace!( + "Successfully parsed client log line from file {:?}", + self.log_dirs.client_log_dir + ); + Ok(Some(log_line)) + } +} + +/// Starts a global log watcher in a separate thread +pub async fn spawn_global_log_watcher_task( + handle: &AppHandle, + log_level: Level, +) -> Result { + debug!("Spawning global log watcher."); + let app_state = handle.state::(); + + // Show logs only from the last hour + let from = Some(Utc::now() - Duration::from_secs(60 * 60)); + + let event_topic = format!("log-update-global"); + + // explicitly clone before topic is moved into the closure + let topic_clone = event_topic.clone(); + let handle_clone = handle.clone(); + + // prepare cancellation token + let token = CancellationToken::new(); + let token_clone = token.clone(); + + // spawn the task + let _join_handle: TokioJoinHandle> = tokio::spawn(async move { + GlobalLogWatcher::new(handle_clone, token_clone, topic_clone, log_level, from)?.run()?; + Ok(()) + }); + + // store `CancellationToken` to manually stop watcher thread + let mut log_watchers = app_state + .log_watchers + .lock() + .expect("Failed to lock log watchers mutex"); + if let Some(old_token) = log_watchers.insert("GLOBAL".to_string(), token) { + // cancel previous global log watcher + debug!("Existing global log watcher found. Cancelling..."); + old_token.cancel(); + } + + debug!("Global log watcher spawned"); + Ok(event_topic) +} + +pub fn stop_global_log_watcher_task(handle: &AppHandle) -> Result<(), Error> { + debug!("Cancelling global log watcher task"); + let app_state = handle.state::(); + + // get `CancellationToken` to manually stop watcher thread + let mut log_watchers = app_state + .log_watchers + .lock() + .expect("Failed to lock log watchers mutex"); + + if let Some(token) = log_watchers.remove("GLOBAL") { + debug!("Using cancellation token for global log watcher"); + token.cancel(); + debug!("Global log watcher cancelled"); + Ok(()) + } else { + // Silently ignore if global log watcher is not found, as there is nothing to cancel + debug!("Global log watcher not found, nothing to cancel"); + Ok(()) + } +} diff --git a/src-tauri/src/log_watcher/mod.rs b/src-tauri/src/log_watcher/mod.rs new file mode 100644 index 00000000..c7e34c67 --- /dev/null +++ b/src-tauri/src/log_watcher/mod.rs @@ -0,0 +1,64 @@ +use chrono::{DateTime, NaiveDate, Utc}; +use serde::{Deserialize, Serialize}; +use serde_with::{serde_as, DisplayFromStr}; +use thiserror::Error; +use tracing::Level; + +pub mod global_log_watcher; +pub mod service_log_watcher; + +#[derive(Error, Debug)] +pub enum LogWatcherError { + #[error(transparent)] + TauriError(#[from] tauri::Error), + #[error(transparent)] + SerdeJsonError(#[from] serde_json::Error), + #[error(transparent)] + TokioError(#[from] regex::Error), + #[error(transparent)] + IoError(#[from] std::io::Error), + #[error("Error while accessing the log file: {0}")] + LogPathError(String), + #[error("Failed to parse log line: {0}")] + LogParseError(String), +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub enum LogSource { + Service, + Client, +} + +/// Represents a single line in log file +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize)] +struct LogLine { + timestamp: DateTime, + #[serde_as(as = "DisplayFromStr")] + level: Level, + target: String, + fields: LogLineFields, + span: Option, + source: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +struct Span { + interface_name: Option, + name: Option, + peer: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +struct LogLineFields { + message: String, +} + +fn extract_timestamp(filename: &str) -> Option { + trace!("Extracting timestamp from log file name: {filename}"); + // we know that the date is always in the last 10 characters + let split_pos = filename.char_indices().nth_back(9)?.0; + let timestamp = &filename[split_pos..]; + // parse and convert to `NaiveDate` + NaiveDate::parse_from_str(timestamp, "%Y-%m-%d").ok() +} diff --git a/src-tauri/src/service/log_watcher.rs b/src-tauri/src/log_watcher/service_log_watcher.rs similarity index 54% rename from src-tauri/src/service/log_watcher.rs rename to src-tauri/src/log_watcher/service_log_watcher.rs index 5d67343b..fbc297ba 100644 --- a/src-tauri/src/service/log_watcher.rs +++ b/src-tauri/src/log_watcher/service_log_watcher.rs @@ -4,76 +4,46 @@ //! The watcher monitors a given directory for any changes. Whenever a change is detected //! it parses the log files and sends logs relevant to a specified interface to the fronted. -use crate::{appstate::AppState, error::Error, utils::get_service_log_dir, ConnectionType}; -use chrono::{DateTime, NaiveDate, NaiveTime, Utc}; -use notify_debouncer_mini::{ - new_debouncer, - notify::{self, RecursiveMode}, -}; -use serde::{Deserialize, Serialize}; -use serde_with::{serde_as, DisplayFromStr}; use std::{ fs::{read_dir, File}, io::{BufRead, BufReader}, - path::PathBuf, + path::{Path, PathBuf}, str::FromStr, - time::{Duration, SystemTime}, + thread::sleep, + time::Duration, }; + +use chrono::{DateTime, NaiveDate, Utc}; use tauri::{async_runtime::TokioJoinHandle, AppHandle, Manager}; -use thiserror::Error; use tokio_util::sync::CancellationToken; use tracing::Level; -#[derive(Error, Debug)] -pub enum LogWatcherError { - #[error(transparent)] - TauriError(#[from] tauri::Error), - #[error(transparent)] - SerdeJsonError(#[from] serde_json::Error), - #[error(transparent)] - NotifyError(#[from] notify::Error), - #[error(transparent)] - IoError(#[from] std::io::Error), -} +use crate::{ + appstate::AppState, + database::models::Id, + error::Error, + log_watcher::extract_timestamp, + utils::{get_service_log_dir, get_tunnel_or_location_name}, + ConnectionType, +}; -/// Represents a single line in log file -#[serde_as] -#[derive(Clone, Debug, Deserialize, Serialize)] -struct LogLine { - timestamp: DateTime, - #[serde_as(as = "DisplayFromStr")] - level: Level, - target: String, - fields: LogLineFields, - span: Option, -} +use super::{LogLine, LogWatcherError}; -#[derive(Clone, Debug, Deserialize, Serialize)] -struct Span { - interface_name: Option, - name: Option, - peer: Option, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -struct LogLineFields { - message: String, -} +const DELAY: Duration = Duration::from_secs(2); #[derive(Debug)] -pub struct ServiceLogWatcher { +pub struct ServiceLogWatcher<'a> { interface_name: String, log_level: Level, from: Option>, - log_dir: PathBuf, + log_dir: &'a Path, current_log_file: Option, - current_position: u64, handle: AppHandle, cancellation_token: CancellationToken, event_topic: String, } -impl ServiceLogWatcher { +impl<'a> ServiceLogWatcher<'a> { #[must_use] pub fn new( handle: AppHandle, @@ -82,17 +52,14 @@ impl ServiceLogWatcher { interface_name: String, log_level: Level, from: Option>, + log_dir: &'a Path, ) -> Self { - // get log file directory - let log_dir = get_service_log_dir(); - info!("Log dir: {log_dir:?}"); Self { interface_name, log_level, from, log_dir, current_log_file: None, - current_position: 0, handle, cancellation_token, event_topic, @@ -103,32 +70,19 @@ impl ServiceLogWatcher { /// /// Setup a directory watcher with a 2 second debounce and parse the log dir on each change. pub fn run(&mut self) -> Result<(), LogWatcherError> { - // setup debouncer - let (tx, rx) = std::sync::mpsc::channel(); - let mut debouncer = new_debouncer(Duration::from_secs(2), tx)?; - - debouncer - .watcher() - .watch(&self.log_dir, RecursiveMode::Recursive)?; - - // parse log dir initially before watching for changes - self.parse_log_dir()?; + // get latest log file + let latest_log_file = self.get_latest_log_file()?; + debug!("found latest log file: {latest_log_file:?}"); + self.current_log_file = latest_log_file; - for result in rx { + // indefinitely watch for changes + loop { + self.parse_log_dir()?; if self.cancellation_token.is_cancelled() { - info!( - "Received cancellation request. Stopping log watcher for interface {}", - self.interface_name - ); break; - } - match result { - Ok(_events) => { - self.parse_log_dir()?; - } - Err(error) => println!("Error {error:?}"), - } + }; } + Ok(()) } @@ -140,38 +94,47 @@ impl ServiceLogWatcher { /// so only new log lines are sent to the frontend whenever a change in /// the directory is detected. fn parse_log_dir(&mut self) -> Result<(), LogWatcherError> { - // get latest log file - let latest_log_file = self.get_latest_log_file()?; - debug!("found latest log file: {latest_log_file:?}"); - - // check if latest file changed - if latest_log_file.is_some() && latest_log_file != self.current_log_file { - self.current_log_file = latest_log_file; - // reset read position - self.current_position = 0; - } - // read and parse file from last position if let Some(log_file) = &self.current_log_file { let file = File::open(log_file)?; - let size = file.metadata()?.len(); let mut reader = BufReader::new(file); - reader.seek_relative(self.current_position as i64)?; + let mut line = String::new(); let mut parsed_lines = Vec::new(); - for line in reader.lines() { - let line = line?; - if let Some(parsed_line) = self.parse_log_line(line)? { - parsed_lines.push(parsed_line); + loop { + let size = reader.read_line(&mut line)?; + if size == 0 { + // emit event with all relevant log lines + if !parsed_lines.is_empty() { + trace!("Emitting {} log lines for the frontend", parsed_lines.len()); + self.handle.emit_all(&self.event_topic, &parsed_lines)?; + } + parsed_lines.clear(); + + sleep(DELAY); + + let latest_log_file = self.get_latest_log_file()?; + if latest_log_file.is_some() && latest_log_file != self.current_log_file { + debug!( + "New log file detected. Switching to new log file: {latest_log_file:?}" + ); + self.current_log_file = latest_log_file; + break; + } + } else { + if let Some(parsed_line) = self.parse_log_line(&line)? { + parsed_lines.push(parsed_line); + } + line.clear(); + } + if self.cancellation_token.is_cancelled() { + info!( + "The background task responsible for watching the defguard service log file for interface {} is being stopped.", self.interface_name + ); + break; } } - // emit event with all relevant log lines - if !parsed_lines.is_empty() { - self.handle.emit_all(&self.event_topic, parsed_lines)?; - } - - // update read position to end of file - self.current_position = size; } + Ok(()) } @@ -179,9 +142,9 @@ impl ServiceLogWatcher { /// /// Deserializes the log line into a known struct and checks if the line is relevant /// to the specified interface. Also performs filtering by log level and optional timestamp. - fn parse_log_line(&self, line: String) -> Result, LogWatcherError> { + fn parse_log_line(&self, line: &str) -> Result, LogWatcherError> { trace!("Parsing log line: {line}"); - let log_line = serde_json::from_str::(&line)?; + let log_line = serde_json::from_str::(line)?; trace!("Parsed log line into: {log_line:?}"); // filter by log level @@ -219,11 +182,11 @@ impl ServiceLogWatcher { /// Log files are rotated daily and have a knows naming format, /// with the last 10 characters specifying a date (e.g. `2023-12-15`). fn get_latest_log_file(&self) -> Result, LogWatcherError> { - debug!("Getting latest log file from directory: {:?}", self.log_dir); - let entries = read_dir(&self.log_dir)?; + trace!("Getting latest log file from directory: {:?}", self.log_dir); + let entries = read_dir(self.log_dir)?; let mut latest_log = None; - let mut latest_time = SystemTime::UNIX_EPOCH; + let mut latest_time = NaiveDate::MIN; for entry in entries.flatten() { // skip directories if entry.metadata()?.is_file() { @@ -236,21 +199,9 @@ impl ServiceLogWatcher { } } } - Ok(latest_log) - } -} -fn extract_timestamp(filename: &str) -> Option { - trace!("Extracting timestamp from log file name: {filename}"); - // we know that the date is always in the last 10 characters - let split_pos = filename.char_indices().nth_back(9)?.0; - let timestamp = &filename[split_pos..]; - // parse and convert to `SystemTime` - if let Ok(timestamp) = NaiveDate::parse_from_str(timestamp, "%Y-%m-%d") { - let timestamp = timestamp.and_time(NaiveTime::default()).timestamp(); - return Some(SystemTime::UNIX_EPOCH + Duration::from_secs(timestamp as u64)); + Ok(latest_log) } - None } /// Starts a log watcher in a separate thread @@ -261,25 +212,25 @@ fn extract_timestamp(filename: &str) -> Option { /// Returned value is the name of an event topic to monitor. pub async fn spawn_log_watcher_task( handle: AppHandle, - location_id: i64, + location_id: Id, interface_name: String, connection_type: ConnectionType, log_level: Level, from: Option, ) -> Result { - info!("Spawning log watcher task for location ID {location_id}, interface {interface_name}"); + debug!("Spawning log watcher task for location ID {location_id}, interface {interface_name}"); let app_state = handle.state::(); // parse `from` timestamp let from = from.and_then(|from| DateTime::::from_str(&from).ok()); - let connection_type = if connection_type.eq(&ConnectionType::Tunnel) { + let connection_type_str = if connection_type.eq(&ConnectionType::Tunnel) { "Tunnel" } else { "Location" }; - let event_topic = format!("log-update-{connection_type}-{location_id}"); - debug!("Using event topic: {event_topic}"); + let event_topic = format!("log-update-{connection_type_str}-{location_id}"); + debug!("Using the following event topic for the service log watcher for communicating with the frontend: {event_topic}"); // explicitly clone before topic is moved into the closure let topic_clone = event_topic.clone(); @@ -290,37 +241,46 @@ pub async fn spawn_log_watcher_task( let token = CancellationToken::new(); let token_clone = token.clone(); + let log_dir = get_service_log_dir(); // get log file directory + let mut log_watcher = ServiceLogWatcher::new( + handle_clone, + token_clone, + topic_clone, + interface_name_clone, + log_level, + from, + log_dir, + ); + // spawn task let _join_handle: TokioJoinHandle> = tokio::spawn(async move { - let mut log_watcher = ServiceLogWatcher::new( - handle_clone, - token_clone, - topic_clone, - interface_name_clone, - log_level, - from, - ); log_watcher.run()?; Ok(()) }); // store `CancellationToken` to manually stop watcher thread - let mut log_watchers = app_state - .log_watchers - .lock() - .expect("Failed to lock log watchers mutex"); - if let Some(old_token) = log_watchers.insert(interface_name.clone(), token) { - // cancel previous log watcher for this interface - debug!("Existing log watcher for interface {interface_name} found. Cancelling..."); - old_token.cancel(); + // keep this in a block as we .await later, which should not be done while holding a lock like this + { + let mut log_watchers = app_state + .log_watchers + .lock() + .expect("Failed to lock log watchers mutex"); + if let Some(old_token) = log_watchers.insert(interface_name.clone(), token) { + // cancel previous log watcher for this interface + debug!("Existing log watcher for interface {interface_name} found. Cancelling..."); + old_token.cancel(); + } } + let name = get_tunnel_or_location_name(location_id, connection_type, &app_state).await; + info!("A background task has been spawned to watch the defguard service log file for {connection_type} {name} (interface {interface_name}), \ + location's specific collected logs will be displayed in the {connection_type}'s detailed view."); Ok(event_topic) } /// Stops the log watcher thread -pub fn stop_log_watcher_task(handle: AppHandle, interface_name: String) -> Result<(), Error> { - info!("Stopping log watcher task for interface {interface_name}"); +pub fn stop_log_watcher_task(handle: &AppHandle, interface_name: &str) -> Result<(), Error> { + debug!("Stopping service log watcher task for interface {interface_name}"); let app_state = handle.state::(); // get `CancellationToken` to manually stop watcher thread @@ -329,15 +289,15 @@ pub fn stop_log_watcher_task(handle: AppHandle, interface_name: String) -> Resul .lock() .expect("Failed to lock log watchers mutex"); - match log_watchers.remove(&interface_name) { - Some(token) => { - debug!("Using cancellation token for log watcher on interface {interface_name}"); - token.cancel(); - Ok(()) - } - None => { - error!("Log watcher for interface {interface_name} not found."); - Err(Error::NotFound) - } + if let Some(token) = log_watchers.remove(interface_name) { + debug!("Using cancellation token for service log watcher on interface {interface_name}"); + token.cancel(); + debug!("Service log watcher for interface {interface_name} stopped"); + Ok(()) + } else { + debug!( + "Service log watcher for interface {interface_name} couldn't be found, nothing to stop" + ); + Err(Error::NotFound) } } diff --git a/src-tauri/src/periodic/mod.rs b/src-tauri/src/periodic/mod.rs new file mode 100644 index 00000000..a6db76ad --- /dev/null +++ b/src-tauri/src/periodic/mod.rs @@ -0,0 +1 @@ +pub mod version; diff --git a/src-tauri/src/latest_app_version.rs b/src-tauri/src/periodic/version.rs similarity index 65% rename from src-tauri/src/latest_app_version.rs rename to src-tauri/src/periodic/version.rs index dfc0c434..6bb46b65 100644 --- a/src-tauri/src/latest_app_version.rs +++ b/src-tauri/src/periodic/version.rs @@ -1,17 +1,22 @@ use std::time::Duration; + use tauri::{AppHandle, Manager}; use tokio::time::sleep; -use crate::{appstate::AppState, commands::get_latest_app_version, database::Settings}; +use crate::{ + appstate::AppState, commands::get_latest_app_version, database::Settings, + events::APP_VERSION_FETCH, +}; const INTERVAL_IN_SECONDS: Duration = Duration::from_secs(12 * 60 * 60); // 12 hours -pub async fn fetch_latest_app_version_loop(app_handle: AppHandle) { +pub async fn poll_version(app_handle: AppHandle) { + debug!("Starting the latest application version polling loop..."); let state = app_handle.state::(); let pool = &state.get_pool(); loop { - debug!("Waiting to fetch latest application version"); + debug!("Waiting to fetch latest application version for {INTERVAL_IN_SECONDS:?}..."); sleep(INTERVAL_IN_SECONDS).await; let settings = Settings::get(pool).await; @@ -23,7 +28,7 @@ pub async fn fetch_latest_app_version_loop(app_handle: AppHandle) { if let Ok(result) = response { debug!("Fetched latest application version info: {result:?}"); - let _ = app_handle.emit_all("app-version-fetch", &result); + let _ = app_handle.emit_all(APP_VERSION_FETCH, &result); } else { let err = response.err().unwrap(); error!("Error while fetching latest application version: {err}"); @@ -33,7 +38,9 @@ pub async fn fetch_latest_app_version_loop(app_handle: AppHandle) { } } else { let err = settings.err().unwrap(); - error!("Error while fetching settings: {err}"); + error!( + "Couldn't fetch settings while checking for the latest application version: {err}" + ); } } } diff --git a/src-tauri/src/service/config.rs b/src-tauri/src/service/config.rs index 99f33cf2..6277d19f 100644 --- a/src-tauri/src/service/config.rs +++ b/src-tauri/src/service/config.rs @@ -1,5 +1,10 @@ use clap::Parser; +#[cfg(target_os = "windows")] +pub const DEFAULT_LOG_DIR: &str = "/Logs/defguard-service"; +#[cfg(not(target_os = "windows"))] +pub const DEFAULT_LOG_DIR: &str = "/var/log/defguard-service"; + #[derive(Debug, Parser, Clone)] #[clap(about = "Defguard VPN client interface management service")] #[command(version)] @@ -8,6 +13,10 @@ pub struct Config { #[arg(long, env = "DEFGUARD_LOG_LEVEL", default_value = "info")] pub log_level: String, + /// Configures logging directory; it is meant for debugging only, so hide it. + #[arg(long, env = "DEFGUARD_LOG_DIR", default_value = DEFAULT_LOG_DIR, hide = true)] + pub log_dir: String, + /// Defines how often (in seconds) interface statistics are sent to defguard client #[arg(long, short = 'p', env = "DEFGUARD_STATS_PERIOD", default_value = "10")] pub stats_period: u64, diff --git a/src-tauri/src/service/mod.rs b/src-tauri/src/service/mod.rs index 179e56ac..6123af26 100644 --- a/src-tauri/src/service/mod.rs +++ b/src-tauri/src/service/mod.rs @@ -2,21 +2,30 @@ pub mod config; pub mod proto { tonic::include_proto!("client"); } -pub mod log_watcher; pub mod utils; #[cfg(windows)] -pub mod windows_service; +pub mod windows; use std::{ net::{IpAddr, Ipv4Addr, SocketAddr}, - ops::Add, pin::Pin, time::{Duration, UNIX_EPOCH}, }; +use super::VERSION; +#[cfg(not(target_os = "macos"))] +use defguard_wireguard_rs::Kernel; +#[cfg(target_os = "macos")] +use defguard_wireguard_rs::Userspace; use defguard_wireguard_rs::{ - error::WireguardInterfaceError, host::Host, host::Peer, key::Key, InterfaceConfiguration, - WGApi, WireguardInterfaceApi, + error::WireguardInterfaceError, + host::{Host, Peer}, + key::Key, + InterfaceConfiguration, WGApi, WireguardInterfaceApi, +}; +use proto::{ + desktop_daemon_service_server::{DesktopDaemonService, DesktopDaemonServiceServer}, + CreateInterfaceRequest, InterfaceData, ReadInterfaceDataRequest, RemoveInterfaceRequest, }; use thiserror::Error; use tokio::{sync::mpsc, time::interval}; @@ -28,15 +37,9 @@ use tonic::{ use tracing::{debug, error, info, info_span, Instrument}; use self::config::Config; -use crate::utils::IS_MACOS; - -use proto::{ - desktop_daemon_service_server::{DesktopDaemonService, DesktopDaemonServiceServer}, - CreateInterfaceRequest, InterfaceData, ReadInterfaceDataRequest, RemoveInterfaceRequest, -}; const DAEMON_HTTP_PORT: u16 = 54127; -pub const DAEMON_BASE_URL: &str = "http://localhost:54127"; +pub(super) const DAEMON_BASE_URL: &str = "http://localhost:54127"; #[derive(Error, Debug)] pub enum DaemonError { @@ -64,12 +67,25 @@ impl DaemonService { type InterfaceDataStream = Pin> + Send>>; -fn setup_wgapi(ifname: String) -> Result { - let wgapi = WGApi::new(ifname.clone(), IS_MACOS).map_err(|err| { - let msg = format!("Failed to setup WireGuard API for interface {ifname}: {err}"); +#[cfg(not(target_os = "macos"))] +fn setup_wgapi(ifname: &str) -> Result, Status> { + let wgapi = WGApi::::new(ifname.to_string()).map_err(|err| { + let msg = format!("Failed to setup kernel WireGuard API for interface {ifname}: {err}"); + error!("{msg}"); + Status::new(Code::Internal, msg) + })?; + + Ok(wgapi) +} + +#[cfg(target_os = "macos")] +fn setup_wgapi(ifname: &str) -> Result, Status> { + let wgapi = WGApi::::new(ifname.to_string()).map_err(|err| { + let msg = format!("Failed to setup userspace WireGuard API for interface {ifname}: {err}"); error!("{msg}"); Status::new(Code::Internal, msg) })?; + Ok(wgapi) } @@ -79,6 +95,7 @@ impl DesktopDaemonService for DaemonService { &self, request: tonic::Request, ) -> Result, Status> { + debug!("Received a request to create a new interface"); let request = request.into_inner(); let config: InterfaceConfiguration = request .config @@ -89,9 +106,8 @@ impl DesktopDaemonService for DaemonService { .into(); let ifname = &config.name; let _span = info_span!("create_interface", interface_name = &ifname).entered(); - info!("Creating interface {ifname}"); // setup WireGuard API - let wgapi = setup_wgapi(ifname.clone())?; + let wgapi = setup_wgapi(ifname)?; #[cfg(not(windows))] { @@ -102,21 +118,30 @@ impl DesktopDaemonService for DaemonService { error!("{msg}"); Status::new(Code::Internal, msg) })?; + debug!("Done creating a new interface {ifname}"); } - let dns: Vec = request - .dns - .into_iter() - .filter_map(|s| s.parse().ok()) - .collect(); - - // configure interface - debug!("Configuring new interface {ifname} with configuration: {config:?}"); + // The WireGuard DNS config value can be a list of IP addresses and domain names, which will be + // used as DNS servers and search domains respectively. + debug!("Preparing DNS configuration for interface {ifname}"); + let dns_string = request.dns.unwrap_or_default(); + let dns_entries = dns_string.split(',').map(str::trim).collect::>(); + // We assume that every entry that can't be parsed as an IP address is a domain name. + let mut dns = Vec::new(); + let mut search_domains = Vec::new(); + for entry in dns_entries { + if let Ok(ip) = entry.parse::() { + dns.push(ip); + } else { + search_domains.push(entry); + } + } + debug!("DNS configuration for interface {ifname}: DNS: {dns:?}, Search domains: {search_domains:?}"); #[cfg(not(windows))] let configure_interface_result = wgapi.configure_interface(&config); #[cfg(windows)] - let configure_interface_result = wgapi.configure_interface(&config, &dns); + let configure_interface_result = wgapi.configure_interface(&config, &dns, &search_domains); configure_interface_result.map_err(|err| { let msg = format!("Failed to configure WireGuard interface {ifname}: {err}"); @@ -126,7 +151,6 @@ impl DesktopDaemonService for DaemonService { #[cfg(not(windows))] { - // configure routing debug!("Configuring interface {ifname} routing"); wgapi.configure_peer_routing(&config.peers).map_err(|err| { let msg = @@ -135,18 +159,20 @@ impl DesktopDaemonService for DaemonService { Status::new(Code::Internal, msg) })?; - // Configure DNS if !dns.is_empty() { - debug!("Configuring DNS for interface {ifname} with config: {dns:?}"); - wgapi.configure_dns(&dns).map_err(|err| { + debug!("The following DNS servers will be set: {dns:?}, search domains: {search_domains:?}"); + wgapi.configure_dns(&dns, &search_domains).map_err(|err| { let msg = format!("Failed to configure DNS for WireGuard interface {ifname}: {err}"); error!("{msg}"); Status::new(Code::Internal, msg) })?; + } else { + debug!("No DNS configuration provided for interface {ifname}, skipping DNS configuration"); } } + debug!("Finished creating a new interface {ifname}"); Ok(Response::new(())) } @@ -154,18 +180,36 @@ impl DesktopDaemonService for DaemonService { &self, request: tonic::Request, ) -> Result, Status> { + debug!("Received a request to remove an interface"); let request = request.into_inner(); let ifname = request.interface_name; let _span = info_span!("remove_interface", interface_name = &ifname).entered(); - info!("Removing interface {ifname}"); - // setup WireGuard API - let wgapi = setup_wgapi(ifname.clone())?; - // remove interface + debug!("Removing interface {ifname}"); + + let wgapi = setup_wgapi(&ifname)?; + + #[cfg(not(windows))] + { + debug!("Cleaning up interface {ifname} routing"); + wgapi + .remove_endpoint_routing(&request.endpoint) + .map_err(|err| { + let msg = format!( + "Failed to remove routing for endpoint {}: {err}", + request.endpoint + ); + error!("{msg}"); + Status::new(Code::Internal, msg) + })?; + } + wgapi.remove_interface().map_err(|err| { let msg = format!("Failed to remove WireGuard interface {ifname}: {err}"); error!("{msg}"); Status::new(Code::Internal, msg) })?; + + debug!("Finished removing interface {ifname}"); Ok(Response::new(())) } @@ -176,43 +220,58 @@ impl DesktopDaemonService for DaemonService { request: tonic::Request, ) -> Result, Status> { let request = request.into_inner(); + debug!( + "Received a request to start a new network usage stats data stream for interface {}", + request.interface_name + ); let ifname = request.interface_name; let span = info_span!("read_interface_data", interface_name = &ifname); span.in_scope(|| { - info!("Starting interface data stream for {ifname}"); + debug!("Starting network usage stats stream for interface {ifname}"); }); let stats_period = self.stats_period; let (tx, rx) = mpsc::channel(64); tokio::spawn(async move { - info!("Spawning stats thread for interface {ifname}"); + debug!("Spawning network usage stats collection task for interface {ifname}"); // setup WireGuard API - let error_msg = format!("Failed to initialize WireGuard API for interface {ifname}"); - let wgapi = setup_wgapi(ifname.clone()).expect(&error_msg); + let error_msg = format!("Failed to initialize WireGuard API for interface {ifname} during the creation of the network usage stats collection task."); + let wgapi = setup_wgapi(&ifname).expect(&error_msg); let period = Duration::from_secs(stats_period); let mut interval = interval(period); loop { // wait till next iteration + debug!("Waiting for next network usage stats update for interface {ifname}"); interval.tick().await; - debug!("Sending stats update for interface {ifname}"); + debug!("Gathering network usage stats to send to the client about network activity for interface {ifname}"); match wgapi.read_interface_data() { Ok(host) => { - if let Err(err) = tx.send(Result::<_, Status>::Ok(host.into())).await { + if let Err(err) = tx.send(Ok(host.into())).await { error!( - "Failed to send stats update for interface {ifname}. Error: {err}" + "Couldn't send network usage stats update for interface {ifname}. Error: {err}" ); break; } } Err(err) => { - error!("Failed to retrieve stats for WireGuard interface {ifname}. Error: {err}"); - break; + match err { + WireguardInterfaceError::SocketClosed(err) => { + warn!( + "Failed to retrieve network usage stats for WireGuard interface {ifname}. Error: {err}" + ); + break; + } + _ => { + error!("Failed to retrieve network usage stats for WireGuard interface {ifname}. Error: {err}"); + break; + } + } } } - debug!("Finished sending stats update for interface {ifname}"); + debug!("Network activity statistics for interface {ifname} have been sent to the client"); } - warn!("Client disconnected from stats update stream for interface {ifname}"); + debug!("The client has disconnected from the network usage statistics data stream for interface {ifname}, stopping the statistics data collection task."); }.instrument(span)); let output_stream = ReceiverStream::new(rx); @@ -223,12 +282,16 @@ impl DesktopDaemonService for DaemonService { } pub async fn run_server(config: Config) -> anyhow::Result<()> { - info!("Starting defguard interface management daemon"); + debug!("Starting defguard interface management daemon"); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), DAEMON_HTTP_PORT); let daemon_service = DaemonService::new(&config); - info!("defguard daemon listening on {addr}"); + info!( + "Defguard daemon version {} started, listening on {addr}", + VERSION + ); + debug!("Defguard daemon configuration: {config:?}"); Server::builder() .trace_fn(|_| tracing::info_span!("defguard_service")) @@ -259,6 +322,7 @@ impl From for InterfaceConfiguration { address: config.address, port: config.port, peers: config.peers.into_iter().map(Into::into).collect(), + mtu: None, } } } @@ -277,9 +341,7 @@ impl From for proto::Peer { }), tx_bytes: peer.tx_bytes, rx_bytes: peer.rx_bytes, - persistent_keepalive_interval: peer - .persistent_keepalive_interval - .map(|interval| interval as u32), + persistent_keepalive_interval: peer.persistent_keepalive_interval.map(u32::from), allowed_ips: peer .allowed_ips .into_iter() @@ -303,12 +365,12 @@ impl From for Peer { }), last_handshake: peer .last_handshake - .map(|timestamp| UNIX_EPOCH.add(Duration::from_secs(timestamp))), + .map(|timestamp| UNIX_EPOCH + Duration::from_secs(timestamp)), tx_bytes: peer.tx_bytes, rx_bytes: peer.rx_bytes, persistent_keepalive_interval: peer .persistent_keepalive_interval - .map(|interval| interval as u16), + .and_then(|interval| u16::try_from(interval).ok()), allowed_ips: peer .allowed_ips .into_iter() @@ -321,7 +383,7 @@ impl From for Peer { impl From for InterfaceData { fn from(host: Host) -> Self { Self { - listen_port: host.listen_port as u32, + listen_port: u32::from(host.listen_port), peers: host.peers.into_values().map(Into::into).collect(), } } @@ -329,11 +391,13 @@ impl From for InterfaceData { #[cfg(test)] mod tests { - use super::*; - use defguard_wireguard_rs::{key::Key, net::IpAddrMask}; use std::{str::FromStr, time::SystemTime}; + + use defguard_wireguard_rs::{key::Key, net::IpAddrMask}; use x25519_dalek::{EphemeralSecret, PublicKey}; + use super::*; + #[test] fn convert_peer() { let secret = EphemeralSecret::random(); @@ -352,6 +416,6 @@ mod tests { let converted_peer: Peer = proto_peer.into(); - assert_eq!(base_peer, converted_peer) + assert_eq!(base_peer, converted_peer); } } diff --git a/src-tauri/src/service/utils.rs b/src-tauri/src/service/utils.rs index 5aa7f25a..f934fe59 100644 --- a/src-tauri/src/service/utils.rs +++ b/src-tauri/src/service/utils.rs @@ -1,13 +1,7 @@ -use crate::{ - service::{ - proto::desktop_daemon_service_client::DesktopDaemonServiceClient, DaemonError, - DAEMON_BASE_URL, - }, - utils::get_service_log_dir, -}; use std::io::stdout; + use tonic::transport::channel::{Channel, Endpoint}; -use tracing::debug; +use tracing::{debug, Level}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::{ fmt, fmt::writer::MakeWriterExt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, @@ -15,6 +9,9 @@ use tracing_subscriber::{ }; use super::config::Config; +use crate::service::{ + proto::desktop_daemon_service_client::DesktopDaemonServiceClient, DaemonError, DAEMON_BASE_URL, +}; pub fn setup_client() -> Result, DaemonError> { debug!("Setting up gRPC client"); @@ -26,25 +23,24 @@ pub fn setup_client() -> Result, DaemonError pub fn logging_setup(config: &Config) -> WorkerGuard { // prepare log file appender - let log_dir = get_service_log_dir(); - let file_appender = tracing_appender::rolling::daily(log_dir, "defguard-service.log"); - let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); + let file_appender = tracing_appender::rolling::daily(&config.log_dir, "defguard-service.log"); + let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); // prepare log level filter for stdout let stdout_filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| format!("{},hyper=info", config.log_level).into()); + .unwrap_or_else(|_| format!("{},hyper=info,h2=info", config.log_level).into()); // prepare log level filter for json file - let json_filter = EnvFilter::new(format!("{},hyper=info", tracing::Level::DEBUG)); + let json_filter = EnvFilter::new(format!("{},hyper=info,h2=info", Level::DEBUG)); // prepare tracing layers let stdout_layer = fmt::layer() .pretty() - .with_writer(stdout.with_max_level(tracing::Level::DEBUG)) + .with_writer(stdout.with_max_level(Level::DEBUG)) .with_filter(stdout_filter); let json_file_layer = fmt::layer() .json() - .with_writer(non_blocking.with_max_level(tracing::Level::DEBUG)) + .with_writer(non_blocking.with_max_level(Level::DEBUG)) .with_filter(json_filter); // initialize tracing subscriber @@ -53,5 +49,5 @@ pub fn logging_setup(config: &Config) -> WorkerGuard { .with(json_file_layer) .init(); - _guard + guard } diff --git a/src-tauri/src/service/windows.rs b/src-tauri/src/service/windows.rs new file mode 100644 index 00000000..bff4f759 --- /dev/null +++ b/src-tauri/src/service/windows.rs @@ -0,0 +1,119 @@ +use std::{ffi::OsString, sync::mpsc, time::Duration}; + +use clap::Parser; +use log::error; +use tokio::runtime::Runtime; +use windows_service::{ + define_windows_service, + service::{ + ServiceControl, ServiceControlAccept, ServiceExitCode, ServiceState, ServiceStatus, + ServiceType, + }, + service_control_handler::{register, ServiceControlHandlerResult}, + service_dispatcher, Result, +}; + +use crate::service::{run_server, utils::logging_setup, Config}; + +static SERVICE_NAME: &str = "DefguardService"; +const SERVICE_TYPE: ServiceType = ServiceType::OWN_PROCESS; + +pub fn run() -> Result<()> { + // Register generated `ffi_service_main` with the system and start the service, blocking + // this thread until the service is stopped. + service_dispatcher::start(SERVICE_NAME, ffi_service_main) +} + +define_windows_service!(ffi_service_main, service_main); + +pub fn service_main(_arguments: Vec) { + if let Err(err) = run_service() { + error!("Error while running the service. {err}"); + panic!("{err}"); + } +} + +fn run_service() -> Result<()> { + // Create a channel to be able to poll a stop event from the service worker loop. + let (shutdown_tx, shutdown_rx) = mpsc::channel::(); + let shutdown_tx_server = shutdown_tx.clone(); + + // Define system service event handler that will be receiving service events. + let event_handler = move |control_event| -> ServiceControlHandlerResult { + match control_event { + // Notifies a service to report its current status information to the service + // control manager. Always return NoError even if not implemented. + ServiceControl::Interrogate => ServiceControlHandlerResult::NoError, + + // Handle stop + ServiceControl::Stop => { + let _ = shutdown_tx.send(1); + ServiceControlHandlerResult::NoError + } + + _ => ServiceControlHandlerResult::NotImplemented, + } + }; + + // Register system service event handler. + // The returned status handle should be used to report service status changes to the system. + let status_handle = register(SERVICE_NAME, event_handler)?; + + let rt = Runtime::new(); + + if let Ok(runtime) = rt { + status_handle.set_service_status(ServiceStatus { + service_type: SERVICE_TYPE, + current_state: ServiceState::Running, + controls_accepted: ServiceControlAccept::STOP, + exit_code: ServiceExitCode::Win32(0), + checkpoint: 0, + wait_hint: Duration::default(), + process_id: None, + })?; + + let config: Config = Config::parse(); + let _guard = logging_setup(&config); + + let default_panic = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + default_panic(info); + std::process::exit(1); + })); + + runtime.spawn(async move { + let server_result = run_server(config).await; + + if server_result.is_err() { + let _ = shutdown_tx_server.send(2); + } + }); + + loop { + // Poll shutdown event. + match shutdown_rx.recv_timeout(Duration::from_secs(1)) { + // Break the loop either upon stop or channel disconnect + Ok(1) | Err(mpsc::RecvTimeoutError::Disconnected) => break, + Ok(2) => { + panic!("Server has stopped working.") + } + Ok(_) => break, + + // Continue work if no events were received within the timeout + Err(mpsc::RecvTimeoutError::Timeout) => (), + }; + } + + status_handle.set_service_status(ServiceStatus { + service_type: SERVICE_TYPE, + current_state: ServiceState::Stopped, + controls_accepted: ServiceControlAccept::empty(), + exit_code: ServiceExitCode::Win32(0), + checkpoint: 0, + wait_hint: Duration::default(), + process_id: None, + })?; + } + + Ok(()) +} diff --git a/src-tauri/src/service/windows_service.rs b/src-tauri/src/service/windows_service.rs deleted file mode 100644 index 29ec3592..00000000 --- a/src-tauri/src/service/windows_service.rs +++ /dev/null @@ -1,120 +0,0 @@ -#[cfg(windows)] -pub mod defguard_windows_service { - use crate::service::{run_server, utils::logging_setup, Config}; - use clap::Parser; - use log::error; - use std::{ffi::OsString, sync::mpsc, time::Duration}; - use tokio::runtime::Runtime; - use windows_service::{ - define_windows_service, - service::{ - ServiceControl, ServiceControlAccept, ServiceExitCode, ServiceState, ServiceStatus, - ServiceType, - }, - service_control_handler::{self, ServiceControlHandlerResult}, - service_dispatcher, Result, - }; - - static SERVICE_NAME: &str = "DefguardService"; - const SERVICE_TYPE: ServiceType = ServiceType::OWN_PROCESS; - - pub fn run() -> Result<()> { - // Register generated `ffi_service_main` with the system and start the service, blocking - // this thread until the service is stopped. - service_dispatcher::start(SERVICE_NAME, ffi_service_main) - } - - define_windows_service!(ffi_service_main, service_main); - - pub fn service_main(_arguments: Vec) { - if let Err(err) = run_service() { - error!("Error while running the service. {err}"); - panic!("{err}"); - } - } - - fn run_service() -> Result<()> { - // Create a channel to be able to poll a stop event from the service worker loop. - let (shutdown_tx, shutdown_rx) = mpsc::channel::(); - let shutdown_tx_server = shutdown_tx.clone(); - - // Define system service event handler that will be receiving service events. - let event_handler = move |control_event| -> ServiceControlHandlerResult { - match control_event { - // Notifies a service to report its current status information to the service - // control manager. Always return NoError even if not implemented. - ServiceControl::Interrogate => ServiceControlHandlerResult::NoError, - - // Handle stop - ServiceControl::Stop => { - shutdown_tx.send(1).unwrap(); - ServiceControlHandlerResult::NoError - } - - _ => ServiceControlHandlerResult::NotImplemented, - } - }; - - // Register system service event handler. - // The returned status handle should be used to report service status changes to the system. - let status_handle = service_control_handler::register(SERVICE_NAME, event_handler)?; - - let rt = Runtime::new(); - - if let Ok(runtime) = rt { - status_handle.set_service_status(ServiceStatus { - service_type: SERVICE_TYPE, - current_state: ServiceState::Running, - controls_accepted: ServiceControlAccept::STOP, - exit_code: ServiceExitCode::Win32(0), - checkpoint: 0, - wait_hint: Duration::default(), - process_id: None, - })?; - - let config: Config = Config::parse(); - let _guard = logging_setup(&config); - - let default_panic = std::panic::take_hook(); - std::panic::set_hook(Box::new(move |info| { - default_panic(info); - std::process::exit(1); - })); - - runtime.spawn(async move { - let server_result = run_server(config).await; - - if server_result.is_err() { - shutdown_tx_server.send(2).unwrap(); - } - }); - - loop { - // Poll shutdown event. - match shutdown_rx.recv_timeout(Duration::from_secs(1)) { - // Break the loop either upon stop or channel disconnect - Ok(1) | Err(mpsc::RecvTimeoutError::Disconnected) => break, - Ok(2) => { - panic!("Server has stopped working.") - } - Ok(_) => break, - - // Continue work if no events were received within the timeout - Err(mpsc::RecvTimeoutError::Timeout) => (), - }; - } - - status_handle.set_service_status(ServiceStatus { - service_type: SERVICE_TYPE, - current_state: ServiceState::Stopped, - controls_accepted: ServiceControlAccept::empty(), - exit_code: ServiceExitCode::Win32(0), - checkpoint: 0, - wait_hint: Duration::default(), - process_id: None, - })?; - } - - Ok(()) - } -} diff --git a/src-tauri/src/tray.rs b/src-tauri/src/tray.rs index 9ecf5d40..8d972c79 100644 --- a/src-tauri/src/tray.rs +++ b/src-tauri/src/tray.rs @@ -1,23 +1,68 @@ use tauri::{ - AppHandle, CustomMenuItem, Manager, State, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, + AppHandle, CustomMenuItem, Icon, Manager, State, SystemTrayEvent, SystemTrayMenu, + SystemTrayMenuItem, SystemTraySubmenu, }; -use crate::{appstate::AppState, database::TrayIconTheme, error::Error}; +use crate::{ + appstate::AppState, + commands::{all_instances, all_locations, connect, disconnect}, + database::{Location, TrayIconTheme}, + error::Error, + ConnectionType, +}; static SUBSCRIBE_UPDATES_LINK: &str = "https://defguard.net/newsletter"; static JOIN_COMMUNITY_LINK: &str = "https://matrix.to/#/#defguard:teonite.com"; static FOLLOW_US_LINK: &str = "https://floss.social/@defguard"; -#[must_use] -pub fn create_tray_menu() -> SystemTrayMenu { - let quit = CustomMenuItem::new("quit".to_string(), "Quit"); - let show = CustomMenuItem::new("show".to_string(), "Show"); - let hide = CustomMenuItem::new("hide".to_string(), "Hide"); - let subscribe_updates = - CustomMenuItem::new("subscribe_updates".to_string(), "Subscribe for updates"); - let join_community = CustomMenuItem::new("join_community".to_string(), "Join our Community"); - let follow_us = CustomMenuItem::new("follow_us".to_string(), "Follow us"); - SystemTrayMenu::new() +pub async fn generate_tray_menu(app_state: State<'_, AppState>) -> Result { + debug!("Generating tray menu..."); + let quit = CustomMenuItem::new("quit", "Quit"); + let show = CustomMenuItem::new("show", "Show"); + let hide = CustomMenuItem::new("hide", "Hide"); + let subscribe_updates = CustomMenuItem::new("subscribe_updates", "Subscribe for updates"); + let join_community = CustomMenuItem::new("join_community", "Join our Community"); + let follow_us = CustomMenuItem::new("follow_us", "Follow us"); + let mut tray_menu = SystemTrayMenu::new(); + + // INSTANCE SECTION + debug!("Getting all instances information for the tray menu"); + let all_instances = all_instances(app_state.clone()).await; + if let Ok(instances) = all_instances { + let instance_count = instances.len(); + debug!( + "Got {} instances to display in the tray menu", + instance_count + ); + for instance in instances { + let mut instance_menu = SystemTrayMenu::new(); + let all_locations = all_locations(instance.id, app_state.clone()).await.unwrap(); + debug!( + "Found {} locations for the {} instance to display in the tray menu", + all_locations.len(), + instance + ); + + // TODO: apply icons instead of Connect/Disconnect when defguard utilizes tauri v2 + for location in all_locations { + let item_name = if location.active { + format!("Disconnect: {}", location.name) + } else { + format!("Connect: {}", location.name) + }; + instance_menu = + instance_menu.add_item(CustomMenuItem::new(location.id.to_string(), item_name)); + debug!("Added new tray menu item (instance {instance}) for location: {location}"); + } + tray_menu = tray_menu.add_submenu(SystemTraySubmenu::new(instance.name, instance_menu)); + } + } else if let Err(err) = all_instances { + warn!("Cannot load instance menu: {:?}", err); + } + + // Load rest of tray menu options + tray_menu = tray_menu + .add_native_item(SystemTrayMenuItem::Separator) .add_item(show) .add_item(hide) .add_native_item(SystemTrayMenuItem::Separator) @@ -25,57 +70,52 @@ pub fn create_tray_menu() -> SystemTrayMenu { .add_item(join_community) .add_item(follow_us) .add_native_item(SystemTrayMenuItem::Separator) - .add_item(quit) + .add_item(quit); + + debug!("Successfully generated tray menu"); + Ok(tray_menu) +} + +pub async fn reload_tray_menu(app_handle: &AppHandle) { + let system_menu = generate_tray_menu(app_handle.state::()) + .await + .unwrap(); + if let Err(err) = app_handle.tray_handle().set_menu(system_menu) { + warn!("Unable to update tray menu {err:?}"); + } } fn show_main_window(app: &AppHandle) { if let Some(main_window) = app.get_window("main") { // if this fails tauri has a problem - let minimized = main_window.is_minimizable().unwrap(); - let visible = main_window.is_visible().unwrap(); + let minimized = main_window.is_minimizable().unwrap_or_default(); + let visible = main_window.is_visible().unwrap_or_default(); if minimized { - main_window.unminimize().unwrap(); - main_window.set_focus().unwrap(); + let _ = main_window.unminimize(); + let _ = main_window.set_focus(); } if !visible { - main_window.show().unwrap(); - main_window.set_focus().unwrap(); + let _ = main_window.show(); + let _ = main_window.set_focus(); } } } // handle tray actions pub fn handle_tray_event(app: &AppHandle, event: SystemTrayEvent) { - match event { - SystemTrayEvent::LeftClick { .. } => { - if let Some(main_window) = app.get_window("main") { - let visibility = main_window.is_visible().unwrap(); - if visibility { - main_window.hide().unwrap(); - } else { - show_main_window(app); - } - } - } - SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { + let handle = app.clone(); + if let SystemTrayEvent::MenuItemClick { id, .. } = event { + match id.as_str() { "quit" => { info!("Received QUIT request. Initiating shutdown..."); let app_state: State = app.state(); - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - let _ = app_state.close_all_connections().await; - app.exit(0); - }); - }); + app_state.quit(app); } "show" => show_main_window(app), "hide" => { if let Some(main_window) = app.get_window("main") { - if main_window - .is_visible() - .expect("Failed to check main window visibility") - { - main_window.hide().expect("Failed to hide main window"); + if main_window.is_visible().unwrap_or_default() { + let _ = main_window.hide(); } } } @@ -88,28 +128,80 @@ pub fn handle_tray_event(app: &AppHandle, event: SystemTrayEvent) { "follow_us" => { let _ = webbrowser::open(FOLLOW_US_LINK); } + _ if id.chars().all(char::is_numeric) => { + tauri::async_runtime::spawn(async move { + handle_location_tray_menu(id, &handle).await; + }); + } _ => {} - }, - _ => {} + } } } pub fn configure_tray_icon(app: &AppHandle, theme: &TrayIconTheme) -> Result<(), Error> { let resource_str = format!("resources/icons/tray-32x32-{}.png", theme.as_ref()); - debug!("Tray icon loading from {:?}", &resource_str); - match app.path_resolver().resolve_resource(&resource_str) { - Some(icon_path) => { - let icon = tauri::Icon::File(icon_path); - app.tray_handle().set_icon(icon)?; - info!("Tray icon changed"); - Ok(()) - } - None => { - error!( - "Loading tray icon resource {} failed! Resource not resolved.", - &resource_str - ); - Err(Error::ResourceNotFound(resource_str)) + debug!("Trying to load the tray icon from {resource_str}"); + if let Some(icon_path) = app.path_resolver().resolve_resource(&resource_str) { + let icon = Icon::File(icon_path); + app.tray_handle().set_icon(icon)?; + debug!("Tray icon set to {resource_str} successfully."); + Ok(()) + } else { + error!("Loading tray icon resource {resource_str} failed! Resource not resolved.",); + Err(Error::ResourceNotFound(resource_str)) + } +} + +#[derive(Clone, serde::Serialize)] +struct Payload { + message: String, +} + +async fn handle_location_tray_menu(id: String, handle: &AppHandle) { + match id.parse::() { + Ok(location_id) => { + match Location::find_by_id(&handle.state::().get_pool(), location_id).await { + Ok(Some(location)) => { + let active_locations_ids: Vec = handle + .state::() + .get_connection_id_by_type(&ConnectionType::Location) + .await; + + if active_locations_ids.contains(&location_id) { + info!("Disconnect location with id {}", id); + let _ = + disconnect(location_id, ConnectionType::Location, handle.clone()).await; + } else { + info!("Connect location with id {}", id); + // check is mfa enabled and trigger modal on frontend + if location.mfa_enabled { + info!( + "mfa enabled for location with id {:?}, trigger mfa modal", + location.id + ); + handle + .emit_all( + "mfa-trigger", + Payload { + message: "Trigger mfa event".into(), + }, + ) + .unwrap(); + } else if let Err(e) = + connect(location_id, ConnectionType::Location, None, handle.clone()) + .await + { + info!( + "Unable to connect location with id {}, error: {e:?}", + location.id + ); + } + } + } + Ok(None) => warn!("Location does not exist"), + Err(e) => warn!("Unable to find location: {e:?}"), + }; } + Err(e) => warn!("Can't handle event due to: {e:?}"), } } diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index 7a45bf09..aa816ec6 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -1,142 +1,176 @@ use std::{ net::{IpAddr, Ipv4Addr, SocketAddr, TcpListener}, - path::PathBuf, + path::Path, process::Command, str::FromStr, }; -use tauri::AppHandle; use defguard_wireguard_rs::{host::Peer, key::Key, net::IpAddrMask, InterfaceConfiguration}; +use local_ip_address::local_ip; use sqlx::query; -use tauri::Manager; -use tonic::{codegen::tokio_stream::StreamExt, transport::Channel}; +use tauri::{AppHandle, Manager}; +use tonic::{transport::Channel, Code}; +use tracing::Level; use crate::{ appstate::AppState, commands::{LocationInterfaceDetails, Payload}, database::{ - models::{location::peer_to_location_stats, tunnel::peer_to_tunnel_stats}, + models::{location_stats::peer_to_location_stats, tunnel::peer_to_tunnel_stats, Id}, ActiveConnection, Connection, DbPool, Location, Tunnel, TunnelConnection, WireguardKeys, }, error::Error, - service::{ - log_watcher::spawn_log_watcher_task, - proto::{ - desktop_daemon_service_client::DesktopDaemonServiceClient, CreateInterfaceRequest, - ReadInterfaceDataRequest, RemoveInterfaceRequest, - }, + events::CONNECTION_CHANGED, + log_watcher::service_log_watcher::spawn_log_watcher_task, + service::proto::{ + desktop_daemon_service_client::DesktopDaemonServiceClient, CreateInterfaceRequest, + ReadInterfaceDataRequest, RemoveInterfaceRequest, }, ConnectionType, }; -use local_ip_address::local_ip; -use tracing::Level; +#[cfg(target_os = "windows")] +use std::ptr::null_mut; +#[cfg(target_os = "windows")] +use widestring::U16CString; +#[cfg(target_os = "windows")] +use winapi::{ + shared::{minwindef::DWORD, winerror::ERROR_SERVICE_DOES_NOT_EXIST}, + um::{ + errhandlingapi::GetLastError, + winsvc::{ + OpenSCManagerW, OpenServiceW, QueryServiceStatus, SC_HANDLE__, SC_MANAGER_CONNECT, + SERVICE_QUERY_STATUS, SERVICE_RUNNING, + }, + }, +}; -pub static IS_MACOS: bool = cfg!(target_os = "macos"); -pub static STATS_PERIOD: u64 = 60; -pub static DEFAULT_ROUTE: &str = "0.0.0.0/0"; +pub const IS_MACOS: bool = cfg!(target_os = "macos"); +static DEFAULT_ROUTE_IPV4: &str = "0.0.0.0/0"; +static DEFAULT_ROUTE_IPV6: &str = "::/0"; /// Setup client interface pub async fn setup_interface( - location: &Location, + location: &Location, interface_name: String, preshared_key: Option, pool: &DbPool, mut client: DesktopDaemonServiceClient, ) -> Result<(), Error> { - if let Some(keys) = WireguardKeys::find_by_instance_id(pool, location.instance_id).await? { - // prepare peer config - debug!("Decoding location public key: {}.", location.pubkey); - let peer_key: Key = Key::from_str(&location.pubkey)?; - info!("Location public key decoded."); - debug!("Location public key: {peer_key}"); - let mut peer = Peer::new(peer_key); - - debug!("Parsing location endpoint: {}", location.endpoint); - peer.set_endpoint(&location.endpoint)?; - peer.persistent_keepalive_interval = Some(25); - info!("Parsed location endpoint."); - debug!("Location endpoint: {}", location.endpoint); - - if let Some(psk) = preshared_key { - debug!("Decoding preshared key."); - let peer_psk = Key::from_str(&psk)?; - info!("Preshared key decoded."); - peer.preshared_key = Some(peer_psk); + debug!("Setting up interface for location: {location}"); + + debug!("Looking for wireguard keys for location {location} instance"); + let Some(keys) = WireguardKeys::find_by_instance_id(pool, location.instance_id).await? else { + error!("No keys found for instance: {}", location.instance_id); + return Err(Error::InternalError( + "No keys found for instance".to_string(), + )); + }; + debug!("Wireguard keys found for location {location} instance"); + + // prepare peer config + debug!( + "Decoding location {location} public key: {}.", + location.pubkey + ); + let peer_key: Key = Key::from_str(&location.pubkey)?; + debug!("Location {location} public key decoded: {peer_key}"); + let mut peer = Peer::new(peer_key); + + debug!( + "Parsing location {location} endpoint: {}", + location.endpoint + ); + peer.set_endpoint(&location.endpoint)?; + peer.persistent_keepalive_interval = Some(25); + debug!("Parsed location {location} endpoint: {}", location.endpoint); + + if let Some(psk) = preshared_key { + debug!("Decoding location {location} preshared key."); + let peer_psk = Key::from_str(&psk)?; + info!("Location {location} preshared key decoded."); + peer.preshared_key = Some(peer_psk); + } + + debug!( + "Parsing location {location} allowed ips: {}", + location.allowed_ips + ); + let allowed_ips = if location.route_all_traffic { + debug!("Using all traffic routing for location {location}: {DEFAULT_ROUTE_IPV4} {DEFAULT_ROUTE_IPV6}"); + vec![DEFAULT_ROUTE_IPV4.into(), DEFAULT_ROUTE_IPV6.into()] + } else { + debug!( + "Using predefined location {location} traffic: {}", + location.allowed_ips + ); + location + .allowed_ips + .split(',') + .map(str::to_string) + .collect() + }; + for allowed_ip in &allowed_ips { + match IpAddrMask::from_str(allowed_ip) { + Ok(addr) => { + peer.allowed_ips.push(addr); + } + Err(err) => { + // Handle the error from IpAddrMask::from_str, if needed + error!("Error parsing IP address {allowed_ip} while setting up interface for location {location}, error details: {err}"); + continue; + } } + } + debug!( + "Parsed allowed IPs for location {location}: {:?}", + peer.allowed_ips + ); - debug!("Parsing location allowed ips: {}", location.allowed_ips); - let allowed_ips: Vec = if location.route_all_traffic { - debug!("Using all traffic routing: {DEFAULT_ROUTE}"); - vec![DEFAULT_ROUTE.into()] - } else { - debug!( - "Using predefined location traffic: {}", - location.allowed_ips - ); - location - .allowed_ips - .split(',') - .map(str::to_string) - .collect() + // request interface configuration + debug!("Looking for a free port for interface {interface_name}..."); + if let Some(port) = find_random_free_port() { + debug!("Found free port: {port} for interface {interface_name}."); + let interface_config = InterfaceConfiguration { + name: interface_name, + prvkey: keys.prvkey, + address: location.address.clone(), + port: port.into(), + peers: vec![peer.clone()], + mtu: None, }; - for allowed_ip in &allowed_ips { - match IpAddrMask::from_str(allowed_ip) { - Ok(addr) => { - peer.allowed_ips.push(addr); + debug!( + "Creating interface for location {location} with configuration {interface_config:?}" + ); + let request = CreateInterfaceRequest { + config: Some(interface_config.clone().into()), + allowed_ips, + dns: location.dns.clone(), + }; + if let Err(error) = client.create_interface(request).await { + match error.code() { + Code::Unavailable => { + error!("There was an error while setting up connection for location {location}, Defguard background service is unavailable. Please make sure the service is running. Error details: {error}, Interface configuration: {interface_config:?}"); + return Err(Error::InternalError( + "Defguard background service is unavailable. Please make sure the service is running.".to_string(), + )); } - Err(err) => { - // Handle the error from IpAddrMask::from_str, if needed - error!("Error parsing IP address {allowed_ip}: {err}"); - // Continue to the next iteration of the loop - continue; + _ => { + error!("There was an error while sending the request to the defguard background service to create an interface for location {location} with the following configuration: {interface_config:?}. Error details: {error}"); + Err(Error::InternalError( + format!("There was an error while sending the request to the defguard background service to create an interface for location {location}. Error details: {}. Check logs for a more detailed information.", error.message()) + )) } } - } - info!("Parsed allowed IPs for location."); - debug!("Allowed IPs: {:#?}", peer.allowed_ips); - - // request interface configuration - debug!("Looking for a free port for interface {interface_name}..."); - if let Some(port) = find_random_free_port() { - info!("Found free port: {port} for interface {interface_name}."); - let interface_config = InterfaceConfiguration { - name: interface_name, - prvkey: keys.prvkey, - address: location.address.clone(), - port: port.into(), - peers: vec![peer.clone()], - }; - debug!("Creating interface {interface_config:#?}"); - let request = CreateInterfaceRequest { - config: Some(interface_config.clone().into()), - allowed_ips, - dns: location.dns.clone(), - pre_up: None, - post_up: None, - }; - if let Err(error) = client.create_interface(request).await { - let msg = format!( - "Failed to create interface with config {interface_config:?}. Error: {error}" - ); - error!("{msg}"); - Err(Error::InternalError(msg)) - } else { - info!("Created interface {interface_config:#?}"); - Ok(()) - } } else { - let msg = format!( - "Error finding free port during interface {interface_name} setup for location {}", - location.name - ); - error!("{msg}"); - Err(Error::InternalError(msg)) + info!("The interface for location {location} has been created successfully, interface name: {}.", interface_config.name); + Ok(()) } } else { - error!("No keys found for instance: {}", location.instance_id); - Err(Error::InternalError( - "No keys found for instance".to_string(), - )) + let msg = format!( + "Couldn't find free port during interface {interface_name} setup for location {location}" + ); + error!("{msg}"); + Err(Error::InternalError(msg)) } } @@ -195,7 +229,7 @@ fn is_port_free(port: u16) -> bool { } } -pub async fn spawn_stats_thread( +pub fn spawn_stats_thread( handle: tauri::AppHandle, interface_name: String, connection_type: ConnectionType, @@ -209,47 +243,81 @@ pub async fn spawn_stats_thread( let mut stream = client .read_interface_data(request) .await - .expect("Failed to connect to interface stats stream") + .expect("Failed to connect to interface stats stream for interface {interface_name}") .into_inner(); - while let Some(item) = stream.next().await { - match item { - Ok(interface_data) => { - debug!("Received interface data update: {interface_data:?}"); + loop { + match stream.message().await { + Ok(Some(interface_data)) => { + debug!("Received new network usage statistics for interface {interface_name}."); + trace!("Received interface data: {interface_data:?}"); let peers: Vec = interface_data.peers.into_iter().map(Into::into).collect(); for peer in peers { if connection_type.eq(&ConnectionType::Location) { - let mut location_stats = peer_to_location_stats( + let location_stats = peer_to_location_stats( &peer, interface_data.listen_port, &state.get_pool(), ) .await .unwrap(); - debug!("Saving location stats: {location_stats:#?}"); - let _ = location_stats.save(&state.get_pool()).await; - debug!("Saved location stats: {location_stats:#?}"); + let location_name = location_stats + .get_name(&state.get_pool()) + .await + .unwrap_or("UNKNOWN".to_string()); + + debug!("Saving network usage stats related to location {location_name} (interface {interface_name})."); + trace!("Stats: {location_stats:?}"); + match location_stats.save(&state.get_pool()).await { + Ok(_) => { + debug!( + "Saved network usage stats for location {location_name}" + ); + } + Err(err) => { + error!( + "Failed to save network usage stats for location {location_name}: {err}" + ); + } + } } else { - let mut tunnel_stats = peer_to_tunnel_stats( + let tunnel_stats = peer_to_tunnel_stats( &peer, interface_data.listen_port, &state.get_pool(), ) .await .unwrap(); - debug!("Saving tunnel stats: {tunnel_stats:#?}"); - let _ = tunnel_stats.save(&state.get_pool()).await; - debug!("Saved location stats: {tunnel_stats:#?}"); + let tunnel_name = tunnel_stats + .get_name(&state.get_pool()) + .await + .unwrap_or("UNKNOWN".to_string()); + debug!("Saving network usage stats related to tunnel {tunnel_name} (interface {interface_name}): {tunnel_stats:?}"); + match tunnel_stats.save(&state.get_pool()).await { + Ok(_) => { + debug!("Saved stats for tunnel {tunnel_name}"); + } + Err(err) => { + error!("Failed to save stats for tunnel {tunnel_name}: {err}"); + } + } } } } + Ok(None) => { + debug!( + "gRPC stream to the defguard-service managing connections has been closed" + ); + break; + } Err(err) => { - error!("Failed to receive interface data update: {err}"); + error!("gRPC stream to the defguard-service managing connections error: {err}"); + break; } } } - warn!("Interface data stream disconnected"); + debug!("Network usage stats thread for interface {interface_name} has been terminated"); }); } @@ -272,29 +340,34 @@ pub fn load_log_targets() -> Vec { } // helper function to get log file directory for the defguard-service daemon -pub fn get_service_log_dir() -> PathBuf { +#[must_use] +pub fn get_service_log_dir() -> &'static Path { #[cfg(target_os = "windows")] - let path = PathBuf::from("/Logs/defguard-service"); + let path = "/Logs/defguard-service"; #[cfg(not(target_os = "windows"))] - let path = PathBuf::from("/var/log/defguard-service"); + let path = "/var/log/defguard-service"; - path + Path::new(path) } + /// Setup client interface pub async fn setup_interface_tunnel( - tunnel: &Tunnel, + tunnel: &Tunnel, interface_name: String, mut client: DesktopDaemonServiceClient, ) -> Result<(), Error> { + debug!("Setting up interface for tunnel {tunnel}"); // prepare peer config - debug!("Decoding location public key: {}.", tunnel.server_pubkey); - let peer_key: Key = Key::from_str(&tunnel.server_pubkey)?; - info!("Location public key decoded."); - debug!("Location public key: {peer_key}"); + debug!( + "Decoding tunnel {tunnel} public key: {}.", + tunnel.server_pubkey + ); + let peer_key = Key::from_str(&tunnel.server_pubkey)?; + debug!("Tunnel {tunnel} public key decoded."); let mut peer = Peer::new(peer_key); - debug!("Parsing location endpoint: {}", tunnel.endpoint); + debug!("Parsing tunnel {tunnel} endpoint: {}", tunnel.endpoint); peer.set_endpoint(&tunnel.endpoint)?; peer.persistent_keepalive_interval = Some( tunnel @@ -302,24 +375,26 @@ pub async fn setup_interface_tunnel( .try_into() .expect("Failed to parse persistent keep alive"), ); - info!("Parsed location endpoint."); - debug!("Location endpoint: {}", tunnel.endpoint); + debug!("Parsed tunnel {tunnel} endpoint: {}", tunnel.endpoint); if let Some(psk) = &tunnel.preshared_key { - debug!("Decoding preshared key."); + debug!("Decoding tunnel {tunnel} preshared key."); let peer_psk = Key::from_str(psk)?; - debug!("Preshared key decoded."); + debug!("Preshared key for tunnel {tunnel} decoded."); peer.preshared_key = Some(peer_psk); } - debug!("Parsing location allowed ips: {:?}", tunnel.allowed_ips); + debug!( + "Parsing tunnel {tunnel} allowed ips: {:?}", + tunnel.allowed_ips + ); let allowed_ips: Vec = if tunnel.route_all_traffic { - debug!("Using all traffic routing: {DEFAULT_ROUTE}"); - vec![DEFAULT_ROUTE.into()] + debug!("Using all traffic routing for tunnel {tunnel}: {DEFAULT_ROUTE_IPV4} {DEFAULT_ROUTE_IPV6}"); + vec![DEFAULT_ROUTE_IPV4.into(), DEFAULT_ROUTE_IPV6.into()] } else { let msg = match &tunnel.allowed_ips { - Some(ips) => format!("Using predefined location traffic: {ips}"), - None => "No allowed IPs found".to_string(), + Some(ips) => format!("Using predefined location traffic for tunnel {tunnel}: {ips}"), + None => "No allowed IPs found in tunnel {tunnel} configuration".to_string(), }; debug!("{msg}"); tunnel @@ -341,51 +416,61 @@ pub async fn setup_interface_tunnel( } } } - info!("Parsed allowed IPs."); - debug!("Allowed IPs: {:?}", peer.allowed_ips); + debug!("Parsed tunnel {tunnel} allowed IPs: {:?}", peer.allowed_ips); // request interface configuration debug!("Looking for a free port for interface {interface_name}..."); if let Some(port) = find_random_free_port() { - info!("Found free port: {port} for interface {interface_name}."); + debug!("Found free port: {port} for interface {interface_name}."); let interface_config = InterfaceConfiguration { name: interface_name, prvkey: tunnel.prvkey.clone(), address: tunnel.address.clone(), port: port.into(), peers: vec![peer.clone()], + mtu: None, }; - debug!("Creating interface {interface_config:#?}"); + debug!("Creating interface {interface_config:?}"); let request = CreateInterfaceRequest { config: Some(interface_config.clone().into()), allowed_ips, dns: tunnel.dns.clone(), - pre_up: None, - post_up: None, }; if let Some(pre_up) = &tunnel.pre_up { - debug!("Executing specified PreUp command: {pre_up}"); + debug!("Executing defined PreUp command before setting up the interface {} for the tunnel {tunnel}: {pre_up}", interface_config.name); let _ = execute_command(pre_up); - info!("Executed specified PreUp command: {pre_up}"); + info!( + "Executed defined PreUp command before setting up the interface {} for the tunnel {tunnel}: {pre_up}", interface_config.name + ); } if let Err(error) = client.create_interface(request).await { - let msg = format!("Failed to create interface: {error}"); - error!("{msg}"); - Err(Error::InternalError(msg)) + error!( + "Failed to create a network interface ({}) for tunnel {tunnel}: {error}", + interface_config.name + ); + Err(Error::InternalError(format!( + "Failed to create a network interface ({}) for tunnel {tunnel}, error message: {}. Check logs for more details.", + interface_config.name, error.message() + ))) } else { + info!( + "Network interface {} for tunnel {tunnel} created successfully.", + interface_config.name + ); if let Some(post_up) = &tunnel.post_up { - debug!("Executing specified PreUp command: {post_up}"); + debug!("Executing defined PostUp command after setting up the interface {} for the tunnel {tunnel}: {post_up}", interface_config.name); let _ = execute_command(post_up); - info!("Executed specified PreUp command: {post_up}"); + info!("Executed defined PostUp command after setting up the interface {} for the tunnel {tunnel}: {post_up}", interface_config.name); } - info!("Created interface {}", interface_config.name); - debug!("Created interface with config: {interface_config:?}"); + debug!( + "Created interface {} with config: {interface_config:?}", + interface_config.name + ); Ok(()) } } else { let msg = format!( - "Error finding free port during tunnel {} setup for interface {interface_name}", - tunnel.name + "Couldn't find free port for interface {interface_name} while setting up tunnel {tunnel}" ); error!("{msg}"); Err(Error::InternalError(msg)) @@ -393,12 +478,13 @@ pub async fn setup_interface_tunnel( } pub async fn get_tunnel_interface_details( - tunnel_id: i64, + tunnel_id: Id, pool: &DbPool, ) -> Result { debug!("Fetching tunnel details for tunnel ID {tunnel_id}"); if let Some(tunnel) = Tunnel::find_by_id(pool, tunnel_id).await? { - let peer_pubkey = tunnel.pubkey; + debug!("The tunnel with ID {tunnel_id} has been found and identified as {tunnel}."); + let peer_pubkey = &tunnel.pubkey; // generate interface name #[cfg(target_os = "macos")] @@ -408,17 +494,14 @@ pub async fn get_tunnel_interface_details( debug!("Fetching tunnel stats for tunnel ID {tunnel_id}"); let result = query!( - r#" - SELECT last_handshake, listen_port as "listen_port!: u32", - persistent_keepalive_interval as "persistent_keepalive_interval?: u16" - FROM tunnel_stats - WHERE tunnel_id = $1 ORDER BY collected_at DESC LIMIT 1 - "#, + "SELECT last_handshake, listen_port \"listen_port!: u32\", \ + persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" \ + FROM tunnel_stats WHERE tunnel_id = $1 ORDER BY collected_at DESC LIMIT 1", tunnel_id ) .fetch_optional(pool) .await?; - info!("Fetched tunnel stats for tunnel ID {tunnel_id}"); + debug!("Fetched tunnel connection statistics for tunnel {tunnel}"); let (listen_port, persistent_keepalive_interval, last_handshake) = match result { Some(record) => ( @@ -429,7 +512,7 @@ pub async fn get_tunnel_interface_details( None => (None, None, None), }; - info!("Fetched tunnel details for tunnel ID {tunnel_id}"); + debug!("Fetched tunnel configuration details for tunnel {tunnel}."); Ok(LocationInterfaceDetails { location_id: tunnel_id, @@ -438,7 +521,7 @@ pub async fn get_tunnel_interface_details( address: tunnel.address, dns: tunnel.dns, listen_port, - peer_pubkey, + peer_pubkey: peer_pubkey.to_string(), peer_endpoint: tunnel.endpoint, allowed_ips: tunnel.allowed_ips.unwrap_or_default(), persistent_keepalive_interval, @@ -449,8 +532,9 @@ pub async fn get_tunnel_interface_details( Err(Error::NotFound) } } + pub async fn get_location_interface_details( - location_id: i64, + location_id: Id, pool: &DbPool, ) -> Result { debug!("Fetching location details for location ID {location_id}"); @@ -459,7 +543,7 @@ pub async fn get_location_interface_details( let keys = WireguardKeys::find_by_instance_id(pool, location.instance_id) .await? .ok_or(Error::NotFound)?; - info!( + debug!( "Successfully fetched WireGuard keys for location {}", location.name ); @@ -473,17 +557,15 @@ pub async fn get_location_interface_details( debug!("Fetching location stats for location ID {location_id}"); let result = query!( - r#" - SELECT last_handshake, listen_port as "listen_port!: u32", - persistent_keepalive_interval as "persistent_keepalive_interval?: u16" - FROM location_stats - WHERE location_id = $1 ORDER BY collected_at DESC LIMIT 1 - "#, + "SELECT last_handshake, listen_port \"listen_port!: u32\", \ + persistent_keepalive_interval \"persistent_keepalive_interval?: u16\" \ + FROM location_stats \ + WHERE location_id = $1 ORDER BY collected_at DESC LIMIT 1", location_id ) .fetch_optional(pool) .await?; - info!("Fetched location stats for location ID {location_id}"); + debug!("Fetched location stats for location ID {location_id}"); let (listen_port, persistent_keepalive_interval, last_handshake) = match result { Some(record) => ( @@ -494,7 +576,7 @@ pub async fn get_location_interface_details( None => (None, None, None), }; - info!("Fetched location details for location ID {location_id}"); + debug!("Fetched location details for location ID {location_id}"); Ok(LocationInterfaceDetails { location_id, @@ -517,14 +599,11 @@ pub async fn get_location_interface_details( /// Setup new connection for location pub async fn handle_connection_for_location( - location: &Location, + location: &Location, preshared_key: Option, handle: AppHandle, ) -> Result<(), Error> { - debug!( - "Creating new interface connection for location: {}", - location.name - ); + debug!("Setting up the connection for location {}", location.name); let state = handle.state::(); #[cfg(target_os = "macos")] let interface_name = get_interface_name(); @@ -540,67 +619,61 @@ pub async fn handle_connection_for_location( .await?; let address = local_ip()?; let connection = ActiveConnection::new( - location.id.expect("Missing Location ID"), + location.id, address.to_string(), interface_name.clone(), ConnectionType::Location, ); - state - .active_connections - .lock() - .map_err(|_| Error::MutexError)? - .push(connection); - info!( - "Finished creating new interface connection for location: {}", - location.name + state.active_connections.lock().await.push(connection); + trace!( + "Active connections: {:?}", + state.active_connections.lock().await ); - debug!( - "Active connections: {:#?}", - state - .active_connections - .lock() - .map_err(|_| Error::MutexError)? - ); - debug!("Sending event connection-changed..."); + debug!("Sending event informing the frontend that a new connection has been created."); handle.emit_all( - "connection-changed", + CONNECTION_CHANGED, Payload { message: "Created new connection".into(), }, )?; - debug!("Event connection-changed sent."); + debug!("Event informing the frontend that a new connection has been created sent."); // Spawn stats threads - debug!("Spawning stats thread..."); + debug!( + "Spawning network usage stats thread for location {}...", + location + ); spawn_stats_thread( handle.clone(), interface_name.clone(), ConnectionType::Location, - ) - .await; - info!("Stats thread spawned."); + ); + debug!( + "Network usage stats thread for location {} spawned.", + location + ); // spawn log watcher - debug!("Spawning log watcher..."); + debug!("Spawning service log watcher for location {}...", location); spawn_log_watcher_task( handle, - location.id.expect("Missing Location ID"), + location.id, interface_name, ConnectionType::Location, Level::DEBUG, None, ) .await?; - info!("Log watcher spawned."); + debug!("Service log watcher for location {} spawned.", location); Ok(()) } /// Setup new connection for tunnel -pub async fn handle_connection_for_tunnel(tunnel: &Tunnel, handle: AppHandle) -> Result<(), Error> { - debug!( - "Creating new interface connection for tunnel: {}", - tunnel.name - ); +pub async fn handle_connection_for_tunnel( + tunnel: &Tunnel, + handle: AppHandle, +) -> Result<(), Error> { + debug!("Setting up the connection for tunnel: {}", tunnel.name); let state = handle.state::(); #[cfg(target_os = "macos")] let interface_name = get_interface_name(); @@ -609,62 +682,52 @@ pub async fn handle_connection_for_tunnel(tunnel: &Tunnel, handle: AppHandle) -> setup_interface_tunnel(tunnel, interface_name.clone(), state.client.clone()).await?; let address = local_ip()?; let connection = ActiveConnection::new( - tunnel.id.expect("Missing Tunnel ID"), + tunnel.id, address.to_string(), interface_name.clone(), ConnectionType::Tunnel, ); - state - .active_connections - .lock() - .map_err(|_| Error::MutexError)? - .push(connection); - info!( - "Finished creating new interface connection for tunnel: {}", - tunnel.name - ); + state.active_connections.lock().await.push(connection); debug!( - "Active connections: {:#?}", - state - .active_connections - .lock() - .map_err(|_| Error::MutexError)? + "Active connections: {:?}", + state.active_connections.lock().await ); - debug!("Sending event connection-changed."); + debug!("Sending event informing the frontend that a new connection has been created."); handle.emit_all( - "connection-changed", + CONNECTION_CHANGED, Payload { message: "Created new connection".into(), }, )?; - debug!("Event connection-changed sent."); + debug!("Event informing the frontend that a new connection has been created sent."); // Spawn stats threads - debug!("Spawning stats thread"); + debug!("Spawning stats thread for tunnel {}", tunnel.name); spawn_stats_thread( handle.clone(), interface_name.clone(), ConnectionType::Tunnel, - ) - .await; - info!("Stats thread spawned"); + ); + debug!("Stats thread for tunnel {} spawned", tunnel.name); //spawn log watcher - debug!("Spawning log watcher"); + debug!("Spawning log watcher for tunnel {}", tunnel.name); spawn_log_watcher_task( handle, - tunnel.id.expect("Missing Tunnel ID"), + tunnel.id, interface_name, ConnectionType::Tunnel, Level::DEBUG, None, ) .await?; - info!("Log watcher spawned"); + debug!("Log watcher for tunnel {} spawned", tunnel.name); Ok(()) } + /// Execute command passed as argument. pub fn execute_command(command: &str) -> Result<(), Error> { + debug!("Executing command: {command}"); let mut command_parts = command.split_whitespace(); if let Some(command) = command_parts.next() { @@ -674,7 +737,7 @@ pub fn execute_command(command: &str) -> Result<(), Error> { let stdout = String::from_utf8_lossy(&output.stdout); let stderr = String::from_utf8_lossy(&output.stderr); - info!( + debug!( "Command {command} executed successfully. Stdout: {}", stdout ); @@ -688,72 +751,422 @@ pub fn execute_command(command: &str) -> Result<(), Error> { } Ok(()) } + /// Helper function to remove interface and close connection pub async fn disconnect_interface( - active_connection: ActiveConnection, + active_connection: &ActiveConnection, state: &AppState, ) -> Result<(), Error> { - debug!("Removing interface"); + debug!( + "Disconnecting interface {}...", + active_connection.interface_name + ); let mut client = state.client.clone(); + let location_id = active_connection.location_id; let interface_name = active_connection.interface_name.clone(); - let (id, connection_type) = ( - active_connection.location_id, - active_connection.connection_type.clone(), - ); + match active_connection.connection_type { ConnectionType::Location => { + let Some(location) = Location::find_by_id(&state.get_pool(), location_id).await? else { + error!("Error while disconnecting interface {interface_name}, location with ID {location_id} not found"); + return Err(Error::NotFound); + }; let request = RemoveInterfaceRequest { - interface_name: interface_name.clone(), - pre_down: None, - post_down: None, + interface_name, + endpoint: location.endpoint.clone(), }; + debug!("Sending request to the background service to remove interface {} for location {}...", active_connection.interface_name, location.name); if let Err(error) = client.remove_interface(request).await { - error!("Failed to remove interface: {error}"); - return Err(Error::InternalError( - "Failed to remove interface".to_string(), - )); + match error.code() { + Code::Unavailable => { + error!("Couldn't remove interface {}. Defguard background service is unavailable. Please make sure the service is running. Error details: {error}.", active_connection.interface_name); + return Err(Error::InternalError( + format!("Couldn't remove interface {}. Defguard background service is unavailable. Please make sure the service is running.", active_connection.interface_name), + )); + } + _ => { + error!("There was an error while sending the request to the defguard background service to remove an interface {}. Error details: {error}", active_connection.interface_name); + return Err(Error::InternalError( + format!("There was an error while sending the request to the defguard background service to remove an interface {}. Error details: {}.", active_connection.interface_name, error.message()) + )); + } + } } - let mut connection: Connection = active_connection.into(); - connection.save(&state.get_pool()).await?; - trace!("Saved connection: {connection:#?}"); - debug!("Removed interface"); - debug!("Saving connection"); - trace!("Connection: {:#?}", connection); + let connection: Connection = active_connection.into(); + let connection = connection.save(&state.get_pool()).await?; + debug!( + "Saved location {} new connection status in the database", + location.name + ); + trace!("Saved connection: {connection:?}"); + info!( + "Network interface {} for location {location} has been removed", + active_connection.interface_name + ); + debug!("Finished disconnecting from location {}", location.name); } ConnectionType::Tunnel => { - if let Some(tunnel) = - Tunnel::find_by_id(&state.get_pool(), active_connection.location_id).await? - { - let request = RemoveInterfaceRequest { - interface_name: interface_name.clone(), - pre_down: None, - post_down: None, - }; - if let Some(pre_down) = tunnel.pre_down { - debug!("Executing specified PreDown command: {pre_down}"); - let _ = execute_command(&pre_down); - info!("Executed specified PreDown command: {pre_down}"); + let Some(tunnel) = Tunnel::find_by_id(&state.get_pool(), location_id).await? else { + error!("Error while disconnecting interface {interface_name}, tunnel with ID {location_id} not found"); + return Err(Error::NotFound); + }; + if let Some(pre_down) = &tunnel.pre_down { + debug!("Executing defined PreDown command before setting up the interface {} for the tunnel {tunnel}: {pre_down}", active_connection.interface_name); + let _ = execute_command(pre_down); + info!("Executed defined PreDown command before setting up the interface {} for the tunnel {tunnel}: {pre_down}", active_connection.interface_name); + } + let request = RemoveInterfaceRequest { + interface_name, + endpoint: tunnel.endpoint.clone(), + }; + if let Err(error) = client.remove_interface(request).await { + error!( + "Error while removing interface {}, error details: {:?}", + active_connection.interface_name, error + ); + return Err(Error::InternalError(format!( + "Failed to remove interface, error message: {}", + error.message() + ))); + } + if let Some(post_down) = &tunnel.post_down { + debug!("Executing defined PostDown command after removing the interface {} for the tunnel {tunnel}: {post_down}", active_connection.interface_name); + let _ = execute_command(post_down); + info!("Executed defined PostDown command after removing the interface {} for the tunnel {tunnel}: {post_down}", active_connection.interface_name); + } + let connection: TunnelConnection = active_connection.into(); + let connection = connection.save(&state.get_pool()).await?; + debug!( + "Saved new tunnel {} connection status in the database", + tunnel.name + ); + trace!("Saved connection: {connection:#?}"); + info!( + "Network interface {} for tunnel {tunnel} has been removed", + active_connection.interface_name + ); + debug!("Finished disconnecting from tunnel {}", tunnel.name); + } + } + + Ok(()) +} + +/// Helper function to get the name of a tunnel or location by its ID +/// Returns the name of the tunnel or location if it exists, otherwise "UNKNOWN" +/// This is for logging purposes. +pub async fn get_tunnel_or_location_name( + id: Id, + connection_type: ConnectionType, + appstate: &AppState, +) -> String { + let name = match connection_type { + ConnectionType::Location => Location::find_by_id(&appstate.get_pool(), id) + .await + .ok() + .and_then(|l| l.map(|l| l.name)), + ConnectionType::Tunnel => Tunnel::find_by_id(&appstate.get_pool(), id) + .await + .ok() + .and_then(|t| t.map(|t| t.name)), + }; + + match name { + Some(name) => name, + None => { + debug!( + "Couldn't identify {connection_type}'s name for logging purposes, it will be referred to as UNKNOWN", + ); + "UNKNOWN".to_string() + } + } +} + +#[cfg(target_os = "windows")] +fn open_service_manager() -> Result<*mut SC_HANDLE__, DWORD> { + let sc_manager_handle = unsafe { OpenSCManagerW(null_mut(), null_mut(), SC_MANAGER_CONNECT) }; + if sc_manager_handle.is_null() { + Err(unsafe { GetLastError() }) + } else { + Ok(sc_manager_handle) + } +} + +#[cfg(target_os = "windows")] +fn open_service( + sc_manager_handle: *mut SC_HANDLE__, + service_name: &str, + desired_access: DWORD, +) -> Result<*mut SC_HANDLE__, DWORD> { + let service_name_wstr = match U16CString::from_str(service_name) { + Ok(service_name_wstr) => service_name_wstr, + Err(err) => { + error!( + "Failed to convert service name {} to a wide string: {err}", + service_name + ); + return Err(1); + } + }; + let service_handle = unsafe { + OpenServiceW( + sc_manager_handle, + service_name_wstr.as_ptr(), + desired_access, + ) + }; + if service_handle.is_null() { + Err(unsafe { GetLastError() }) + } else { + Ok(service_handle) + } +} + +#[cfg(target_os = "windows")] +fn get_service_status(service_handle: *mut SC_HANDLE__) -> Result { + let mut service_status = unsafe { std::mem::zeroed() }; + let result = unsafe { QueryServiceStatus(service_handle, &mut service_status) }; + if result == 0 { + Err(unsafe { GetLastError() }) + } else { + Ok(service_status.dwCurrentState) + } +} + +// TODO: Move the connection handling to a seperate, common function, +// so `handle_connection_for_location` and `handle_connection_for_tunnel` are not +// partially duplicated here. +#[cfg(target_os = "windows")] +pub async fn sync_connections(apphandle: &AppHandle) -> Result<(), Error> { + debug!("Synchronizing active connections with the systems' state..."); + let appstate = apphandle.state::(); + let all_locations = Location::all(&appstate.get_pool()).await?; + let service_control_manager = open_service_manager().map_err(|err| { + error!("Failed to open service control manager while trying to sync client's connections with the host state: {}", err); + Error::InternalError("Failed to open service control manager while trying to sync client's connections with the host state".to_string()) + })?; + + debug!("Opened service control manager, starting to synchronize active connections for locations..."); + // Go through all locations and check if they are connected (if the windows service is running) + // If we encounter any errors, continue with the next iteration of the loop, it's not a big deal + // if we skip some locations, as the user can always reconnect to them manually + for location in all_locations { + let interface_name = get_interface_name(&location.name); + let service_name = format!("WireGuardTunnel${}", interface_name); + let service = match open_service( + service_control_manager, + &service_name, + SERVICE_QUERY_STATUS, + ) { + Ok(service) => service, + Err(err) => match err { + ERROR_SERVICE_DOES_NOT_EXIST => { + debug!( + "WireGuard tunnel {} is not installed, nothing to synchronize", + interface_name + ); + continue; } - if let Err(error) = client.remove_interface(request).await { - let msg = format!("Failed to remove interface: {error}"); - error!("{msg}"); - return Err(Error::InternalError(msg)); + _ => { + warn!( + "Failed to open service {service_name} for interface {interface_name} while synchronizing active connections. \ + This may cause the location {} state to display incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", location.name + ); + continue; } - if let Some(post_down) = tunnel.post_down { - debug!("Executing specified PostDown command: {post_down}"); - let _ = execute_command(&post_down); - info!("Executed specified PostDown command: {post_down}"); + }, + }; + match get_service_status(service) { + Ok(status) => { + // Only point where we don't jump to the next iteration of the loop and continue with the rest of the code below the match + if status == SERVICE_RUNNING { + debug!("WireGuard tunnel {} is running, ", interface_name); + } else { + debug!( + "WireGuard tunnel {} is not running, status code: {status}. Refer to Windows documentation for more information about the code.", + interface_name + ); + continue; } - let mut connection: TunnelConnection = active_connection.into(); - connection.save(&state.get_pool()).await?; - trace!("Saved connection: {connection:#?}"); - } else { - error!("Tunnel with ID {} not found", active_connection.location_id); - return Err(Error::NotFound); } + Err(err) => { + warn!( + "Failed to query service status for interface {} while synchronizing active connections. \ + This may cause the location {} state to display incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", + interface_name, location.name + ); + continue; + } + } + + if appstate + .find_connection(location.id, ConnectionType::Location) + .await + .is_some() + { + debug!( + "Location {} has already a connected state, skipping synchronization", + location.name + ); + continue; } + + let address = local_ip()?; + let connection = ActiveConnection::new( + location.id, + address.to_string(), + interface_name.clone(), + ConnectionType::Location, + ); + appstate.active_connections.lock().await.push(connection); + trace!( + "Active connections: {:?}", + appstate.active_connections.lock().await + ); + debug!("Sending event informing the frontend that a new connection has been created."); + apphandle.emit_all( + CONNECTION_CHANGED, + Payload { + message: "Created new connection".into(), + }, + )?; + debug!("Event informing the frontend that a new connection has been created sent."); + + debug!( + "Spawning network usage stats thread for location {}...", + location + ); + spawn_stats_thread( + apphandle.clone(), + interface_name.clone(), + ConnectionType::Location, + ); + debug!( + "Network usage stats thread for location {} spawned.", + location + ); + + debug!("Spawning service log watcher for location {}...", location); + spawn_log_watcher_task( + apphandle.clone(), + location.id, + interface_name, + ConnectionType::Location, + Level::DEBUG, + None, + ) + .await?; + debug!("Service log watcher for location {} spawned.", location); } - info!("Location {} {:?} disconnected", id, connection_type); + debug!("Synchronizing active connections for tunnels..."); + // Do the same for tunnels + for tunnel in Tunnel::all(&appstate.get_pool()).await? { + let interface_name = get_interface_name(&tunnel.name); + let service_name = format!("WireGuardTunnel${}", interface_name); + let service = match open_service( + service_control_manager, + &service_name, + SERVICE_QUERY_STATUS, + ) { + Ok(service) => service, + Err(err) => match err { + ERROR_SERVICE_DOES_NOT_EXIST => { + debug!( + "WireGuard tunnel {} is not installed, nothing to synchronize", + interface_name + ); + continue; + } + _ => { + error!( + "Failed to open service {service_name} for interface {interface_name}. \ + This may cause the tunnel {} state to display incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", tunnel.name + ); + continue; + } + }, + }; + match get_service_status(service) { + Ok(status) => { + // Only point where we don't jump to the next iteration of the loop and continue with the rest of the code below the match + if status == SERVICE_RUNNING { + debug!("WireGuard tunnel {} is running", interface_name); + } else { + debug!( + "WireGuard tunnel {} is not running, status code: {status}. Refer to Windows documentation for more information about the code.", + interface_name + ); + continue; + } + } + Err(err) => { + warn!( + "Failed to query service status for interface {}. \ + This may cause the tunnel {} state to display incorrectly in the client. Reconnect to it manually to fix it. Error: {err}", + interface_name, tunnel.name + ); + continue; + } + } + + if appstate + .find_connection(tunnel.id, ConnectionType::Tunnel) + .await + .is_some() + { + debug!( + "Tunnel {} has already a connected state, skipping synchronization", + tunnel.name + ); + continue; + } + + let address = local_ip()?; + let connection = ActiveConnection::new( + tunnel.id, + address.to_string(), + interface_name.clone(), + ConnectionType::Tunnel, + ); + appstate.active_connections.lock().await.push(connection); + debug!( + "Active connections: {:?}", + appstate.active_connections.lock().await + ); + debug!("Sending event informing the frontend that a new connection has been created."); + apphandle.emit_all( + CONNECTION_CHANGED, + Payload { + message: "Created new connection".into(), + }, + )?; + debug!("Event informing the frontend that a new connection has been created sent."); + + // Spawn stats threads + debug!("Spawning stats thread for tunnel {}", tunnel.name); + spawn_stats_thread( + apphandle.clone(), + interface_name.clone(), + ConnectionType::Tunnel, + ); + debug!("Stats thread for tunnel {} spawned", tunnel.name); + + //spawn log watcher + debug!("Spawning log watcher for tunnel {}", tunnel.name); + spawn_log_watcher_task( + apphandle.clone(), + tunnel.id, + interface_name, + ConnectionType::Tunnel, + Level::DEBUG, + None, + ) + .await?; + debug!("Log watcher for tunnel {} spawned", tunnel.name); + } + + debug!("Active connections synchronized with the system state"); + Ok(()) } diff --git a/src-tauri/src/wg_config.rs b/src-tauri/src/wg_config.rs index 4f1de3e1..6756fafb 100644 --- a/src-tauri/src/wg_config.rs +++ b/src-tauri/src/wg_config.rs @@ -1,9 +1,11 @@ -use crate::database::Tunnel; -use base64::{prelude::BASE64_STANDARD, DecodeError, Engine}; use std::{array::TryFromSliceError, net::IpAddr}; + +use base64::{prelude::BASE64_STANDARD, DecodeError, Engine}; use thiserror::Error; use x25519_dalek::{PublicKey, StaticSecret}; +use crate::database::Tunnel; + #[derive(Debug, Error)] pub enum WireguardConfigParseError { #[error(transparent)] @@ -84,11 +86,11 @@ pub fn parse_wireguard_config(config: &str) -> Result Result { const [localeLoaded, setWasLoaded] = useState(false); const [settingsLoaded, setSettingsLoaded] = useState(false); const setClientState = useClientStore((state) => state.setState); + const clientFlags = useClientFlags(); + + // load last visited Instance and Location from user local storage + setClientState({ + selectedInstance: clientFlags.selectedInstance, + selectedLocation: clientFlags.selectedLocation, + }); const appLoaded = useMemo( () => localeLoaded && settingsLoaded, diff --git a/src/i18n/en/index.ts b/src/i18n/en/index.ts index 9a03ee15..e5437bca 100644 --- a/src/i18n/en/index.ts +++ b/src/i18n/en/index.ts @@ -42,6 +42,12 @@ const en = { }, messages: { error: 'Unexpected error occurred!', + errorWithMessage: 'An error occurred: {message}', + tokenExpired: + 'Token has expired, please contact your administrator to issue a new enrollment token', + networkError: "There was a network error. Can't reach proxy.", + configChanged: + 'Confguration for instance {instance: string} has changed. Disconnect from all locations to apply changes.', }, }, components: { @@ -77,7 +83,7 @@ const en = { // md title: 'WireGuard **2FA with defguard**', // md - sideText: `Since WireGuard protocol doesn't support 2FA/MFA - most (if not all) currently available WireGuard clients do not support real Multi-Factor Authentication/2FA - and use 2FA just as authorization to the "application" itself (and not WireGuard tunnel). + sideText: `Since WireGuard protocol doesn't support 2FA/MFA - most (if not all) currently available WireGuard clients do not support real Multi-Factor Authentication/2FA - and use 2FA just as authorization to the "application" itself (and not WireGuard tunnel). If you would like to secure your WireGuard instance try **defguard** VPN & SSO server (which is also free & open source) to get real 2FA using WireGuard PSK keys and peers configuration by defguard gateway!`, }, @@ -94,7 +100,7 @@ If you would like to secure your WireGuard instance try **defguard** VPN & SSO s // md title: '**Multiple** instance & locations', // md - sideText: `**defguard** (both server nad this client) support multiple instances (installations) and multiple Locations (VPN tunnels). + sideText: `**defguard** (both server nad this client) support multiple instances (installations) and multiple Locations (VPN tunnels). If you are an admin/devops - all your customers (instances) and all their tunnels (locations) can be in one place!`, }, @@ -135,6 +141,15 @@ If you are an admin/devops - all your customers (instances) and all their tunnel trace: 'Trace', }, }, + globalLogs: { + logSources: { + cliet: 'Client', + service: 'Service', + all: 'All', + }, + logSourceHelper: + 'The source of the logs. Logs can come from the Defguard client or the background Defguard service that manages VPN conncetions at the network level.', + }, theme: { title: 'Theme', options: { @@ -178,7 +193,7 @@ If you are an admin/devops - all your customers (instances) and all their tunnel label: 'Allowed traffic', helper: `

- Predefined traffic - route only traffic for networks defined by Admin through this VPN location
+ Predefined traffic - route only traffic for networks defined by Admin through this VPN location
All traffic - route ALL your network traffic through this VPN location

`, }, @@ -355,7 +370,7 @@ If you are an admin/devops - all your customers (instances) and all their tunnel

- For more help, please visit defguard help (https://defguard.gitbook.io/) + For more help, please visit defguard help (https://docs.defguard.net)

`, }, @@ -403,7 +418,7 @@ If you are an admin/devops - all your customers (instances) and all their tunnel

- For more help, please visit defguard help (https://defguard.gitbook.io/) + For more help, please visit defguard help (https://docs.defguard.net)

`, }, diff --git a/src/i18n/formatters.ts b/src/i18n/formatters.ts index fcf03da7..51a876c9 100644 --- a/src/i18n/formatters.ts +++ b/src/i18n/formatters.ts @@ -1,13 +1,12 @@ import type { FormattersInitializer } from 'typesafe-i18n'; -import type { Formatters,Locales } from './i18n-types'; +import type { Formatters, Locales } from './i18n-types'; // eslint-disable-next-line export const initFormatters: FormattersInitializer = () => { + const formatters: Formatters = { + // add your formatter functions here + }; - const formatters: Formatters = { - // add your formatter functions here - }; - - return formatters; + return formatters; }; diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts index 985e6cc5..365262c7 100644 --- a/src/i18n/i18n-types.ts +++ b/src/i18n/i18n-types.ts @@ -123,6 +123,24 @@ type RootTranslation = { * U​n​e​x​p​e​c​t​e​d​ ​e​r​r​o​r​ ​o​c​c​u​r​r​e​d​! */ error: string + /** + * A​n​ ​e​r​r​o​r​ ​o​c​c​u​r​r​e​d​:​ ​{​m​e​s​s​a​g​e​} + * @param {unknown} message + */ + errorWithMessage: RequiredParams<'message'> + /** + * T​o​k​e​n​ ​h​a​s​ ​e​x​p​i​r​e​d​,​ ​p​l​e​a​s​e​ ​c​o​n​t​a​c​t​ ​y​o​u​r​ ​a​d​m​i​n​i​s​t​r​a​t​o​r​ ​t​o​ ​i​s​s​u​e​ ​a​ ​n​e​w​ ​e​n​r​o​l​l​m​e​n​t​ ​t​o​k​e​n + */ + tokenExpired: string + /** + * T​h​e​r​e​ ​w​a​s​ ​a​ ​n​e​t​w​o​r​k​ ​e​r​r​o​r​.​ ​C​a​n​'​t​ ​r​e​a​c​h​ ​p​r​o​x​y​. + */ + networkError: string + /** + * C​o​n​f​g​u​r​a​t​i​o​n​ ​f​o​r​ ​i​n​s​t​a​n​c​e​ ​{​i​n​s​t​a​n​c​e​}​ ​h​a​s​ ​c​h​a​n​g​e​d​.​ ​D​i​s​c​o​n​n​e​c​t​ ​f​r​o​m​ ​a​l​l​ ​l​o​c​a​t​i​o​n​s​ ​t​o​ ​a​p​p​l​y​ ​c​h​a​n​g​e​s​. + * @param {string} instance + */ + configChanged: RequiredParams<'instance'> } } components: { @@ -180,7 +198,7 @@ type RootTranslation = { */ title: string /** - * S​i​n​c​e​ ​W​i​r​e​G​u​a​r​d​ ​p​r​o​t​o​c​o​l​ ​d​o​e​s​n​'​t​ ​s​u​p​p​o​r​t​ ​2​F​A​/​M​F​A​ ​-​ ​m​o​s​t​ ​(​i​f​ ​n​o​t​ ​a​l​l​)​ ​c​u​r​r​e​n​t​l​y​ ​a​v​a​i​l​a​b​l​e​ ​W​i​r​e​G​u​a​r​d​ ​c​l​i​e​n​t​s​ ​d​o​ ​n​o​t​ ​s​u​p​p​o​r​t​ ​r​e​a​l​ ​M​u​l​t​i​-​F​a​c​t​o​r​ ​A​u​t​h​e​n​t​i​c​a​t​i​o​n​/​2​F​A​ ​-​ ​a​n​d​ ​u​s​e​ ​2​F​A​ ​j​u​s​t​ ​a​s​ ​a​u​t​h​o​r​i​z​a​t​i​o​n​ ​t​o​ ​t​h​e​ ​"​a​p​p​l​i​c​a​t​i​o​n​"​ ​i​t​s​e​l​f​ ​(​a​n​d​ ​n​o​t​ ​W​i​r​e​G​u​a​r​d​ ​t​u​n​n​e​l​)​.​ ​ ​ + * S​i​n​c​e​ ​W​i​r​e​G​u​a​r​d​ ​p​r​o​t​o​c​o​l​ ​d​o​e​s​n​'​t​ ​s​u​p​p​o​r​t​ ​2​F​A​/​M​F​A​ ​-​ ​m​o​s​t​ ​(​i​f​ ​n​o​t​ ​a​l​l​)​ ​c​u​r​r​e​n​t​l​y​ ​a​v​a​i​l​a​b​l​e​ ​W​i​r​e​G​u​a​r​d​ ​c​l​i​e​n​t​s​ ​d​o​ ​n​o​t​ ​s​u​p​p​o​r​t​ ​r​e​a​l​ ​M​u​l​t​i​-​F​a​c​t​o​r​ ​A​u​t​h​e​n​t​i​c​a​t​i​o​n​/​2​F​A​ ​-​ ​a​n​d​ ​u​s​e​ ​2​F​A​ ​j​u​s​t​ ​a​s​ ​a​u​t​h​o​r​i​z​a​t​i​o​n​ ​t​o​ ​t​h​e​ ​"​a​p​p​l​i​c​a​t​i​o​n​"​ ​i​t​s​e​l​f​ ​(​a​n​d​ ​n​o​t​ ​W​i​r​e​G​u​a​r​d​ ​t​u​n​n​e​l​)​.​ ​ ​I​f​ ​y​o​u​ ​w​o​u​l​d​ ​l​i​k​e​ ​t​o​ ​s​e​c​u​r​e​ ​y​o​u​r​ ​W​i​r​e​G​u​a​r​d​ ​i​n​s​t​a​n​c​e​ ​t​r​y​ ​*​*​d​e​f​g​u​a​r​d​*​*​ ​V​P​N​ ​&​ ​S​S​O​ ​s​e​r​v​e​r​ ​(​w​h​i​c​h​ ​i​s​ ​a​l​s​o​ ​f​r​e​e​ ​&​ ​o​p​e​n​ ​s​o​u​r​c​e​)​ ​t​o​ ​g​e​t​ ​r​e​a​l​ ​2​F​A​ ​u​s​i​n​g​ ​W​i​r​e​G​u​a​r​d​ ​P​S​K​ ​k​e​y​s​ ​a​n​d​ ​p​e​e​r​s​ ​c​o​n​f​i​g​u​r​a​t​i​o​n​ ​b​y​ ​d​e​f​g​u​a​r​d​ ​g​a​t​e​w​a​y​! */ @@ -205,7 +223,7 @@ type RootTranslation = { */ title: string /** - * *​*​d​e​f​g​u​a​r​d​*​*​ ​(​b​o​t​h​ ​s​e​r​v​e​r​ ​n​a​d​ ​t​h​i​s​ ​c​l​i​e​n​t​)​ ​s​u​p​p​o​r​t​ ​m​u​l​t​i​p​l​e​ ​i​n​s​t​a​n​c​e​s​ ​(​i​n​s​t​a​l​l​a​t​i​o​n​s​)​ ​a​n​d​ ​m​u​l​t​i​p​l​e​ ​L​o​c​a​t​i​o​n​s​ ​(​V​P​N​ ​t​u​n​n​e​l​s​)​.​ ​ ​ + * *​*​d​e​f​g​u​a​r​d​*​*​ ​(​b​o​t​h​ ​s​e​r​v​e​r​ ​n​a​d​ ​t​h​i​s​ ​c​l​i​e​n​t​)​ ​s​u​p​p​o​r​t​ ​m​u​l​t​i​p​l​e​ ​i​n​s​t​a​n​c​e​s​ ​(​i​n​s​t​a​l​l​a​t​i​o​n​s​)​ ​a​n​d​ ​m​u​l​t​i​p​l​e​ ​L​o​c​a​t​i​o​n​s​ ​(​V​P​N​ ​t​u​n​n​e​l​s​)​.​ ​ ​I​f​ ​y​o​u​ ​a​r​e​ ​a​n​ ​a​d​m​i​n​/​d​e​v​o​p​s​ ​-​ ​a​l​l​ ​y​o​u​r​ ​c​u​s​t​o​m​e​r​s​ ​(​i​n​s​t​a​n​c​e​s​)​ ​a​n​d​ ​a​l​l​ ​t​h​e​i​r​ ​t​u​n​n​e​l​s​ ​(​l​o​c​a​t​i​o​n​s​)​ ​c​a​n​ ​b​e​ ​i​n​ ​o​n​e​ ​p​l​a​c​e​! */ @@ -306,6 +324,26 @@ type RootTranslation = { trace: string } } + globalLogs: { + logSources: { + /** + * C​l​i​e​n​t + */ + cliet: string + /** + * S​e​r​v​i​c​e + */ + service: string + /** + * A​l​l + */ + all: string + } + /** + * T​h​e​ ​s​o​u​r​c​e​ ​o​f​ ​t​h​e​ ​l​o​g​s​.​ ​L​o​g​s​ ​c​a​n​ ​c​o​m​e​ ​f​r​o​m​ ​t​h​e​ ​D​e​f​g​u​a​r​d​ ​c​l​i​e​n​t​ ​o​r​ ​t​h​e​ ​b​a​c​k​g​r​o​u​n​d​ ​D​e​f​g​u​a​r​d​ ​s​e​r​v​i​c​e​ ​t​h​a​t​ ​m​a​n​a​g​e​s​ ​V​P​N​ ​c​o​n​n​c​e​t​i​o​n​s​ ​a​t​ ​t​h​e​ ​n​e​t​w​o​r​k​ ​l​e​v​e​l​. + */ + logSourceHelper: string + } theme: { /** * T​h​e​m​e @@ -399,7 +437,7 @@ type RootTranslation = { /** * ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​p​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​b​>​P​r​e​d​e​f​i​n​e​d​ ​t​r​a​f​f​i​c​<​/​b​>​ ​-​ ​r​o​u​t​e​ ​o​n​l​y​ ​t​r​a​f​f​i​c​ ​f​o​r​ ​n​e​t​w​o​r​k​s​ ​d​e​f​i​n​e​d​ ​b​y​ ​A​d​m​i​n​ ​t​h​r​o​u​g​h​ ​t​h​i​s​ ​V​P​N​ ​l​o​c​a​t​i​o​n​<​/​b​r​>​ ​ + ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​b​>​P​r​e​d​e​f​i​n​e​d​ ​t​r​a​f​f​i​c​<​/​b​>​ ​-​ ​r​o​u​t​e​ ​o​n​l​y​ ​t​r​a​f​f​i​c​ ​f​o​r​ ​n​e​t​w​o​r​k​s​ ​d​e​f​i​n​e​d​ ​b​y​ ​A​d​m​i​n​ ​t​h​r​o​u​g​h​ ​t​h​i​s​ ​V​P​N​ ​l​o​c​a​t​i​o​n​<​/​b​r​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​b​>​A​l​l​ ​t​r​a​f​f​i​c​<​/​b​>​ ​-​ ​r​o​u​t​e​ ​A​L​L​ ​y​o​u​r​ ​n​e​t​w​o​r​k​ ​t​r​a​f​f​i​c​ ​t​h​r​o​u​g​h​ ​t​h​i​s​ ​V​P​N​ ​l​o​c​a​t​i​o​n​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​> */ @@ -813,7 +851,7 @@ type RootTranslation = { ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​u​l​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​d​i​v​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​p​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​F​o​r​ ​m​o​r​e​ ​h​e​l​p​,​ ​p​l​e​a​s​e​ ​v​i​s​i​t​ ​d​e​f​g​u​a​r​d​ ​h​e​l​p​ ​(​h​t​t​p​s​:​/​/​d​e​f​g​u​a​r​d​.​g​i​t​b​o​o​k​.​i​o​/​)​ + ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​F​o​r​ ​m​o​r​e​ ​h​e​l​p​,​ ​p​l​e​a​s​e​ ​v​i​s​i​t​ ​d​e​f​g​u​a​r​d​ ​h​e​l​p​ ​(​h​t​t​p​s​:​/​/​d​o​c​s​.​d​e​f​g​u​a​r​d​.​n​e​t​)​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ */ @@ -899,7 +937,7 @@ type RootTranslation = { ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​d​i​v​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​p​>​ - ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​F​o​r​ ​m​o​r​e​ ​h​e​l​p​,​ ​p​l​e​a​s​e​ ​v​i​s​i​t​ ​d​e​f​g​u​a​r​d​ ​h​e​l​p​ ​(​h​t​t​p​s​:​/​/​d​e​f​g​u​a​r​d​.​g​i​t​b​o​o​k​.​i​o​/​)​ + ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​F​o​r​ ​m​o​r​e​ ​h​e​l​p​,​ ​p​l​e​a​s​e​ ​v​i​s​i​t​ ​d​e​f​g​u​a​r​d​ ​h​e​l​p​ ​(​h​t​t​p​s​:​/​/​d​o​c​s​.​d​e​f​g​u​a​r​d​.​n​e​t​)​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​<​/​p​>​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ */ @@ -1613,6 +1651,22 @@ export type TranslationFunctions = { * Unexpected error occurred! */ error: () => LocalizedString + /** + * An error occurred: {message} + */ + errorWithMessage: (arg: { message: unknown }) => LocalizedString + /** + * Token has expired, please contact your administrator to issue a new enrollment token + */ + tokenExpired: () => LocalizedString + /** + * There was a network error. Can't reach proxy. + */ + networkError: () => LocalizedString + /** + * Confguration for instance {instance} has changed. Disconnect from all locations to apply changes. + */ + configChanged: (arg: { instance: string }) => LocalizedString } } components: { @@ -1670,7 +1724,7 @@ export type TranslationFunctions = { */ title: () => LocalizedString /** - * Since WireGuard protocol doesn't support 2FA/MFA - most (if not all) currently available WireGuard clients do not support real Multi-Factor Authentication/2FA - and use 2FA just as authorization to the "application" itself (and not WireGuard tunnel). + * Since WireGuard protocol doesn't support 2FA/MFA - most (if not all) currently available WireGuard clients do not support real Multi-Factor Authentication/2FA - and use 2FA just as authorization to the "application" itself (and not WireGuard tunnel). If you would like to secure your WireGuard instance try **defguard** VPN & SSO server (which is also free & open source) to get real 2FA using WireGuard PSK keys and peers configuration by defguard gateway! */ @@ -1695,7 +1749,7 @@ export type TranslationFunctions = { */ title: () => LocalizedString /** - * **defguard** (both server nad this client) support multiple instances (installations) and multiple Locations (VPN tunnels). + * **defguard** (both server nad this client) support multiple instances (installations) and multiple Locations (VPN tunnels). If you are an admin/devops - all your customers (instances) and all their tunnels (locations) can be in one place! */ @@ -1796,6 +1850,26 @@ export type TranslationFunctions = { trace: () => LocalizedString } } + globalLogs: { + logSources: { + /** + * Client + */ + cliet: () => LocalizedString + /** + * Service + */ + service: () => LocalizedString + /** + * All + */ + all: () => LocalizedString + } + /** + * The source of the logs. Logs can come from the Defguard client or the background Defguard service that manages VPN conncetions at the network level. + */ + logSourceHelper: () => LocalizedString + } theme: { /** * Theme @@ -1889,7 +1963,7 @@ export type TranslationFunctions = { /** *

- Predefined traffic - route only traffic for networks defined by Admin through this VPN location
+ Predefined traffic - route only traffic for networks defined by Admin through this VPN location
All traffic - route ALL your network traffic through this VPN location

*/ @@ -2302,7 +2376,7 @@ export type TranslationFunctions = {

- For more help, please visit defguard help (https://defguard.gitbook.io/) + For more help, please visit defguard help (https://docs.defguard.net)

*/ @@ -2388,7 +2462,7 @@ export type TranslationFunctions = {

- For more help, please visit defguard help (https://defguard.gitbook.io/) + For more help, please visit defguard help (https://docs.defguard.net)

*/ diff --git a/src/pages/client/ClientPage.tsx b/src/pages/client/ClientPage.tsx index a7ee7781..ccfe608f 100644 --- a/src/pages/client/ClientPage.tsx +++ b/src/pages/client/ClientPage.tsx @@ -5,6 +5,8 @@ import { listen, UnlistenFn } from '@tauri-apps/api/event'; import { useEffect } from 'react'; import { Outlet, useLocation, useNavigate } from 'react-router-dom'; +import { useI18nContext } from '../../i18n/i18n-react'; +import { useToaster } from '../../shared/defguard-ui/hooks/toasts/useToaster'; import { routes } from '../../shared/routes'; import { clientApi } from './clientAPI/clientApi'; import { ClientSideBar } from './components/ClientSideBar/ClientSideBar'; @@ -23,7 +25,13 @@ export const ClientPage = () => { ]); const navigate = useNavigate(); const firstLaunch = useClientFlags((state) => state.firstStart); + const [listChecked, setListChecked] = useClientStore((state) => [ + state.listChecked, + state.setListChecked, + ]); const location = useLocation(); + const toaster = useToaster(); + const { LL } = useI18nContext(); const { data: instances } = useQuery({ queryFn: getInstances, @@ -86,20 +94,30 @@ export const ClientPage = () => { subs.push(cleanup); }); + listen(TauriEventKey.CONFIG_CHANGED, (data) => { + const instance = data.payload as string; + toaster.info(LL.common.messages.configChanged({ instance })); + }).then((cleanup) => { + subs.push(cleanup); + }); + return () => { subs.forEach((sub) => sub()); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [queryClient]); // update store useEffect(() => { if (instances) { + setListChecked(true); setInstances(instances); } if (tunnels) { + setListChecked(true); setTunnels(tunnels); } - }, [instances, setInstances, tunnels, setTunnels]); + }, [instances, setInstances, tunnels, setTunnels, setListChecked]); // navigate to carousel on first app Launch useEffect(() => { @@ -108,6 +126,12 @@ export const ClientPage = () => { } }, [firstLaunch, navigate, location.pathname]); + useEffect(() => { + if (listChecked && instances?.length === 0 && tunnels?.length === 0) { + navigate(routes.client.carousel, { replace: true }); + } + }, [navigate, listChecked, instances, tunnels]); + return ( <> diff --git a/src/pages/client/clientAPI/clientApi.ts b/src/pages/client/clientAPI/clientApi.ts index 15585991..bc39f5de 100644 --- a/src/pages/client/clientAPI/clientApi.ts +++ b/src/pages/client/clientAPI/clientApi.ts @@ -32,12 +32,12 @@ async function invokeWrapper( args?: InvokeArgs, timeout: number = 5000, ): Promise { - debug(`Invoking command '${command}'`); + debug(`Invoking command '${command}' on the frontend`); try { const res = await pTimeout(invoke(command, args), { milliseconds: timeout, }); - debug(`Invoke ${command} completed`); + debug(`Invoke ${command} completed on the frontend`); trace(`${command} completed with data: ${JSON.stringify(res)}`); return res; } catch (e) { @@ -94,6 +94,9 @@ const parseTunnelConfig = async (config: string) => const saveTunnel = async (tunnel: TunnelRequest) => invokeWrapper('save_tunnel', { tunnel: tunnel }); +const updateTunnel = async (tunnel: TunnelRequest) => + invokeWrapper('update_tunnel', { tunnel: tunnel }); + const getLocationDetails = async ( data: LocationDetailsRequest, ): Promise => invokeWrapper('location_interface_details', data); @@ -114,6 +117,12 @@ const deleteTunnel = async (id: number): Promise => const getLatestAppVersion = async (): Promise => invokeWrapper('get_latest_app_version'); +const startGlobalLogWatcher = async (): Promise => + invokeWrapper('start_global_logwatcher'); + +const stopGlobalLogWatcher = async (): Promise => + invokeWrapper('stop_global_logwatcher'); + export const clientApi = { getInstances, getTunnels, @@ -134,7 +143,10 @@ export const clientApi = { updateInstance, parseTunnelConfig, saveTunnel, + updateTunnel, openLink, getTunnelDetails, getLatestAppVersion, + startGlobalLogWatcher, + stopGlobalLogWatcher, }; diff --git a/src/pages/client/clientAPI/types.ts b/src/pages/client/clientAPI/types.ts index 7458b400..85fd600a 100644 --- a/src/pages/client/clientAPI/types.ts +++ b/src/pages/client/clientAPI/types.ts @@ -46,6 +46,10 @@ export type SaveTunnelRequest = { export type TrayIconTheme = 'color' | 'white' | 'black' | 'gray'; export type LogLevel = 'error' | 'info' | 'debug' | 'trace'; +export type GlobalLogLevel = 'error' | 'info' | 'debug'; +export type LogSource = 'Client' | 'Service' | 'All'; + +export type ClientView = 'grid' | 'detail' | null; export type LogItemField = { message: string; @@ -58,6 +62,7 @@ export type LogItem = { level: LogLevel; target: string; fields: LogItemField; + source: LogSource; }; export type InterfaceLogsRequest = { @@ -69,6 +74,7 @@ export type Settings = { log_level: LogLevel; tray_icon_theme: TrayIconTheme; check_for_updates: boolean; + selected_view: ClientView; }; export type LocationDetails = { @@ -123,9 +129,12 @@ export type TauriCommandKey = | 'update_instance' | 'parse_tunnel_config' | 'save_tunnel' + | 'update_tunnel' | 'all_tunnels' | 'tunnel_details' | 'delete_tunnel' | 'location_interface_details' | 'open_link' - | 'get_latest_app_version'; + | 'get_latest_app_version' + | 'start_global_logwatcher' + | 'stop_global_logwatcher'; diff --git a/src/pages/client/components/ClientSideBar/ClientSideBar.tsx b/src/pages/client/components/ClientSideBar/ClientSideBar.tsx index df1dc997..9e7161c5 100644 --- a/src/pages/client/components/ClientSideBar/ClientSideBar.tsx +++ b/src/pages/client/components/ClientSideBar/ClientSideBar.tsx @@ -50,7 +50,13 @@ export const ClientSideBar = () => {
-
+
{ + navigate(routes.client.carousel, { replace: true }); + }} + >

{LL.pages.client.sideBar.instances()}

diff --git a/src/pages/client/components/ClientSideBar/components/ClientBarItem/ClientBarItem.tsx b/src/pages/client/components/ClientSideBar/components/ClientBarItem/ClientBarItem.tsx index 969ecd57..adc513e4 100644 --- a/src/pages/client/components/ClientSideBar/components/ClientBarItem/ClientBarItem.tsx +++ b/src/pages/client/components/ClientSideBar/components/ClientBarItem/ClientBarItem.tsx @@ -6,8 +6,9 @@ import { useMatch, useNavigate } from 'react-router-dom'; import SvgIconConnection from '../../../../../../shared/defguard-ui/components/svg/IconConnection'; import { routes } from '../../../../../../shared/routes'; +import { useClientFlags } from '../../../../hooks/useClientFlags'; import { useClientStore } from '../../../../hooks/useClientStore'; -import { WireguardInstanceType } from '../../../../types'; +import { SelectedInstance, WireguardInstanceType } from '../../../../types'; type Props = { itemType: WireguardInstanceType; @@ -25,6 +26,7 @@ export const ClientBarItem = ({ const instancePage = useMatch('/client/instance/'); const navigate = useNavigate(); const setClientStore = useClientStore((state) => state.setState); + const setClientFlags = useClientFlags((state) => state.setValues); const selectedInstance = useClientStore((state) => state.selectedInstance); const itemSelected = useMemo(() => { return ( @@ -53,14 +55,20 @@ export const ClientBarItem = ({ ref={refs.setReference} onClick={() => { switch (itemType) { - case WireguardInstanceType.DEFGUARD_INSTANCE: + case WireguardInstanceType.DEFGUARD_INSTANCE: { + const _selectedInstance: SelectedInstance = { + id: itemId, + type: WireguardInstanceType.DEFGUARD_INSTANCE, + }; setClientStore({ - selectedInstance: { - id: itemId, - type: WireguardInstanceType.DEFGUARD_INSTANCE, - }, + selectedInstance: _selectedInstance, + }); + // remember user choice next time when user will open client again + setClientFlags({ + selectedInstance: _selectedInstance, }); break; + } case WireguardInstanceType.TUNNEL: setClientStore({ selectedInstance: { diff --git a/src/pages/client/hooks/useClientFlags.tsx b/src/pages/client/hooks/useClientFlags.tsx index 0b92a196..d42ea33a 100644 --- a/src/pages/client/hooks/useClientFlags.tsx +++ b/src/pages/client/hooks/useClientFlags.tsx @@ -1,8 +1,12 @@ import { createJSONStorage, persist } from 'zustand/middleware'; import { createWithEqualityFn } from 'zustand/traditional'; +import { SelectedInstance } from '../types'; + const defaults: StoreValues = { firstStart: true, + selectedInstance: undefined, + selectedLocation: undefined, }; /*Flags that are persisted via localstorage and are not used by rust backend*/ @@ -26,6 +30,8 @@ type Store = StoreValues & StoreMethods; type StoreValues = { // Is user launching app first time ? firstStart: boolean; + selectedInstance?: SelectedInstance; + selectedLocation?: number; }; type StoreMethods = { diff --git a/src/pages/client/hooks/useClientStore.tsx b/src/pages/client/hooks/useClientStore.tsx index 4ce69add..08881401 100644 --- a/src/pages/client/hooks/useClientStore.tsx +++ b/src/pages/client/hooks/useClientStore.tsx @@ -4,7 +4,6 @@ import { createWithEqualityFn } from 'zustand/traditional'; import { clientApi } from '../clientAPI/clientApi'; import { Settings } from '../clientAPI/types'; import { - ClientView, CommonWireguardFields, DefguardInstance, SelectedInstance, @@ -18,13 +17,15 @@ const defaultValues: StoreValues = { instances: [], tunnels: [], selectedInstance: undefined, + selectedLocation: undefined, statsFilter: 1, - selectedView: ClientView.GRID, + listChecked: false, settings: { log_level: 'error', theme: 'light', tray_icon_theme: 'color', check_for_updates: true, + selected_view: null, }, }; @@ -53,6 +54,9 @@ export const useClientStore = createWithEqualityFn( } return set({ tunnels: values }); }, + setListChecked: async (values: boolean) => { + return set({ listChecked: values }); + }, updateInstances: async () => { const res = await getInstances(); let selected = get().selectedInstance; @@ -80,16 +84,19 @@ type Store = StoreValues & StoreMethods; type StoreValues = { instances: DefguardInstance[]; tunnels: CommonWireguardFields[]; - selectedView: ClientView; statsFilter: number; - settings: Settings; selectedInstance?: SelectedInstance; + selectedLocation?: number; + // launch carousel page if there is no instances or/and tunnels for the first time after launching application + listChecked: boolean; + settings: Settings; }; type StoreMethods = { setState: (values: Partial) => void; setInstances: (instances: DefguardInstance[]) => void; setTunnels: (tunnels: CommonWireguardFields[]) => void; + setListChecked: (listChecked: boolean) => void; updateInstances: () => Promise; updateSettings: (data: Partial) => Promise; }; diff --git a/src/pages/client/pages/CarouselPage/cards/CarouselCards.tsx b/src/pages/client/pages/CarouselPage/cards/CarouselCards.tsx index 5a899736..6f0968d2 100644 --- a/src/pages/client/pages/CarouselPage/cards/CarouselCards.tsx +++ b/src/pages/client/pages/CarouselPage/cards/CarouselCards.tsx @@ -100,7 +100,9 @@ const MoreSection = () => { return ( <> - {localLL.isMore()} +
+ {localLL.isMore()} +
); diff --git a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/AddInstanceDeviceForm.tsx b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/AddInstanceDeviceForm.tsx index cd6d9a83..950f49f1 100644 --- a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/AddInstanceDeviceForm.tsx +++ b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/AddInstanceDeviceForm.tsx @@ -23,11 +23,12 @@ import { import { routes } from '../../../../../../../../shared/routes'; import { generateWGKeys } from '../../../../../../../../shared/utils/generateWGKeys'; import { clientApi } from '../../../../../../clientAPI/clientApi'; +import { useClientFlags } from '../../../../../../hooks/useClientFlags'; import { useClientStore } from '../../../../../../hooks/useClientStore'; -import { WireguardInstanceType } from '../../../../../../types'; +import { SelectedInstance, WireguardInstanceType } from '../../../../../../types'; import { AddInstanceInitResponse } from '../../types'; -const { saveConfig } = clientApi; +const { getInstances, saveConfig } = clientApi; type Props = { response: AddInstanceInitResponse; @@ -37,6 +38,10 @@ type FormFields = { name: string; }; +type ErrorData = { + error: string; +}; + const defaultValues: FormFields = { name: '', }; @@ -46,6 +51,7 @@ export const AddInstanceDeviceForm = ({ response }: Props) => { const localLL = LL.pages.client.pages.addInstancePage.forms.device; const toaster = useToaster(); const setClientStore = useClientStore((state) => state.setState); + const setCliengFlags = useClientFlags((state) => state.setValues); const navigate = useNavigate(); const [isLoading, setIsLoading] = useState(false); @@ -91,35 +97,67 @@ export const AddInstanceDeviceForm = ({ response }: Props) => { }).then((r) => { if (!r.ok) { setIsLoading(false); - toaster.error(LL.common.messages.error()); - error('Failed to create device check enrollment and defguard logs'); - throw Error('Failed to create device'); + const details = `${ + (r.data as ErrorData)?.error ? (r.data as ErrorData).error + ', ' : '' + }`; + error( + `Failed to create device check enrollment and defguard logs, details: ${details} Error status code: ${r.status}`, + ); + throw Error(`Failed to create device, details: ${details}`); } const deviceResp = r.data as CreateDeviceResponse; saveConfig({ privateKey: privateKey, response: deviceResp, }) - .then((res) => { + .then(async (res) => { setIsLoading(false); toaster.success(localLL.messages.addSuccess()); + const instances = await getInstances(); + const _selectedInstance: SelectedInstance = { + id: res.instance.id, + type: WireguardInstanceType.DEFGUARD_INSTANCE, + }; + setCliengFlags({ + selectedLocation: 0, + selectedInstance: _selectedInstance, + }); setClientStore({ - selectedInstance: { - id: res.instance.id, - type: WireguardInstanceType.DEFGUARD_INSTANCE, - }, + selectedInstance: _selectedInstance, + instances, }); - navigate(routes.client.instanceCreated, { replace: true }); + navigate(routes.client.instancePage, { replace: true }); }) - .catch(() => { - toaster.error(LL.common.messages.error()); + .catch((e) => { + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); setIsLoading(false); }); }); } catch (e) { setIsLoading(false); - toaster.error(LL.common.messages.error()); console.error(e); + + if (typeof e === 'string') { + if (e.includes('Network Error')) { + toaster.error(LL.common.messages.networkError()); + return; + } + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); + } else { + toaster.error( + LL.common.messages.errorWithMessage({ + message: (e as Error).message, + }), + ); + } } }; @@ -136,6 +174,14 @@ export const AddInstanceDeviceForm = ({ response }: Props) => { text={localLL.submit()} loading={isLoading} /> +
diff --git a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/style.scss b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/style.scss index e69de29b..fe83d8a7 100644 --- a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/style.scss +++ b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceDeviceForm/style.scss @@ -0,0 +1,4 @@ +.controls { + display: flex; + gap: 10px; +} diff --git a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceInitForm/AddInstanceInitForm.tsx b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceInitForm/AddInstanceInitForm.tsx index 4de6c833..e54dc2e6 100644 --- a/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceInitForm/AddInstanceInitForm.tsx +++ b/src/pages/client/pages/ClientAddInstancePage/components/AddInstanceFormCard/components/AddInstanceInitForm/AddInstanceInitForm.tsx @@ -20,13 +20,15 @@ import { import { useToaster } from '../../../../../../../../shared/defguard-ui/hooks/toasts/useToaster'; import { CreateDeviceResponse, + EnrollmentError, EnrollmentStartResponse, } from '../../../../../../../../shared/hooks/api/types'; import { routes } from '../../../../../../../../shared/routes'; import { useEnrollmentStore } from '../../../../../../../enrollment/hooks/store/useEnrollmentStore'; import { clientApi } from '../../../../../../clientAPI/clientApi'; +import { useClientFlags } from '../../../../../../hooks/useClientFlags'; import { useClientStore } from '../../../../../../hooks/useClientStore'; -import { WireguardInstanceType } from '../../../../../../types'; +import { SelectedInstance, WireguardInstanceType } from '../../../../../../types'; import { AddInstanceInitResponse } from '../../types'; type Props = { @@ -51,6 +53,7 @@ export const AddInstanceInitForm = ({ nextStep }: Props) => { const [isLoading, setIsLoading] = useState(false); const initEnrollment = useEnrollmentStore((state) => state.init); const setClientState = useClientStore((state) => state.setState); + const setClientFlags = useClientFlags((state) => state.setValues); const schema = useMemo( () => @@ -100,17 +103,29 @@ export const AddInstanceInitForm = ({ nextStep }: Props) => { headers, body: Body.json(data), }) - .then(async (res: Response) => { + .then(async (res: Response) => { const authCookie = res.headers['set-cookie']; if (!res.ok) { - toaster.error(LL.common.messages.error()); setIsLoading(false); error(JSON.stringify(res.data)); error(JSON.stringify(res.status)); - return; + const errorMessage = (res.data as EnrollmentError).error; + + switch (errorMessage) { + case 'token expired': { + throw Error(LL.common.messages.tokenExpired()); + } + default: { + throw Error( + LL.common.messages.errorWithMessage({ + message: errorMessage, + }), + ); + } + } } debug('Response received with status OK'); - const r = res.data; + const r = res.data as EnrollmentStartResponse; // get client registered instances const clientInstances = await clientApi.getInstances(); const instance = clientInstances.find((i) => i.uuid === r.instance.id); @@ -141,17 +156,26 @@ export const AddInstanceInitForm = ({ nextStep }: Props) => { toaster.success( LL.pages.enrollment.steps.deviceSetup.desktopSetup.messages.deviceConfigured(), ); + const _selectedInstace: SelectedInstance = { + id: instance.id, + type: WireguardInstanceType.DEFGUARD_INSTANCE, + }; + setClientFlags({ + selectedLocation: 0, + selectedInstance: _selectedInstace, + }); setClientState({ - selectedInstance: { - id: instance.id, - type: WireguardInstanceType.DEFGUARD_INSTANCE, - }, + selectedInstance: _selectedInstace, }); navigate(routes.client.base, { replace: true }); }) .catch((e) => { error(e); - toaster.error(LL.common.messages.error()); + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); }); }); } @@ -183,9 +207,24 @@ export const AddInstanceInitForm = ({ nextStep }: Props) => { } }) .catch((e) => { - toaster.error(LL.common.messages.error()); setIsLoading(false); - error(e); + if (typeof e === 'string') { + if (e.includes('Network Error')) { + toaster.error(LL.common.messages.networkError()); + return; + } + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); + } else { + toaster.error( + LL.common.messages.errorWithMessage({ + message: (e as Error).message, + }), + ); + } }); }; diff --git a/src/pages/client/pages/ClientAddTunnelPage/components/AddTunnelFormCard/AddTunnelFormCard.tsx b/src/pages/client/pages/ClientAddTunnelPage/components/AddTunnelFormCard/AddTunnelFormCard.tsx index 7f7c742d..9ebc0db7 100644 --- a/src/pages/client/pages/ClientAddTunnelPage/components/AddTunnelFormCard/AddTunnelFormCard.tsx +++ b/src/pages/client/pages/ClientAddTunnelPage/components/AddTunnelFormCard/AddTunnelFormCard.tsx @@ -36,6 +36,7 @@ import { validateIpOrDomainList } from '../../../../../../shared/validators/tunn import { clientApi } from '../../../../clientAPI/clientApi'; type FormFields = { + id: null; name: string; pubkey: string; prvkey: string; @@ -53,6 +54,7 @@ type FormFields = { post_down?: string; }; const defaultValues: FormFields = { + id: null, name: '', pubkey: '', prvkey: '', @@ -81,6 +83,7 @@ export const AddTunnelFormCard = () => { const schema = useMemo( () => z.object({ + id: z.null(), name: z.string().trim().min(1, LL.form.errors.required()), pubkey: z .string() @@ -136,7 +139,7 @@ export const AddTunnelFormCard = () => { } return true; }, LL.form.errors.invalid()), - persistent_keep_alive: z.number(), + persistent_keep_alive: z.coerce.number(), route_all_traffic: z.boolean(), pre_up: z.string().nullable(), post_up: z.string().nullable(), diff --git a/src/pages/client/pages/ClientEditTunnelPage/components/EditTunnelFormCard.tsx b/src/pages/client/pages/ClientEditTunnelPage/components/EditTunnelFormCard.tsx index ba44d639..8b53fa0c 100644 --- a/src/pages/client/pages/ClientEditTunnelPage/components/EditTunnelFormCard.tsx +++ b/src/pages/client/pages/ClientEditTunnelPage/components/EditTunnelFormCard.tsx @@ -67,7 +67,7 @@ const defaultValues: FormFields = { pre_down: '', post_down: '', }; -const { saveTunnel } = clientApi; +const { updateTunnel } = clientApi; const tunnelToForm = (tunnel: Tunnel): FormFields => { const { @@ -175,7 +175,7 @@ export const EditTunnelFormCard = ({ tunnel, submitRef }: Props) => { } return true; }, LL.form.errors.invalid()), - persistent_keep_alive: z.number(), + persistent_keep_alive: z.coerce.number(), route_all_traffic: z.boolean(), pre_up: z.string().nullable(), post_up: z.string().nullable(), @@ -186,7 +186,7 @@ export const EditTunnelFormCard = ({ tunnel, submitRef }: Props) => { ); const handleValidSubmit: SubmitHandler = (values) => { - saveTunnel(values) + updateTunnel(values) .then(() => { navigate(routes.client.base, { replace: true }); toaster.success(LL.pages.client.pages.editTunnelPage.messages.editSuccess()); diff --git a/src/pages/client/pages/ClientEditTunnelPage/modals/DeleteTunnelModal/DeleteTunnelModal.tsx b/src/pages/client/pages/ClientEditTunnelPage/modals/DeleteTunnelModal/DeleteTunnelModal.tsx index dda20902..228e521d 100644 --- a/src/pages/client/pages/ClientEditTunnelPage/modals/DeleteTunnelModal/DeleteTunnelModal.tsx +++ b/src/pages/client/pages/ClientEditTunnelPage/modals/DeleteTunnelModal/DeleteTunnelModal.tsx @@ -54,7 +54,11 @@ export const DeleteTunnelModal = () => { navigate(routes.client.base, { replace: true }); }, onError: (e) => { - toaster.error(localLL.messages.error()); + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); console.error(e); }, }); diff --git a/src/pages/client/pages/ClientInstancePage/ClientInstancePage.tsx b/src/pages/client/pages/ClientInstancePage/ClientInstancePage.tsx index 57bdf9d1..861de1cb 100644 --- a/src/pages/client/pages/ClientInstancePage/ClientInstancePage.tsx +++ b/src/pages/client/pages/ClientInstancePage/ClientInstancePage.tsx @@ -1,14 +1,17 @@ import './style.scss'; +import { useQuery } from '@tanstack/react-query'; import { isUndefined } from 'lodash-es'; -import { useEffect, useMemo } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { useI18nContext } from '../../../../i18n/i18n-react'; import { Button } from '../../../../shared/defguard-ui/components/Layout/Button/Button'; import { ButtonStyleVariant } from '../../../../shared/defguard-ui/components/Layout/Button/types'; import { routes } from '../../../../shared/routes'; +import { clientApi } from '../../clientAPI/clientApi'; import { useClientStore } from '../../hooks/useClientStore'; +import { clientQueryKeys } from '../../query'; import { DefguardInstance, WireguardInstanceType } from '../../types'; import { LocationsList } from './components/LocationsList/LocationsList'; import { StatsFilterSelect } from './components/StatsFilterSelect/StatsFilterSelect'; @@ -17,6 +20,8 @@ import { DeleteInstanceModal } from './modals/DeleteInstanceModal/DeleteInstance import { UpdateInstanceModal } from './modals/UpdateInstanceModal/UpdateInstanceModal'; import { useUpdateInstanceModal } from './modals/UpdateInstanceModal/useUpdateInstanceModal'; +const { getLocations, getTunnels } = clientApi; + export const ClientInstancePage = () => { const { LL } = useI18nContext(); const instanceLL = LL.pages.client.pages.instancePage; @@ -44,6 +49,28 @@ export const ClientInstancePage = () => { const openUpdateInstanceModal = useUpdateInstanceModal((state) => state.open); + const queryKey = useMemo(() => { + if (selectedInstanceType === WireguardInstanceType.DEFGUARD_INSTANCE) { + return [clientQueryKeys.getLocations, selectedInstanceId as number]; + } else { + return [clientQueryKeys.getTunnels]; + } + }, [selectedInstanceId, selectedInstanceType]); + + const queryFn = useCallback(() => { + if (selectedInstanceType === WireguardInstanceType.DEFGUARD_INSTANCE) { + return getLocations({ instanceId: selectedInstanceId as number }); + } else { + return getTunnels(); + } + }, [selectedInstanceType, selectedInstanceId]); + + const { data: locations, isError } = useQuery({ + queryKey, + queryFn, + enabled: !!selectedInstance, + }); + useEffect(() => { const isDefguardInstance = selectedInstanceType === WireguardInstanceType.DEFGUARD_INSTANCE; @@ -64,7 +91,7 @@ export const ClientInstancePage = () => { {isLocationPage && ( <> - + {selectedInstance && (
- + diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/LocationsList.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/LocationsList.tsx index fe81c867..ddad7cb7 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/LocationsList.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/LocationsList.tsx @@ -1,51 +1,38 @@ -import { useQuery } from '@tanstack/react-query'; -import { useCallback, useEffect, useMemo } from 'react'; +import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useI18nContext } from '../../../../../../i18n/i18n-react'; import { useToaster } from '../../../../../../shared/defguard-ui/hooks/toasts/useToaster'; import { routes } from '../../../../../../shared/routes'; -import { clientApi } from '../../../../clientAPI/clientApi'; import { useClientStore } from '../../../../hooks/useClientStore'; -import { clientQueryKeys } from '../../../../query'; -import { ClientView, WireguardInstanceType } from '../../../../types'; +import { + CommonWireguardFields, + DefguardInstance, + WireguardInstanceType, +} from '../../../../types'; import { LocationsDetailView } from './components/LocationsDetailView/LocationsDetailView'; import { LocationsGridView } from './components/LocationsGridView/LocationsGridView'; import { MFAModal } from './modals/MFAModal/MFAModal'; -const { getLocations, getTunnels } = clientApi; +interface LocationsListProps { + locations: CommonWireguardFields[] | undefined; + isError: boolean; + selectedDefguardInstance: DefguardInstance | undefined; +} -export const LocationsList = () => { +export const LocationsList = ({ + locations, + isError, + selectedDefguardInstance, +}: LocationsListProps) => { const { LL } = useI18nContext(); - const selectedInstance = useClientStore((state) => state.selectedInstance); - - const selectedView = useClientStore((state) => state.selectedView); + const selectedView = useClientStore((state) => state.settings.selected_view); + const selectedInstance = useClientStore((state) => state.selectedInstance); const toaster = useToaster(); - const navigate = useNavigate(); - const queryKey = useMemo(() => { - if (selectedInstance?.type === WireguardInstanceType.DEFGUARD_INSTANCE) { - return [clientQueryKeys.getLocations, selectedInstance?.id as number]; - } else { - return [clientQueryKeys.getTunnels]; - } - }, [selectedInstance]); - - const queryFn = useCallback(() => { - if (selectedInstance?.type === WireguardInstanceType.DEFGUARD_INSTANCE) { - return getLocations({ instanceId: selectedInstance?.id as number }); - } else { - return getTunnels(); - } - }, [selectedInstance]); - - const { data: locations, isError } = useQuery({ - queryKey, - queryFn, - enabled: !!selectedInstance, - }); + const isTunnelType = selectedInstance?.type === WireguardInstanceType.TUNNEL; useEffect(() => { if (isError) { @@ -67,12 +54,25 @@ export const LocationsList = () => { return ( <> - {selectedView === ClientView.GRID && } + {locations.length === 1 && selectedView === null && !isTunnelType && ( + + )} + {(selectedView === 'grid' || selectedView === null || isTunnelType) && ( + + )} - {selectedView === ClientView.DETAIL && ( + {selectedView === 'detail' && !isTunnelType && ( )} diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardConnectButton/LocationCardConnectButton.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardConnectButton/LocationCardConnectButton.tsx index d28f4528..cd0a8b91 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardConnectButton/LocationCardConnectButton.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardConnectButton/LocationCardConnectButton.tsx @@ -1,7 +1,8 @@ import './style.scss'; +import { listen } from '@tauri-apps/api/event'; import classNames from 'classnames'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { error } from 'tauri-plugin-log-api'; import { useI18nContext } from '../../../../../../../../i18n/i18n-react'; @@ -23,6 +24,10 @@ type Props = { location?: CommonWireguardFields; }; +type Payload = { + location?: CommonWireguardFields; +}; + export const LocationCardConnectButton = ({ location }: Props) => { const toaster = useToaster(); const [isLoading, setIsLoading] = useState(false); @@ -56,12 +61,27 @@ export const LocationCardConnectButton = ({ location }: Props) => { } } catch (e) { setIsLoading(false); - toaster.error(LL.common.messages.error()); + toaster.error( + LL.common.messages.errorWithMessage({ + message: String(e), + }), + ); error(`Error handling interface: ${e}`); console.error(e); } }; + useEffect(() => { + async function listenMFAEvent() { + await listen('mfa-trigger', () => { + if (location) { + openMFAModal(location); + } + }); + } + listenMFAEvent(); + }, [openMFAModal, location]); + return (