diff --git a/.gitignore b/.gitignore index 99880c84..0a6ec72c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .DS_Store +.direnv/ /node_modules/ +result # React Router /.react-router/ @@ -13,3 +15,4 @@ CLAUDE.md mutagen.yml.lock notes.md smb-password.txt +.envrc diff --git a/README.md b/README.md index 8000055a..bd50fce9 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,67 @@ services: If you need remote mount capabilities, keep the original configuration with `cap_add: SYS_ADMIN` and `devices: /dev/fuse:/dev/fuse`. +### Nix Flake + +Zerobyte provides a Nix flake for NixOS users and Nix-based development environments. + +**Development shell:** + +```bash +nix develop +``` + +**NixOS module:** + +```nix +{ + inputs.zerobyte.url = "github:nicotsx/zerobyte"; + + outputs = { self, nixpkgs, zerobyte }: { + nixosConfigurations.myhost = nixpkgs.lib.nixosSystem { + modules = [ + zerobyte.nixosModules.default + { + services.zerobyte = { + enable = true; + port = 4096; + openFirewall = true; + # fuse.enable = true; # Enabled by default for remote mounts + }; + } + ]; + }; + }; +} +``` + +**Available module options (NixOS):** + +| Option | Default | Description | +|--------|---------|-------------| +| `enable` | `false` | Enable Zerobyte service | +| `port` | `4096` | HTTP port | +| `dataDir` | `/var/lib/zerobyte` | Data directory | +| `user` | `"zerobyte"` | User to run service as | +| `group` | `"zerobyte"` | Group to run service as | +| `createUser` | `true` | Create user/group automatically | +| `serverIp` | `"0.0.0.0"` | Bind address | +| `openFirewall` | `false` | Open firewall port (NixOS only) | +| `fuse.enable` | `true` | Enable FUSE/remote mounts (NixOS only) | +| `protectHome` | `true` | Block /home access (NixOS only, set false to backup home dirs) | +| `extraReadWritePaths` | `[]` | Additional writable paths (e.g., `["/mnt/storage"]` for custom repos) | +| `timezone` | `"UTC"` | Timezone for scheduling | +| `resticHostname` | `"zerobyte"` | Hostname for restic | + +**Updating dependencies (for contributors):** + +After modifying `package.json` or `bun.lock`, regenerate the Nix dependency file: + +```bash +nix develop +bun2nix -o bun.nix +``` + ## Examples See [examples/README.md](examples/README.md) for runnable, copy/paste-friendly examples. diff --git a/app/server/core/config.ts b/app/server/core/config.ts index f4ca6f9e..7925666f 100644 --- a/app/server/core/config.ts +++ b/app/server/core/config.ts @@ -3,15 +3,19 @@ import "dotenv/config"; const envSchema = type({ NODE_ENV: type.enumerated("development", "production", "test").default("production"), + PORT: 'string.integer.parse = "4096"', SERVER_IP: 'string = "localhost"', SERVER_IDLE_TIMEOUT: 'string.integer.parse = "60"', RESTIC_HOSTNAME: "string = 'zerobyte'", + MIGRATIONS_PATH: "string?", }).pipe((s) => ({ __prod__: s.NODE_ENV === "production", environment: s.NODE_ENV, + port: s.PORT, serverIp: s.SERVER_IP, serverIdleTimeout: s.SERVER_IDLE_TIMEOUT, resticHostname: s.RESTIC_HOSTNAME, + migrationsPath: s.MIGRATIONS_PATH, })); const parseConfig = (env: unknown) => { diff --git a/app/server/db/db.ts b/app/server/db/db.ts index 07109455..6944a684 100644 --- a/app/server/db/db.ts +++ b/app/server/db/db.ts @@ -14,9 +14,17 @@ const sqlite = new Database(DATABASE_URL); export const db = drizzle({ client: sqlite, schema }); export const runDbMigrations = () => { - let migrationsFolder = path.join("/app", "assets", "migrations"); + let migrationsFolder: string; - if (!config.__prod__) { + // Migration path priority: + // 1. MIGRATIONS_PATH env var (Nix, custom deployments) + // 2. /app/assets/migrations (Docker production) + // 3. /app/app/drizzle (Docker development) + if (config.migrationsPath) { + migrationsFolder = config.migrationsPath; + } else if (config.__prod__) { + migrationsFolder = path.join("/app", "assets", "migrations"); + } else { migrationsFolder = path.join("/app", "app", "drizzle"); } diff --git a/app/server/index.ts b/app/server/index.ts index 5e290a63..f974526d 100644 --- a/app/server/index.ts +++ b/app/server/index.ts @@ -18,7 +18,7 @@ await validateRequiredMigrations(REQUIRED_MIGRATIONS); startup(); -logger.info(`Server is running at http://localhost:4096`); +logger.info(`Server is running at http://localhost:${config.port}`); export type AppType = typeof app; @@ -36,7 +36,7 @@ process.on("SIGINT", async () => { export default await createHonoServer({ app, - port: 4096, + port: config.port, customBunServer: { idleTimeout: config.serverIdleTimeout, error(err) { diff --git a/bun.lock b/bun.lock index 73092752..4ba728c6 100644 --- a/bun.lock +++ b/bun.lock @@ -26,7 +26,11 @@ "@react-router/node": "^7.10.0", "@react-router/serve": "^7.10.0", "@scalar/hono-api-reference": "^0.9.25", + "@standard-community/standard-json": "^0.3.5", + "@standard-community/standard-openapi": "^0.2.9", + "@standard-schema/spec": "^1.1.0", "@tanstack/react-query": "^5.90.11", + "@types/json-schema": "^7.0.15", "arktype": "^2.1.28", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -45,9 +49,12 @@ "lucide-react": "^0.555.0", "next-themes": "^0.4.6", "node-cron": "^4.2.1", + "openapi-types": "^12.1.3", + "quansync": "^1.0.0", "react": "^19.2.1", "react-dom": "^19.2.1", "react-hook-form": "^7.68.0", + "react-is": "^19.2.3", "react-router": "^7.10.0", "react-router-hono-server": "^2.22.0", "recharts": "3.5.1", @@ -952,7 +959,7 @@ "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + "quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], diff --git a/bun.nix b/bun.nix new file mode 100644 index 00000000..516b61c1 --- /dev/null +++ b/bun.nix @@ -0,0 +1,2224 @@ +# Autogenerated by `bun2nix`, editing manually is not recommended +# +# Set of Bun packages to install +# +# Consume this with `fetchBunDeps` (recommended) +# or `pkgs.callPackage` if you wish to handle +# it manually. +{ + copyPathToStore, + fetchFromGitHub, + fetchgit, + fetchurl, + ... +}: +{ + "@ark/schema@0.56.0" = fetchurl { + url = "https://registry.npmjs.org/@ark/schema/-/schema-0.56.0.tgz"; + hash = "sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA=="; + }; + "@ark/util@0.56.0" = fetchurl { + url = "https://registry.npmjs.org/@ark/util/-/util-0.56.0.tgz"; + hash = "sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA=="; + }; + "@babel/code-frame@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"; + hash = "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="; + }; + "@babel/compat-data@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"; + hash = "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="; + }; + "@babel/core@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"; + hash = "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="; + }; + "@babel/generator@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz"; + hash = "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="; + }; + "@babel/helper-annotate-as-pure@7.27.3" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz"; + hash = "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="; + }; + "@babel/helper-compilation-targets@7.27.2" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz"; + hash = "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="; + }; + "@babel/helper-create-class-features-plugin@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz"; + hash = "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="; + }; + "@babel/helper-globals@7.28.0" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"; + hash = "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="; + }; + "@babel/helper-member-expression-to-functions@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz"; + hash = "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="; + }; + "@babel/helper-module-imports@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz"; + hash = "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="; + }; + "@babel/helper-module-transforms@7.28.3" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz"; + hash = "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="; + }; + "@babel/helper-optimise-call-expression@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz"; + hash = "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="; + }; + "@babel/helper-plugin-utils@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"; + hash = "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="; + }; + "@babel/helper-replace-supers@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz"; + hash = "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="; + }; + "@babel/helper-skip-transparent-expression-wrappers@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz"; + hash = "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="; + }; + "@babel/helper-string-parser@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"; + hash = "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="; + }; + "@babel/helper-validator-identifier@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"; + hash = "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="; + }; + "@babel/helper-validator-option@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"; + hash = "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="; + }; + "@babel/helpers@7.28.4" = fetchurl { + url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz"; + hash = "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="; + }; + "@babel/parser@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz"; + hash = "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="; + }; + "@babel/plugin-syntax-jsx@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz"; + hash = "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="; + }; + "@babel/plugin-syntax-typescript@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz"; + hash = "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="; + }; + "@babel/plugin-transform-modules-commonjs@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz"; + hash = "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="; + }; + "@babel/plugin-transform-typescript@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz"; + hash = "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="; + }; + "@babel/preset-typescript@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz"; + hash = "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="; + }; + "@babel/template@7.27.2" = fetchurl { + url = "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz"; + hash = "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="; + }; + "@babel/traverse@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz"; + hash = "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="; + }; + "@babel/types@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz"; + hash = "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="; + }; + "@biomejs/biome@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.10.tgz"; + hash = "sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ=="; + }; + "@biomejs/cli-darwin-arm64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.10.tgz"; + hash = "sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w=="; + }; + "@biomejs/cli-darwin-x64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.10.tgz"; + hash = "sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg=="; + }; + "@biomejs/cli-linux-arm64-musl@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.10.tgz"; + hash = "sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A=="; + }; + "@biomejs/cli-linux-arm64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.10.tgz"; + hash = "sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA=="; + }; + "@biomejs/cli-linux-x64-musl@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.10.tgz"; + hash = "sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g=="; + }; + "@biomejs/cli-linux-x64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.10.tgz"; + hash = "sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw=="; + }; + "@biomejs/cli-win32-arm64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.10.tgz"; + hash = "sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ=="; + }; + "@biomejs/cli-win32-x64@2.3.10" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.10.tgz"; + hash = "sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ=="; + }; + "@colors/colors@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz"; + hash = "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="; + }; + "@dabh/diagnostics@2.0.8" = fetchurl { + url = "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz"; + hash = "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q=="; + }; + "@dnd-kit/accessibility@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz"; + hash = "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="; + }; + "@dnd-kit/core@6.3.1" = fetchurl { + url = "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz"; + hash = "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ=="; + }; + "@dnd-kit/sortable@10.0.0" = fetchurl { + url = "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz"; + hash = "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg=="; + }; + "@dnd-kit/utilities@3.2.2" = fetchurl { + url = "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz"; + hash = "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="; + }; + "@drizzle-team/brocli@0.10.2" = fetchurl { + url = "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz"; + hash = "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="; + }; + "@drizzle-team/brocli@0.11.0" = fetchurl { + url = "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.11.0.tgz"; + hash = "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="; + }; + "@emnapi/core@1.7.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz"; + hash = "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="; + }; + "@emnapi/runtime@1.7.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz"; + hash = "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="; + }; + "@emnapi/wasi-threads@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"; + hash = "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="; + }; + "@esbuild-kit/core-utils@3.3.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz"; + hash = "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="; + }; + "@esbuild-kit/esm-loader@2.6.5" = fetchurl { + url = "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz"; + hash = "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="; + }; + "@esbuild/aix-ppc64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz"; + hash = "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="; + }; + "@esbuild/android-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz"; + hash = "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="; + }; + "@esbuild/android-arm@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz"; + hash = "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="; + }; + "@esbuild/android-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz"; + hash = "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="; + }; + "@esbuild/darwin-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz"; + hash = "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="; + }; + "@esbuild/darwin-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz"; + hash = "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="; + }; + "@esbuild/freebsd-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz"; + hash = "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="; + }; + "@esbuild/freebsd-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz"; + hash = "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="; + }; + "@esbuild/linux-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz"; + hash = "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="; + }; + "@esbuild/linux-arm@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz"; + hash = "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="; + }; + "@esbuild/linux-ia32@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz"; + hash = "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="; + }; + "@esbuild/linux-loong64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz"; + hash = "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="; + }; + "@esbuild/linux-mips64el@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz"; + hash = "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="; + }; + "@esbuild/linux-ppc64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz"; + hash = "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="; + }; + "@esbuild/linux-riscv64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz"; + hash = "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="; + }; + "@esbuild/linux-s390x@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz"; + hash = "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="; + }; + "@esbuild/linux-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz"; + hash = "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="; + }; + "@esbuild/netbsd-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz"; + hash = "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="; + }; + "@esbuild/netbsd-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz"; + hash = "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="; + }; + "@esbuild/openbsd-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz"; + hash = "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="; + }; + "@esbuild/openbsd-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz"; + hash = "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="; + }; + "@esbuild/openharmony-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz"; + hash = "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="; + }; + "@esbuild/sunos-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz"; + hash = "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="; + }; + "@esbuild/win32-arm64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz"; + hash = "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="; + }; + "@esbuild/win32-ia32@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz"; + hash = "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="; + }; + "@esbuild/win32-x64@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz"; + hash = "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="; + }; + "@faker-js/faker@10.1.0" = fetchurl { + url = "https://registry.npmjs.org/@faker-js/faker/-/faker-10.1.0.tgz"; + hash = "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg=="; + }; + "@floating-ui/core@1.7.3" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz"; + hash = "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="; + }; + "@floating-ui/dom@1.7.4" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz"; + hash = "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="; + }; + "@floating-ui/react-dom@2.1.6" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz"; + hash = "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="; + }; + "@floating-ui/utils@0.2.10" = fetchurl { + url = "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz"; + hash = "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="; + }; + "@hey-api/codegen-core@0.3.3" = fetchurl { + url = "https://registry.npmjs.org/@hey-api/codegen-core/-/codegen-core-0.3.3.tgz"; + hash = "sha512-vArVDtrvdzFewu1hnjUm4jX1NBITlSCeO81EdWq676MxQbyxsGcDPAgohaSA+Wvr4HjPSvsg2/1s2zYxUtXebg=="; + }; + "@hey-api/json-schema-ref-parser@1.2.2" = fetchurl { + url = "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.2.2.tgz"; + hash = "sha512-oS+5yAdwnK20lSeFO1d53Ku+yaGCsY8PcrmSq2GtSs3bsBfRnHAbpPKSVzQcaxAOrzj5NB+f34WhZglVrNayBA=="; + }; + "@hey-api/openapi-ts@0.88.2" = fetchurl { + url = "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.88.2.tgz"; + hash = "sha512-JMae1RJ8S8D8lVCFQnsrWaKY0CxrR4TUmZIoU1SuvaeZ+pkMPYuQoj8fO37R5d8juUfFVzCGYV5/Ro0vbDqBbA=="; + }; + "@hono/node-server@1.19.7" = fetchurl { + url = "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz"; + hash = "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw=="; + }; + "@hono/node-ws@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/@hono/node-ws/-/node-ws-1.2.0.tgz"; + hash = "sha512-OBPQ8OSHBw29mj00wT/xGYtB6HY54j0fNSdVZ7gZM3TUeq0So11GXaWtFf1xWxQNfumKIsj0wRuLKWfVsO5GgQ=="; + }; + "@hono/standard-validator@0.2.1" = fetchurl { + url = "https://registry.npmjs.org/@hono/standard-validator/-/standard-validator-0.2.1.tgz"; + hash = "sha512-uF1W7/iSWi0r5Mugj5ZzdlCVp/KeGatS6JYt+Eht9xKO0IDtdZbdaLApgjrzHINQQa+Wnxw2pcX6EfO+vgB+Wg=="; + }; + "@hono/vite-dev-server@0.23.0" = fetchurl { + url = "https://registry.npmjs.org/@hono/vite-dev-server/-/vite-dev-server-0.23.0.tgz"; + hash = "sha512-tHV86xToed9Up0j/dubQW2PDP4aYNFDSfQrjcV6Ra7bqCGrxhtg/zZBmbgSco3aTxKOEPzDXKK+6seAAfsbIXw=="; + }; + "@hookform/resolvers@5.2.2" = fetchurl { + url = "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz"; + hash = "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA=="; + }; + "@inquirer/ansi@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.2.tgz"; + hash = "sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww=="; + }; + "@inquirer/checkbox@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.0.3.tgz"; + hash = "sha512-xtQP2eXMFlOcAhZ4ReKP2KZvDIBb1AnCfZ81wWXG3DXLVH0f0g4obE0XDPH+ukAEMRcZT0kdX2AS1jrWGXbpxw=="; + }; + "@inquirer/confirm@6.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.3.tgz"; + hash = "sha512-lyEvibDFL+NA5R4xl8FUmNhmu81B+LDL9L/MpKkZlQDJZXzG8InxiqYxiAlQYa9cqLLhYqKLQwZqXmSTqCLjyw=="; + }; + "@inquirer/core@11.1.0" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/core/-/core-11.1.0.tgz"; + hash = "sha512-+jD/34T1pK8M5QmZD/ENhOfXdl9Zr+BrQAUc5h2anWgi7gggRq15ZbiBeLoObj0TLbdgW7TAIQRU2boMc9uOKQ=="; + }; + "@inquirer/editor@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.3.tgz"; + hash = "sha512-wYyQo96TsAqIciP/r5D3cFeV8h4WqKQ/YOvTg5yOfP2sqEbVVpbxPpfV3LM5D0EP4zUI3EZVHyIUIllnoIa8OQ=="; + }; + "@inquirer/expand@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.3.tgz"; + hash = "sha512-2oINvuL27ujjxd95f6K2K909uZOU2x1WiAl7Wb1X/xOtL8CgQ1kSxzykIr7u4xTkXkXOAkCuF45T588/YKee7w=="; + }; + "@inquirer/external-editor@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-2.0.2.tgz"; + hash = "sha512-X/fMXK7vXomRWEex1j8mnj7s1mpnTeP4CO/h2gysJhHLT2WjBnLv4ZQEGpm/kcYI8QfLZ2fgW+9kTKD+jeopLg=="; + }; + "@inquirer/figures@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.2.tgz"; + hash = "sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A=="; + }; + "@inquirer/input@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/input/-/input-5.0.3.tgz"; + hash = "sha512-4R0TdWl53dtp79Vs6Df2OHAtA2FVNqya1hND1f5wjHWxZJxwDMSNB1X5ADZJSsQKYAJ5JHCTO+GpJZ42mK0Otw=="; + }; + "@inquirer/number@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/number/-/number-4.0.3.tgz"; + hash = "sha512-TjQLe93GGo5snRlu83JxE38ZPqj5ZVggL+QqqAF2oBA5JOJoxx25GG3EGH/XN/Os5WOmKfO8iLVdCXQxXRZIMQ=="; + }; + "@inquirer/password@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/password/-/password-5.0.3.tgz"; + hash = "sha512-rCozGbUMAHedTeYWEN8sgZH4lRCdgG/WinFkit6ZPsp8JaNg2T0g3QslPBS5XbpORyKP/I+xyBO81kFEvhBmjA=="; + }; + "@inquirer/prompts@8.1.0" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.1.0.tgz"; + hash = "sha512-LsZMdKcmRNF5LyTRuZE5nWeOjganzmN3zwbtNfcs6GPh3I2TsTtF1UYZlbxVfhxd+EuUqLGs/Lm3Xt4v6Az1wA=="; + }; + "@inquirer/rawlist@5.1.0" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.1.0.tgz"; + hash = "sha512-yUCuVh0jW026Gr2tZlG3kHignxcrLKDR3KBp+eUgNz+BAdSeZk0e18yt2gyBr+giYhj/WSIHCmPDOgp1mT2niQ=="; + }; + "@inquirer/search@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/search/-/search-4.0.3.tgz"; + hash = "sha512-lzqVw0YwuKYetk5VwJ81Ba+dyVlhseHPx9YnRKQgwXdFS0kEavCz2gngnNhnMIxg8+j1N/rUl1t5s1npwa7bqg=="; + }; + "@inquirer/select@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/select/-/select-5.0.3.tgz"; + hash = "sha512-M+ynbwS0ecQFDYMFrQrybA0qL8DV0snpc4kKevCCNaTpfghsRowRY7SlQBeIYNzHqXtiiz4RG9vTOeb/udew7w=="; + }; + "@inquirer/type@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/type/-/type-4.0.2.tgz"; + hash = "sha512-cae7mzluplsjSdgFA6ACLygb5jC8alO0UUnFPyu0E7tNRPrL+q/f8VcSXp+cjZQ7l5CMpDpi2G1+IQvkOiL1Lw=="; + }; + "@jridgewell/gen-mapping@0.3.13" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"; + hash = "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="; + }; + "@jridgewell/remapping@2.3.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"; + hash = "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="; + }; + "@jridgewell/resolve-uri@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; + hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; + }; + "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; + hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; + }; + "@jridgewell/trace-mapping@0.3.31" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"; + hash = "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="; + }; + "@jsdevtools/ono@7.1.3" = fetchurl { + url = "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz"; + hash = "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="; + }; + "@mjackson/node-fetch-server@0.2.0" = fetchurl { + url = "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz"; + hash = "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="; + }; + "@napi-rs/wasm-runtime@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz"; + hash = "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA=="; + }; + "@radix-ui/number@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz"; + hash = "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="; + }; + "@radix-ui/primitive@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz"; + hash = "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="; + }; + "@radix-ui/react-alert-dialog@1.1.15" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz"; + hash = "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw=="; + }; + "@radix-ui/react-arrow@1.1.7" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz"; + hash = "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="; + }; + "@radix-ui/react-checkbox@1.3.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz"; + hash = "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="; + }; + "@radix-ui/react-collection@1.1.7" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz"; + hash = "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="; + }; + "@radix-ui/react-compose-refs@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"; + hash = "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="; + }; + "@radix-ui/react-context@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz"; + hash = "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="; + }; + "@radix-ui/react-context@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz"; + hash = "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="; + }; + "@radix-ui/react-dialog@1.1.15" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz"; + hash = "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="; + }; + "@radix-ui/react-direction@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz"; + hash = "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="; + }; + "@radix-ui/react-dismissable-layer@1.1.11" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz"; + hash = "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="; + }; + "@radix-ui/react-focus-guards@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz"; + hash = "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="; + }; + "@radix-ui/react-focus-scope@1.1.7" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz"; + hash = "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="; + }; + "@radix-ui/react-id@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz"; + hash = "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="; + }; + "@radix-ui/react-label@2.1.8" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz"; + hash = "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="; + }; + "@radix-ui/react-popper@1.2.8" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz"; + hash = "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="; + }; + "@radix-ui/react-portal@1.1.9" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz"; + hash = "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="; + }; + "@radix-ui/react-presence@1.1.5" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz"; + hash = "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="; + }; + "@radix-ui/react-primitive@2.1.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"; + hash = "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="; + }; + "@radix-ui/react-primitive@2.1.4" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz"; + hash = "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="; + }; + "@radix-ui/react-progress@1.1.8" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz"; + hash = "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA=="; + }; + "@radix-ui/react-roving-focus@1.1.11" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz"; + hash = "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="; + }; + "@radix-ui/react-scroll-area@1.2.10" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz"; + hash = "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="; + }; + "@radix-ui/react-select@2.2.6" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz"; + hash = "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="; + }; + "@radix-ui/react-separator@1.1.8" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz"; + hash = "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="; + }; + "@radix-ui/react-slot@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"; + hash = "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="; + }; + "@radix-ui/react-slot@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"; + hash = "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="; + }; + "@radix-ui/react-switch@1.2.6" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz"; + hash = "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ=="; + }; + "@radix-ui/react-tabs@1.1.13" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz"; + hash = "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="; + }; + "@radix-ui/react-tooltip@1.2.8" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz"; + hash = "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="; + }; + "@radix-ui/react-use-callback-ref@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz"; + hash = "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="; + }; + "@radix-ui/react-use-controllable-state@1.2.2" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz"; + hash = "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="; + }; + "@radix-ui/react-use-effect-event@0.0.2" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz"; + hash = "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="; + }; + "@radix-ui/react-use-escape-keydown@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz"; + hash = "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="; + }; + "@radix-ui/react-use-layout-effect@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz"; + hash = "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="; + }; + "@radix-ui/react-use-previous@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz"; + hash = "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="; + }; + "@radix-ui/react-use-rect@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz"; + hash = "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="; + }; + "@radix-ui/react-use-size@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz"; + hash = "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="; + }; + "@radix-ui/react-visually-hidden@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz"; + hash = "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="; + }; + "@radix-ui/rect@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz"; + hash = "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="; + }; + "@react-router/dev@7.11.0" = fetchurl { + url = "https://registry.npmjs.org/@react-router/dev/-/dev-7.11.0.tgz"; + hash = "sha512-g1ou5Zw3r4mCU0L+EXH4vRtAiyt8qz1JOvL1k+PW4rZ4+71h5nBy/fLgD7cg5BnzQZmjRO1PzCgpF5BIrlKYxQ=="; + }; + "@react-router/express@7.11.0" = fetchurl { + url = "https://registry.npmjs.org/@react-router/express/-/express-7.11.0.tgz"; + hash = "sha512-o5DeO9tqUrZcUWAgmPGgK4I/S6iFpqnj/e20xMGA04trk+90b9KAx9eqmRMgHERubVKANTM9gTDPduobQjeH1A=="; + }; + "@react-router/node@7.11.0" = fetchurl { + url = "https://registry.npmjs.org/@react-router/node/-/node-7.11.0.tgz"; + hash = "sha512-11ha8EW+F7wTMmPz2pdi11LJxz2irtuksiCpunpZjtpPmYU37S+GGihG8vFeTa2xFPNunEaHNlfzKyzeYm570Q=="; + }; + "@react-router/serve@7.11.0" = fetchurl { + url = "https://registry.npmjs.org/@react-router/serve/-/serve-7.11.0.tgz"; + hash = "sha512-U5Ht9PmUYF4Ti1ssaWlddLY4ZCbXBtHDGFU/u1h3VsHqleSdHsFuGAFrr/ZEuqTuEWp1CLqn2npEDAmlV9IUKQ=="; + }; + "@reduxjs/toolkit@2.11.2" = fetchurl { + url = "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz"; + hash = "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="; + }; + "@remix-run/node-fetch-server@0.9.0" = fetchurl { + url = "https://registry.npmjs.org/@remix-run/node-fetch-server/-/node-fetch-server-0.9.0.tgz"; + hash = "sha512-SoLMv7dbH+njWzXnOY6fI08dFMI5+/dQ+vY3n8RnnbdG7MdJEgiP28Xj/xWlnRnED/aB6SFw56Zop+LbmaaKqA=="; + }; + "@rollup/rollup-android-arm-eabi@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz"; + hash = "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng=="; + }; + "@rollup/rollup-android-arm64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz"; + hash = "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw=="; + }; + "@rollup/rollup-darwin-arm64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz"; + hash = "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw=="; + }; + "@rollup/rollup-darwin-x64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz"; + hash = "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A=="; + }; + "@rollup/rollup-freebsd-arm64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz"; + hash = "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA=="; + }; + "@rollup/rollup-freebsd-x64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz"; + hash = "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ=="; + }; + "@rollup/rollup-linux-arm-gnueabihf@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz"; + hash = "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ=="; + }; + "@rollup/rollup-linux-arm-musleabihf@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz"; + hash = "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA=="; + }; + "@rollup/rollup-linux-arm64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz"; + hash = "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng=="; + }; + "@rollup/rollup-linux-arm64-musl@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz"; + hash = "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg=="; + }; + "@rollup/rollup-linux-loong64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz"; + hash = "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw=="; + }; + "@rollup/rollup-linux-ppc64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz"; + hash = "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA=="; + }; + "@rollup/rollup-linux-riscv64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz"; + hash = "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ=="; + }; + "@rollup/rollup-linux-riscv64-musl@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz"; + hash = "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A=="; + }; + "@rollup/rollup-linux-s390x-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz"; + hash = "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ=="; + }; + "@rollup/rollup-linux-x64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz"; + hash = "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ=="; + }; + "@rollup/rollup-linux-x64-musl@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz"; + hash = "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw=="; + }; + "@rollup/rollup-openharmony-arm64@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz"; + hash = "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg=="; + }; + "@rollup/rollup-win32-arm64-msvc@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz"; + hash = "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw=="; + }; + "@rollup/rollup-win32-ia32-msvc@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz"; + hash = "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ=="; + }; + "@rollup/rollup-win32-x64-gnu@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz"; + hash = "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ=="; + }; + "@rollup/rollup-win32-x64-msvc@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz"; + hash = "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="; + }; + "@scalar/core@0.3.28" = fetchurl { + url = "https://registry.npmjs.org/@scalar/core/-/core-0.3.28.tgz"; + hash = "sha512-Ka+g5P3Fe4f9lsJcBxfI+XAgwMYeZRgzIBWw1/HBrDoRmH3rV/N//410MBKEYXUw7pWpS+dZPJANZRvU5jtxhw=="; + }; + "@scalar/helpers@0.2.4" = fetchurl { + url = "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.2.4.tgz"; + hash = "sha512-G7oGybO2QXM+MIxa4OZLXaYsS9mxKygFgOcY4UOXO6xpVoY5+8rahdak9cPk7HNj8RZSt4m/BveoT8g5BtnXxg=="; + }; + "@scalar/hono-api-reference@0.9.30" = fetchurl { + url = "https://registry.npmjs.org/@scalar/hono-api-reference/-/hono-api-reference-0.9.30.tgz"; + hash = "sha512-a9cPluqfi1bgX2p7PJl/2O4jgPcoAl/ecSAe74TbPYIi27A0O0bkUBscO7WNRJhWJ1GVVxX8NvJTNlDxUNBlpg=="; + }; + "@scalar/types@0.5.4" = fetchurl { + url = "https://registry.npmjs.org/@scalar/types/-/types-0.5.4.tgz"; + hash = "sha512-5FNQH/zx3tnERzxfpErscPHfRxLCuhncmhFYiaSz196Xi2iG1YI08BtxTV2slfT6of52epJ/MrKerarplKf9eg=="; + }; + "@so-ric/colorspace@1.1.6" = fetchurl { + url = "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz"; + hash = "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="; + }; + "@standard-community/standard-json@0.3.5" = fetchurl { + url = "https://registry.npmjs.org/@standard-community/standard-json/-/standard-json-0.3.5.tgz"; + hash = "sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA=="; + }; + "@standard-community/standard-openapi@0.2.9" = fetchurl { + url = "https://registry.npmjs.org/@standard-community/standard-openapi/-/standard-openapi-0.2.9.tgz"; + hash = "sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg=="; + }; + "@standard-schema/spec@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz"; + hash = "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="; + }; + "@standard-schema/utils@0.3.0" = fetchurl { + url = "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz"; + hash = "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="; + }; + "@tailwindcss/node@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz"; + hash = "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="; + }; + "@tailwindcss/oxide-android-arm64@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz"; + hash = "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="; + }; + "@tailwindcss/oxide-darwin-arm64@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz"; + hash = "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="; + }; + "@tailwindcss/oxide-darwin-x64@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz"; + hash = "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="; + }; + "@tailwindcss/oxide-freebsd-x64@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz"; + hash = "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="; + }; + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz"; + hash = "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="; + }; + "@tailwindcss/oxide-linux-arm64-gnu@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz"; + hash = "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="; + }; + "@tailwindcss/oxide-linux-arm64-musl@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz"; + hash = "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="; + }; + "@tailwindcss/oxide-linux-x64-gnu@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz"; + hash = "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="; + }; + "@tailwindcss/oxide-linux-x64-musl@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz"; + hash = "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="; + }; + "@tailwindcss/oxide-wasm32-wasi@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz"; + hash = "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="; + }; + "@tailwindcss/oxide-win32-arm64-msvc@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz"; + hash = "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="; + }; + "@tailwindcss/oxide-win32-x64-msvc@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz"; + hash = "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="; + }; + "@tailwindcss/oxide@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz"; + hash = "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="; + }; + "@tailwindcss/vite@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz"; + hash = "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="; + }; + "@tanstack/query-core@5.90.12" = fetchurl { + url = "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.12.tgz"; + hash = "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg=="; + }; + "@tanstack/query-devtools@5.91.1" = fetchurl { + url = "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.91.1.tgz"; + hash = "sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg=="; + }; + "@tanstack/react-query-devtools@5.91.1" = fetchurl { + url = "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.1.tgz"; + hash = "sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ=="; + }; + "@tanstack/react-query@5.90.12" = fetchurl { + url = "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.12.tgz"; + hash = "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg=="; + }; + "@tybys/wasm-util@0.10.1" = fetchurl { + url = "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"; + hash = "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="; + }; + "@types/bun@1.3.5" = fetchurl { + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz"; + hash = "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="; + }; + "@types/d3-array@3.2.2" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz"; + hash = "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="; + }; + "@types/d3-color@3.1.3" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz"; + hash = "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="; + }; + "@types/d3-ease@3.0.2" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz"; + hash = "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="; + }; + "@types/d3-interpolate@3.0.4" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz"; + hash = "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="; + }; + "@types/d3-path@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz"; + hash = "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="; + }; + "@types/d3-scale@4.0.9" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz"; + hash = "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="; + }; + "@types/d3-shape@3.1.7" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz"; + hash = "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="; + }; + "@types/d3-time@3.0.4" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz"; + hash = "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="; + }; + "@types/d3-timer@3.0.2" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz"; + hash = "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="; + }; + "@types/estree@1.0.8" = fetchurl { + url = "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"; + hash = "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="; + }; + "@types/json-schema@7.0.15" = fetchurl { + url = "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"; + hash = "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="; + }; + "@types/node@25.0.3" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz"; + hash = "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="; + }; + "@types/react-dom@19.2.3" = fetchurl { + url = "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz"; + hash = "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="; + }; + "@types/react@19.2.7" = fetchurl { + url = "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz"; + hash = "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg=="; + }; + "@types/triple-beam@1.3.5" = fetchurl { + url = "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz"; + hash = "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="; + }; + "@types/use-sync-external-store@0.0.6" = fetchurl { + url = "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz"; + hash = "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="; + }; + "accepts@1.3.8" = fetchurl { + url = "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"; + hash = "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="; + }; + "ansi-colors@4.1.3" = fetchurl { + url = "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz"; + hash = "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="; + }; + "ansi-regex@6.2.2" = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"; + hash = "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="; + }; + "ansi-styles@6.2.3" = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz"; + hash = "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="; + }; + "anymatch@3.1.3" = fetchurl { + url = "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"; + hash = "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="; + }; + "arg@5.0.2" = fetchurl { + url = "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz"; + hash = "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="; + }; + "argparse@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"; + hash = "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="; + }; + "aria-hidden@1.2.6" = fetchurl { + url = "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz"; + hash = "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="; + }; + "arkregex@0.0.5" = fetchurl { + url = "https://registry.npmjs.org/arkregex/-/arkregex-0.0.5.tgz"; + hash = "sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw=="; + }; + "arktype@2.1.29" = fetchurl { + url = "https://registry.npmjs.org/arktype/-/arktype-2.1.29.tgz"; + hash = "sha512-jyfKk4xIOzvYNayqnD8ZJQqOwcrTOUbIU4293yrzAjA3O1dWh61j71ArMQ6tS/u4pD7vabSPe7nG3RCyoXW6RQ=="; + }; + "array-flatten@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"; + hash = "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="; + }; + "async@3.2.6" = fetchurl { + url = "https://registry.npmjs.org/async/-/async-3.2.6.tgz"; + hash = "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="; + }; + "babel-dead-code-elimination@1.0.11" = fetchurl { + url = "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.11.tgz"; + hash = "sha512-mwq3W3e/pKSI6TG8lXMiDWvEi1VXYlSBlJlB3l+I0bAb5u1RNUl88udos85eOPNK3m5EXK9uO7d2g08pesTySQ=="; + }; + "balanced-match@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"; + hash = "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="; + }; + "baseline-browser-mapping@2.9.11" = fetchurl { + url = "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz"; + hash = "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="; + }; + "basic-auth@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz"; + hash = "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="; + }; + "body-parser@1.20.4" = fetchurl { + url = "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz"; + hash = "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="; + }; + "brace-expansion@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz"; + hash = "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="; + }; + "browserslist@4.28.1" = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"; + hash = "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="; + }; + "buffer-from@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"; + hash = "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="; + }; + "bun-types@1.3.5" = fetchurl { + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz"; + hash = "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="; + }; + "bundle-name@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz"; + hash = "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="; + }; + "bytes@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"; + hash = "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="; + }; + "c12@3.3.2" = fetchurl { + url = "https://registry.npmjs.org/c12/-/c12-3.3.2.tgz"; + hash = "sha512-QkikB2X5voO1okL3QsES0N690Sn/K9WokXqUsDQsWy5SnYb+psYQFGA10iy1bZHj3fjISKsI67Q90gruvWWM3A=="; + }; + "cac@6.7.14" = fetchurl { + url = "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz"; + hash = "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="; + }; + "call-bind-apply-helpers@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"; + hash = "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="; + }; + "call-bound@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz"; + hash = "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="; + }; + "caniuse-lite@1.0.30001761" = fetchurl { + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz"; + hash = "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g=="; + }; + "chardet@2.1.1" = fetchurl { + url = "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz"; + hash = "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="; + }; + "chokidar@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz"; + hash = "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="; + }; + "citty@0.1.6" = fetchurl { + url = "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz"; + hash = "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="; + }; + "class-variance-authority@0.7.1" = fetchurl { + url = "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz"; + hash = "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="; + }; + "cli-width@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz"; + hash = "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="; + }; + "clsx@2.1.1" = fetchurl { + url = "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"; + hash = "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="; + }; + "color-convert@3.1.3" = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz"; + hash = "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="; + }; + "color-name@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz"; + hash = "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="; + }; + "color-string@2.1.4" = fetchurl { + url = "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz"; + hash = "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="; + }; + "color-support@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz"; + hash = "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="; + }; + "color@5.0.3" = fetchurl { + url = "https://registry.npmjs.org/color/-/color-5.0.3.tgz"; + hash = "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="; + }; + "commander@14.0.2" = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz"; + hash = "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="; + }; + "compressible@2.0.18" = fetchurl { + url = "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"; + hash = "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="; + }; + "compression@1.8.1" = fetchurl { + url = "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz"; + hash = "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="; + }; + "confbox@0.2.2" = fetchurl { + url = "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz"; + hash = "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="; + }; + "consola@3.4.2" = fetchurl { + url = "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz"; + hash = "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="; + }; + "content-disposition@0.5.4" = fetchurl { + url = "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"; + hash = "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="; + }; + "content-type@1.0.5" = fetchurl { + url = "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"; + hash = "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="; + }; + "convert-source-map@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"; + hash = "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="; + }; + "cookie-es@1.2.2" = fetchurl { + url = "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz"; + hash = "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="; + }; + "cookie-signature@1.0.7" = fetchurl { + url = "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz"; + hash = "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="; + }; + "cookie@0.7.2" = fetchurl { + url = "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz"; + hash = "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="; + }; + "cookie@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz"; + hash = "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="; + }; + "cron-parser@5.4.0" = fetchurl { + url = "https://registry.npmjs.org/cron-parser/-/cron-parser-5.4.0.tgz"; + hash = "sha512-HxYB8vTvnQFx4dLsZpGRa0uHp6X3qIzS3ZJgJ9v6l/5TJMgeWQbLkR5yiJ5hOxGbc9+jCADDnydIe15ReLZnJA=="; + }; + "cross-spawn@7.0.6" = fetchurl { + url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"; + hash = "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="; + }; + "crossws@0.3.5" = fetchurl { + url = "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz"; + hash = "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="; + }; + "csstype@3.2.3" = fetchurl { + url = "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"; + hash = "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="; + }; + "d3-array@3.2.4" = fetchurl { + url = "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"; + hash = "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="; + }; + "d3-color@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"; + hash = "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="; + }; + "d3-ease@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz"; + hash = "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="; + }; + "d3-format@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"; + hash = "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="; + }; + "d3-interpolate@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"; + hash = "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="; + }; + "d3-path@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"; + hash = "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="; + }; + "d3-scale@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz"; + hash = "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="; + }; + "d3-shape@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"; + hash = "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="; + }; + "d3-time-format@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"; + hash = "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="; + }; + "d3-time@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"; + hash = "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="; + }; + "d3-timer@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz"; + hash = "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="; + }; + "date-fns@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz"; + hash = "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="; + }; + "debug@2.6.9" = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"; + hash = "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="; + }; + "debug@4.4.3" = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"; + hash = "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="; + }; + "decimal.js-light@2.5.1" = fetchurl { + url = "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz"; + hash = "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="; + }; + "dedent@1.7.1" = fetchurl { + url = "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz"; + hash = "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="; + }; + "default-browser-id@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz"; + hash = "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="; + }; + "default-browser@5.4.0" = fetchurl { + url = "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz"; + hash = "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg=="; + }; + "define-lazy-prop@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz"; + hash = "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="; + }; + "defu@6.1.4" = fetchurl { + url = "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz"; + hash = "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="; + }; + "depd@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"; + hash = "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="; + }; + "destr@2.0.5" = fetchurl { + url = "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz"; + hash = "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="; + }; + "destroy@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"; + hash = "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="; + }; + "detect-libc@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"; + hash = "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="; + }; + "detect-node-es@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"; + hash = "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="; + }; + "dither-plugin@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/dither-plugin/-/dither-plugin-1.1.1.tgz"; + hash = "sha512-PsgAcSoNVKkwh+Q/OopRn/2qb9HW1LRyGqT1bQe8iooYvVY1FIIqePFN9JkEIVK9rkfZdj7nXn9EUB4B7mNh6g=="; + }; + "dotenv-cli@11.0.0" = fetchurl { + url = "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz"; + hash = "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww=="; + }; + "dotenv-expand@12.0.3" = fetchurl { + url = "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz"; + hash = "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA=="; + }; + "dotenv@16.6.1" = fetchurl { + url = "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz"; + hash = "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="; + }; + "dotenv@17.2.3" = fetchurl { + url = "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz"; + hash = "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="; + }; + "drizzle-kit@0.31.8" = fetchurl { + url = "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz"; + hash = "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg=="; + }; + "drizzle-orm@0.44.7" = fetchurl { + url = "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.7.tgz"; + hash = "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="; + }; + "dunder-proto@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"; + hash = "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="; + }; + "ee-first@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"; + hash = "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="; + }; + "electron-to-chromium@1.5.267" = fetchurl { + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz"; + hash = "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="; + }; + "emoji-regex@10.6.0" = fetchurl { + url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz"; + hash = "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="; + }; + "enabled@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz"; + hash = "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="; + }; + "encodeurl@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz"; + hash = "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="; + }; + "enhanced-resolve@5.18.4" = fetchurl { + url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz"; + hash = "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="; + }; + "es-define-property@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"; + hash = "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="; + }; + "es-errors@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"; + hash = "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="; + }; + "es-module-lexer@1.7.0" = fetchurl { + url = "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz"; + hash = "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="; + }; + "es-object-atoms@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"; + hash = "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="; + }; + "es-toolkit@1.43.0" = fetchurl { + url = "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.43.0.tgz"; + hash = "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA=="; + }; + "esbuild-register@3.6.0" = fetchurl { + url = "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz"; + hash = "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="; + }; + "esbuild@0.27.2" = fetchurl { + url = "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz"; + hash = "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="; + }; + "escalade@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"; + hash = "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="; + }; + "escape-html@1.0.3" = fetchurl { + url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"; + hash = "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="; + }; + "etag@1.8.1" = fetchurl { + url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"; + hash = "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="; + }; + "eventemitter3@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz"; + hash = "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="; + }; + "exit-hook@2.2.1" = fetchurl { + url = "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz"; + hash = "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="; + }; + "express@4.22.1" = fetchurl { + url = "https://registry.npmjs.org/express/-/express-4.22.1.tgz"; + hash = "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="; + }; + "exsolve@1.0.8" = fetchurl { + url = "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz"; + hash = "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="; + }; + "fdir@6.5.0" = fetchurl { + url = "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"; + hash = "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="; + }; + "fecha@4.2.3" = fetchurl { + url = "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz"; + hash = "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="; + }; + "finalhandler@1.3.2" = fetchurl { + url = "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz"; + hash = "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="; + }; + "fn.name@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz"; + hash = "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="; + }; + "forwarded@0.2.0" = fetchurl { + url = "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"; + hash = "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="; + }; + "fresh@0.5.2" = fetchurl { + url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"; + hash = "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="; + }; + "fsevents@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"; + hash = "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="; + }; + "function-bind@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"; + hash = "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="; + }; + "gensync@1.0.0-beta.2" = fetchurl { + url = "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"; + hash = "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="; + }; + "get-east-asian-width@1.4.0" = fetchurl { + url = "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz"; + hash = "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="; + }; + "get-intrinsic@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"; + hash = "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="; + }; + "get-nonce@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz"; + hash = "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="; + }; + "get-port@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz"; + hash = "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ=="; + }; + "get-proto@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"; + hash = "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="; + }; + "get-tsconfig@4.13.0" = fetchurl { + url = "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz"; + hash = "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="; + }; + "giget@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz"; + hash = "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="; + }; + "globrex@0.1.2" = fetchurl { + url = "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz"; + hash = "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="; + }; + "gopd@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"; + hash = "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="; + }; + "graceful-fs@4.2.11" = fetchurl { + url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"; + hash = "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="; + }; + "h3@1.15.4" = fetchurl { + url = "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz"; + hash = "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ=="; + }; + "has-symbols@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"; + hash = "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="; + }; + "hasown@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"; + hash = "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="; + }; + "hono-openapi@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/hono-openapi/-/hono-openapi-1.1.2.tgz"; + hash = "sha512-toUcO60MftRBxqcVyxsHNYs2m4vf4xkQaiARAucQx3TiBPDtMNNkoh+C4I1vAretQZiGyaLOZNWn1YxfSyUA5g=="; + }; + "hono-rate-limiter@0.5.1" = fetchurl { + url = "https://registry.npmjs.org/hono-rate-limiter/-/hono-rate-limiter-0.5.1.tgz"; + hash = "sha512-c3bUn6IRgFKjlouvRNBy+ZIPZ2CTyTt3fc0uat2bv3GiHmLM4jI0QJ6fHd3Tf4R6dO2sX2Uvl9Gtp+kny4KdXg=="; + }; + "hono@4.10.5" = fetchurl { + url = "https://registry.npmjs.org/hono/-/hono-4.10.5.tgz"; + hash = "sha512-h/MXuTkoAK8NG1EfDp0jI1YLf6yGdDnfkebRO2pwEh5+hE3RAJFXkCsnD0vamSiARK4ZrB6MY+o3E/hCnOyHrQ=="; + }; + "http-errors-enhanced@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/http-errors-enhanced/-/http-errors-enhanced-4.0.2.tgz"; + hash = "sha512-5EXN1gmhJVvuWpNfz+RclWvLnnENEXNMPfww3gm30H9mQzPF4QSBj/MD5FRkVDxGIUhO/cR2GSLCd/6C6xpBcw=="; + }; + "http-errors@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz"; + hash = "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="; + }; + "iconv-lite@0.4.24" = fetchurl { + url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"; + hash = "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="; + }; + "iconv-lite@0.7.1" = fetchurl { + url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz"; + hash = "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="; + }; + "immer@10.2.0" = fetchurl { + url = "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz"; + hash = "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="; + }; + "immer@11.1.0" = fetchurl { + url = "https://registry.npmjs.org/immer/-/immer-11.1.0.tgz"; + hash = "sha512-dlzb07f5LDY+tzs+iLCSXV2yuhaYfezqyZQc+n6baLECWkOMEWxkECAOnXL0ba7lsA25fM9b2jtzpu/uxo1a7g=="; + }; + "inherits@2.0.4" = fetchurl { + url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"; + hash = "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="; + }; + "internmap@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"; + hash = "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="; + }; + "ipaddr.js@1.9.1" = fetchurl { + url = "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"; + hash = "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="; + }; + "iron-webcrypto@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz"; + hash = "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="; + }; + "is-docker@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"; + hash = "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="; + }; + "is-in-ssh@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz"; + hash = "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="; + }; + "is-inside-container@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz"; + hash = "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="; + }; + "is-stream@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"; + hash = "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="; + }; + "is-wsl@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz"; + hash = "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="; + }; + "isbot@5.1.32" = fetchurl { + url = "https://registry.npmjs.org/isbot/-/isbot-5.1.32.tgz"; + hash = "sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ=="; + }; + "isexe@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"; + hash = "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="; + }; + "jiti@2.6.1" = fetchurl { + url = "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"; + hash = "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="; + }; + "js-tokens@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + hash = "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + "js-yaml@4.1.1" = fetchurl { + url = "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"; + hash = "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="; + }; + "jsesc@3.0.2" = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz"; + hash = "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="; + }; + "json5@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"; + hash = "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="; + }; + "kuler@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz"; + hash = "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="; + }; + "lightningcss-android-arm64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz"; + hash = "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="; + }; + "lightningcss-darwin-arm64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz"; + hash = "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="; + }; + "lightningcss-darwin-x64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz"; + hash = "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="; + }; + "lightningcss-freebsd-x64@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz"; + hash = "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="; + }; + "lightningcss-linux-arm-gnueabihf@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz"; + hash = "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="; + }; + "lightningcss-linux-arm64-gnu@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz"; + hash = "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="; + }; + "lightningcss-linux-arm64-musl@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz"; + hash = "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="; + }; + "lightningcss-linux-x64-gnu@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz"; + hash = "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="; + }; + "lightningcss-linux-x64-musl@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz"; + hash = "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="; + }; + "lightningcss-win32-arm64-msvc@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz"; + hash = "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="; + }; + "lightningcss-win32-x64-msvc@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz"; + hash = "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="; + }; + "lightningcss@1.30.2" = fetchurl { + url = "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz"; + hash = "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="; + }; + "lodash@4.17.21" = fetchurl { + url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"; + hash = "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="; + }; + "logform@2.7.0" = fetchurl { + url = "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz"; + hash = "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="; + }; + "lru-cache@10.4.3" = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"; + hash = "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="; + }; + "lru-cache@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"; + hash = "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="; + }; + "lucide-react@0.555.0" = fetchurl { + url = "https://registry.npmjs.org/lucide-react/-/lucide-react-0.555.0.tgz"; + hash = "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA=="; + }; + "luxon@3.7.2" = fetchurl { + url = "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz"; + hash = "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="; + }; + "magic-string@0.30.21" = fetchurl { + url = "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"; + hash = "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="; + }; + "math-intrinsics@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"; + hash = "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="; + }; + "media-typer@0.3.0" = fetchurl { + url = "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"; + hash = "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="; + }; + "merge-descriptors@1.0.3" = fetchurl { + url = "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz"; + hash = "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="; + }; + "methods@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"; + hash = "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="; + }; + "mime-db@1.52.0" = fetchurl { + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"; + hash = "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="; + }; + "mime-db@1.54.0" = fetchurl { + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"; + hash = "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="; + }; + "mime-types@2.1.35" = fetchurl { + url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"; + hash = "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="; + }; + "mime@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"; + hash = "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; + }; + "minimatch@9.0.5" = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"; + hash = "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="; + }; + "minimist@1.2.8" = fetchurl { + url = "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"; + hash = "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="; + }; + "morgan@1.10.1" = fetchurl { + url = "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz"; + hash = "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A=="; + }; + "ms@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"; + hash = "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="; + }; + "ms@2.1.3" = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"; + hash = "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="; + }; + "mute-stream@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz"; + hash = "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="; + }; + "nanoid@3.3.11" = fetchurl { + url = "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"; + hash = "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="; + }; + "nanoid@5.1.5" = fetchurl { + url = "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz"; + hash = "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="; + }; + "negotiator@0.6.3" = fetchurl { + url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"; + hash = "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="; + }; + "negotiator@0.6.4" = fetchurl { + url = "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"; + hash = "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="; + }; + "next-themes@0.4.6" = fetchurl { + url = "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz"; + hash = "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="; + }; + "node-cron@4.2.1" = fetchurl { + url = "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz"; + hash = "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg=="; + }; + "node-fetch-native@1.6.7" = fetchurl { + url = "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz"; + hash = "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="; + }; + "node-mock-http@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz"; + hash = "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="; + }; + "node-releases@2.0.27" = fetchurl { + url = "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz"; + hash = "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="; + }; + "normalize-path@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"; + hash = "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="; + }; + "nypm@0.6.2" = fetchurl { + url = "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz"; + hash = "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="; + }; + "object-inspect@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz"; + hash = "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="; + }; + "ofetch@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz"; + hash = "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="; + }; + "ohash@2.0.11" = fetchurl { + url = "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz"; + hash = "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="; + }; + "on-finished@2.3.0" = fetchurl { + url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"; + hash = "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="; + }; + "on-finished@2.4.1" = fetchurl { + url = "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"; + hash = "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="; + }; + "on-headers@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz"; + hash = "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="; + }; + "one-time@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz"; + hash = "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="; + }; + "open@11.0.0" = fetchurl { + url = "https://registry.npmjs.org/open/-/open-11.0.0.tgz"; + hash = "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="; + }; + "openapi-types@12.1.3" = fetchurl { + url = "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz"; + hash = "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="; + }; + "p-map@7.0.4" = fetchurl { + url = "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz"; + hash = "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="; + }; + "parseurl@1.3.3" = fetchurl { + url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"; + hash = "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="; + }; + "path-key@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"; + hash = "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="; + }; + "path-to-regexp@0.1.12" = fetchurl { + url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz"; + hash = "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="; + }; + "pathe@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz"; + hash = "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="; + }; + "pathe@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz"; + hash = "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="; + }; + "perfect-debounce@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz"; + hash = "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow=="; + }; + "picocolors@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"; + hash = "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="; + }; + "picomatch@2.3.1" = fetchurl { + url = "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"; + hash = "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="; + }; + "picomatch@4.0.3" = fetchurl { + url = "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"; + hash = "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="; + }; + "pkg-types@2.3.0" = fetchurl { + url = "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz"; + hash = "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="; + }; + "postcss@8.5.6" = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"; + hash = "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="; + }; + "powershell-utils@0.1.0" = fetchurl { + url = "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz"; + hash = "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="; + }; + "prettier@3.7.4" = fetchurl { + url = "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz"; + hash = "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="; + }; + "proxy-addr@2.0.7" = fetchurl { + url = "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"; + hash = "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="; + }; + "qs@6.14.0" = fetchurl { + url = "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz"; + hash = "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="; + }; + "quansync@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz"; + hash = "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="; + }; + "radix3@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz"; + hash = "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="; + }; + "range-parser@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"; + hash = "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="; + }; + "raw-body@2.5.3" = fetchurl { + url = "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz"; + hash = "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="; + }; + "rc9@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz"; + hash = "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="; + }; + "react-dom@19.2.3" = fetchurl { + url = "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz"; + hash = "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="; + }; + "react-hook-form@7.69.0" = fetchurl { + url = "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.69.0.tgz"; + hash = "sha512-yt6ZGME9f4F6WHwevrvpAjh42HMvocuSnSIHUGycBqXIJdhqGSPQzTpGF+1NLREk/58IdPxEMfPcFCjlMhclGw=="; + }; + "react-is@19.2.3" = fetchurl { + url = "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz"; + hash = "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA=="; + }; + "react-redux@9.2.0" = fetchurl { + url = "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"; + hash = "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="; + }; + "react-refresh@0.14.2" = fetchurl { + url = "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz"; + hash = "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="; + }; + "react-remove-scroll-bar@2.3.8" = fetchurl { + url = "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz"; + hash = "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="; + }; + "react-remove-scroll@2.7.2" = fetchurl { + url = "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz"; + hash = "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="; + }; + "react-router-hono-server@2.22.0" = fetchurl { + url = "https://registry.npmjs.org/react-router-hono-server/-/react-router-hono-server-2.22.0.tgz"; + hash = "sha512-XPJp1PQtkjHsFrneUdvmv22o7LPBGYEW11KtTDEmpXQINW5ViwpzUuwb0/eGjZ9E4RQh6AOKYsXA4+QIqXTkrQ=="; + }; + "react-router@7.11.0" = fetchurl { + url = "https://registry.npmjs.org/react-router/-/react-router-7.11.0.tgz"; + hash = "sha512-uI4JkMmjbWCZc01WVP2cH7ZfSzH91JAZUDd7/nIprDgWxBV1TkkmLToFh7EbMTcMak8URFRa2YoBL/W8GWnCTQ=="; + }; + "react-style-singleton@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz"; + hash = "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="; + }; + "react@19.2.3" = fetchurl { + url = "https://registry.npmjs.org/react/-/react-19.2.3.tgz"; + hash = "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="; + }; + "readable-stream@3.6.2" = fetchurl { + url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"; + hash = "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="; + }; + "readdirp@4.1.2" = fetchurl { + url = "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz"; + hash = "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="; + }; + "recharts@3.5.1" = fetchurl { + url = "https://registry.npmjs.org/recharts/-/recharts-3.5.1.tgz"; + hash = "sha512-+v+HJojK7gnEgG6h+b2u7k8HH7FhyFUzAc4+cPrsjL4Otdgqr/ecXzAnHciqlzV1ko064eNcsdzrYOM78kankA=="; + }; + "redux-thunk@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz"; + hash = "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="; + }; + "redux@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"; + hash = "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="; + }; + "reselect@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"; + hash = "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="; + }; + "resolve-pkg-maps@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz"; + hash = "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="; + }; + "rollup@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz"; + hash = "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="; + }; + "run-applescript@7.1.0" = fetchurl { + url = "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz"; + hash = "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="; + }; + "safe-buffer@5.1.2" = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"; + hash = "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="; + }; + "safe-buffer@5.2.1" = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"; + hash = "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="; + }; + "safe-stable-stringify@2.5.0" = fetchurl { + url = "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz"; + hash = "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="; + }; + "safer-buffer@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"; + hash = "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="; + }; + "scheduler@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"; + hash = "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="; + }; + "semver@6.3.1" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"; + hash = "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="; + }; + "semver@7.7.2" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"; + hash = "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="; + }; + "send@0.19.2" = fetchurl { + url = "https://registry.npmjs.org/send/-/send-0.19.2.tgz"; + hash = "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="; + }; + "serve-static@1.16.3" = fetchurl { + url = "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz"; + hash = "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="; + }; + "set-cookie-parser@2.7.2" = fetchurl { + url = "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"; + hash = "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="; + }; + "setprototypeof@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"; + hash = "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="; + }; + "shebang-command@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"; + hash = "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="; + }; + "shebang-regex@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"; + hash = "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="; + }; + "side-channel-list@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz"; + hash = "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="; + }; + "side-channel-map@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz"; + hash = "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="; + }; + "side-channel-weakmap@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz"; + hash = "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="; + }; + "side-channel@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz"; + hash = "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="; + }; + "signal-exit@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"; + hash = "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="; + }; + "slugify@1.6.6" = fetchurl { + url = "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz"; + hash = "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="; + }; + "sonner@2.0.7" = fetchurl { + url = "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz"; + hash = "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="; + }; + "source-map-js@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"; + hash = "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="; + }; + "source-map-support@0.5.21" = fetchurl { + url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"; + hash = "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="; + }; + "source-map@0.6.1" = fetchurl { + url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"; + hash = "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="; + }; + "stack-trace@0.0.10" = fetchurl { + url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz"; + hash = "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="; + }; + "statuses@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz"; + hash = "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="; + }; + "string-width@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz"; + hash = "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="; + }; + "string_decoder@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"; + hash = "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="; + }; + "strip-ansi@7.1.2" = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz"; + hash = "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="; + }; + "tagged-tag@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz"; + hash = "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="; + }; + "tailwind-merge@3.4.0" = fetchurl { + url = "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz"; + hash = "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="; + }; + "tailwindcss@4.1.18" = fetchurl { + url = "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz"; + hash = "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="; + }; + "tapable@2.3.0" = fetchurl { + url = "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz"; + hash = "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="; + }; + "text-hex@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz"; + hash = "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="; + }; + "tiny-invariant@1.3.3" = fetchurl { + url = "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"; + hash = "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="; + }; + "tiny-typed-emitter@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz"; + hash = "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="; + }; + "tinyexec@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz"; + hash = "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="; + }; + "tinyglobby@0.2.15" = fetchurl { + url = "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"; + hash = "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="; + }; + "toidentifier@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"; + hash = "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="; + }; + "triple-beam@1.4.1" = fetchurl { + url = "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz"; + hash = "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="; + }; + "tsconfck@3.1.6" = fetchurl { + url = "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz"; + hash = "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="; + }; + "tslib@2.8.1" = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; + hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; + }; + "tw-animate-css@1.4.0" = fetchurl { + url = "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz"; + hash = "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="; + }; + "type-fest@5.0.0" = fetchurl { + url = "https://registry.npmjs.org/type-fest/-/type-fest-5.0.0.tgz"; + hash = "sha512-GeJop7+u7BYlQ6yQCAY1nBQiRSHR+6OdCEtd8Bwp9a3NK3+fWAVjOaPKJDteB9f6cIJ0wt4IfnScjLG450EpXA=="; + }; + "type-is@1.6.18" = fetchurl { + url = "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"; + hash = "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="; + }; + "typescript@5.9.3" = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; + hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; + }; + "ufo@1.6.1" = fetchurl { + url = "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz"; + hash = "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="; + }; + "uncrypto@0.1.3" = fetchurl { + url = "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz"; + hash = "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="; + }; + "undici-types@7.16.0" = fetchurl { + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + }; + "unpipe@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"; + hash = "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="; + }; + "unstorage@1.17.3" = fetchurl { + url = "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz"; + hash = "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q=="; + }; + "update-browserslist-db@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"; + hash = "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="; + }; + "use-callback-ref@1.3.3" = fetchurl { + url = "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz"; + hash = "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="; + }; + "use-sidecar@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz"; + hash = "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="; + }; + "use-sync-external-store@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"; + hash = "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="; + }; + "util-deprecate@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"; + hash = "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="; + }; + "utils-merge@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"; + hash = "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="; + }; + "valibot@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz"; + hash = "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg=="; + }; + "vary@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"; + hash = "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="; + }; + "victory-vendor@37.3.6" = fetchurl { + url = "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz"; + hash = "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="; + }; + "vite-bundle-analyzer@1.3.2" = fetchurl { + url = "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-1.3.2.tgz"; + hash = "sha512-Od4ILUKRvBV3LuO/E+S+c1XULlxdkRZPSf6Vzzu+UAXG0D3hZYUu9imZIkSj/PU4e1FB14yB+av8g3KiljH8zQ=="; + }; + "vite-node@3.2.4" = fetchurl { + url = "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz"; + hash = "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="; + }; + "vite-tsconfig-paths@6.0.3" = fetchurl { + url = "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.0.3.tgz"; + hash = "sha512-7bL7FPX/DSviaZGYUKowWF1AiDVWjMjxNbE8lyaVGDezkedWqfGhlnQ4BZXre0ZN5P4kAgIJfAlgFDVyjrCIyg=="; + }; + "vite@7.3.0" = fetchurl { + url = "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz"; + hash = "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg=="; + }; + "which@2.0.2" = fetchurl { + url = "https://registry.npmjs.org/which/-/which-2.0.2.tgz"; + hash = "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="; + }; + "winston-transport@4.9.0" = fetchurl { + url = "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz"; + hash = "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="; + }; + "winston@3.19.0" = fetchurl { + url = "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz"; + hash = "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA=="; + }; + "wrap-ansi@9.0.2" = fetchurl { + url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz"; + hash = "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="; + }; + "ws@8.18.3" = fetchurl { + url = "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz"; + hash = "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="; + }; + "wsl-utils@0.3.0" = fetchurl { + url = "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.0.tgz"; + hash = "sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ=="; + }; + "yallist@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"; + hash = "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="; + }; + "yaml@2.8.2" = fetchurl { + url = "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz"; + hash = "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="; + }; + "zod@4.2.1" = fetchurl { + url = "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz"; + hash = "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw=="; + }; +} \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..74dcaad7 --- /dev/null +++ b/flake.lock @@ -0,0 +1,170 @@ +{ + "nodes": { + "bun2nix": { + "inputs": { + "flake-parts": "flake-parts", + "import-tree": "import-tree", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1765198123, + "narHash": "sha256-pkahE6wwIszQ8e107qa95wyNr4Qj94hEdL9fA/IE288=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "29d2c26c269b2bc7d8885c6a2fc90ec0fc86ec40", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "bun2nix", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1763759067, + "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "import-tree": { + "locked": { + "lastModified": 1763762820, + "narHash": "sha256-ZvYKbFib3AEwiNMLsejb/CWs/OL/srFQ8AogkebEPF0=", + "owner": "vic", + "repo": "import-tree", + "rev": "3c23749d8013ec6daa1d7255057590e9ca726646", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "import-tree", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1766651565, + "narHash": "sha256-QEhk0eXgyIqTpJ/ehZKg9IKS7EtlWxF3N7DXy42zPfU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1761765539, + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "root": { + "inputs": { + "bun2nix": "bun2nix", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "bun2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762938485, + "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..475bf734 --- /dev/null +++ b/flake.nix @@ -0,0 +1,535 @@ +{ + description = "Zerobyte - Self-hosted backup automation and management"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + bun2nix.url = "github:nix-community/bun2nix"; + bun2nix.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, flake-utils, bun2nix }: + let + # Systems for packages and devShells + allSystems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + + # Linux-only systems for NixOS module and tests + linuxSystems = [ + "x86_64-linux" + "aarch64-linux" + ]; + + # shoutrrr version and hashes (SRI format) + shoutrrrVersion = "0.13.1"; + shoutrrrHashes = { + x86_64-linux = "sha256-TZrDstm5InQOalYf9da5rhnsJm7qTnmG18jLJtvsD8A="; + aarch64-linux = "sha256-IHgZhsykJbmW/uYUsd6o7Wh3EIsUldduIKFZ0GkjrwI="; + x86_64-darwin = "sha256-pzmAGRzbWYVHoZqvx6tsuxpuKcfIXMVNPXbKHeeAyxs="; + aarch64-darwin = "sha256-DKQRzdDd1xccNqetscEKKzgyT1IatOlwPBwa4E8fbDc="; + }; + + # Map Nix system to shoutrrr release naming + shoutrrrArch = { + x86_64-linux = "linux_amd64"; + aarch64-linux = "linux_arm64v8"; + x86_64-darwin = "macOS_amd64"; + aarch64-darwin = "macOS_arm64v8"; + }; + + # Check if system is Linux + isLinux = system: builtins.elem system linuxSystems; + + in + flake-utils.lib.eachSystem allSystems (system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = [ bun2nix.overlays.default ]; + }; + + shoutrrr = pkgs.stdenv.mkDerivation { + pname = "shoutrrr"; + version = shoutrrrVersion; + + src = pkgs.fetchurl { + url = "https://github.com/nicholas-fedor/shoutrrr/releases/download/v${shoutrrrVersion}/shoutrrr_${shoutrrrArch.${system}}_${shoutrrrVersion}.tar.gz"; + hash = shoutrrrHashes.${system}; + }; + + sourceRoot = "."; + + nativeBuildInputs = pkgs.lib.optionals (isLinux system) [ pkgs.autoPatchelfHook ]; + + installPhase = '' + runHook preInstall + install -Dm755 shoutrrr $out/bin/shoutrrr + runHook postInstall + ''; + + meta = with pkgs.lib; { + description = "Notification library and CLI for various services"; + homepage = "https://github.com/nicholas-fedor/shoutrrr"; + license = licenses.mit; + platforms = platforms.unix; + }; + }; + + # Read version from package.json to avoid drift + packageJson = builtins.fromJSON (builtins.readFile ./package.json); + + zerobyte = pkgs.stdenv.mkDerivation { + pname = "zerobyte"; + version = packageJson.version or "0.0.0"; + + src = pkgs.lib.cleanSource ./.; + + nativeBuildInputs = [ + pkgs.bun2nix.hook + pkgs.makeWrapper + ]; + + # Fetch bun dependencies using bun2nix + bunDeps = pkgs.bun2nix.fetchBunDeps { + bunNix = ./bun.nix; + }; + + buildPhase = '' + runHook preBuild + + export HOME=$(mktemp -d) + + # Build the application (react-router build) + bun run build + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + # Create output directories matching the expected structure + mkdir -p $out/lib/zerobyte/dist + mkdir -p $out/lib/zerobyte/drizzle + mkdir -p $out/bin + + # Copy built assets (server expects dist/server and dist/client) + cp -r dist/server $out/lib/zerobyte/dist/server + cp -r dist/client $out/lib/zerobyte/dist/client + cp -r app/drizzle/* $out/lib/zerobyte/drizzle/ + cp package.json $out/lib/zerobyte/ + + # Copy node_modules for runtime dependencies + cp -r node_modules $out/lib/zerobyte/ + + # Create wrapper script with runtime dependencies + # --chdir ensures server finds dist/client relative to package dir + makeWrapper ${pkgs.bun}/bin/bun $out/bin/zerobyte \ + --chdir $out/lib/zerobyte \ + --add-flags "dist/server/index.js" \ + --prefix PATH : ${pkgs.lib.makeBinPath ([ + pkgs.restic + pkgs.rclone + shoutrrr + pkgs.openssh + ] ++ pkgs.lib.optionals (isLinux system) [ + pkgs.fuse3 + pkgs.davfs2 + ])} \ + --set NODE_ENV "production" + + runHook postInstall + ''; + + meta = with pkgs.lib; { + description = "Self-hosted backup automation and management"; + homepage = "https://github.com/nicotsx/zerobyte"; + license = licenses.mit; + platforms = platforms.unix; + mainProgram = "zerobyte"; + }; + }; + + in + { + packages = { + inherit zerobyte shoutrrr; + default = zerobyte; + }; + + devShells.default = pkgs.mkShell { + buildInputs = [ + # JavaScript runtime and package manager + pkgs.bun + pkgs.nodejs + + # Development tools + pkgs.biome + pkgs.typescript + + # bun2nix CLI for regenerating bun.nix + bun2nix.packages.${system}.bun2nix + + # External tools (for local testing) + pkgs.restic + pkgs.rclone + shoutrrr + + # Database tools + pkgs.sqlite + + # Utilities + pkgs.git + pkgs.curl + pkgs.jq + ]; + + shellHook = '' + echo "Zerobyte development environment" + echo " bun: $(bun --version)" + echo " node: $(node --version)" + echo " restic: $(restic version | head -1)" + echo " rclone: $(rclone version | head -1)" + echo "" + echo "To update bun.nix after changing dependencies:" + echo " bun2nix -o bun.nix" + ''; + }; + } + ) // { + # Overlay + overlays.default = final: prev: { + zerobyte = self.packages.${final.system}.zerobyte; + shoutrrr = self.packages.${final.system}.shoutrrr; + }; + + # NixOS Module + nixosModules.default = { config, lib, pkgs, ... }: + let + cfg = config.services.zerobyte; + in + { + options.services.zerobyte = { + enable = lib.mkEnableOption "Zerobyte backup management service"; + + package = lib.mkOption { + type = lib.types.package; + default = self.packages.${pkgs.system}.zerobyte; + defaultText = lib.literalExpression "pkgs.zerobyte"; + description = "The Zerobyte package to use."; + }; + + user = lib.mkOption { + type = lib.types.str; + default = "zerobyte"; + description = "User account under which Zerobyte runs."; + }; + + group = lib.mkOption { + type = lib.types.str; + default = "zerobyte"; + description = "Group under which Zerobyte runs."; + }; + + createUser = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Whether to create the user and group automatically. + Set to false if using an existing user account. + ''; + }; + + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/zerobyte"; + description = "Directory to store Zerobyte data."; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 4096; + description = "Port on which Zerobyte listens."; + }; + + openFirewall = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether to open the firewall for Zerobyte."; + }; + + serverIp = lib.mkOption { + type = lib.types.str; + default = "0.0.0.0"; + description = "IP address to bind the server to."; + }; + + timezone = lib.mkOption { + type = lib.types.str; + default = "UTC"; + description = "Timezone for scheduling backups."; + }; + + resticHostname = lib.mkOption { + type = lib.types.str; + default = "zerobyte"; + description = "Hostname used for restic operations."; + }; + + environment = lib.mkOption { + type = lib.types.attrsOf lib.types.str; + default = {}; + description = "Additional environment variables for Zerobyte."; + }; + + fuse = { + enable = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Enable FUSE mounting capabilities. + Requires CAP_SYS_ADMIN and access to /dev/fuse. + Enables NFS, SMB, and WebDAV volume mounts. + ''; + }; + }; + + protectHome = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Enable ProtectHome systemd security hardening. + When true, /home, /root, and /run/user are inaccessible. + Set to false if you need to backup home directories. + ''; + }; + + extraReadWritePaths = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + example = [ "/mnt/storage" "/backup" ]; + description = '' + Additional paths the service can write to. + Use this for custom repository locations outside of dataDir. + Required because ProtectSystem=strict makes the filesystem read-only. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + users.users.${cfg.user} = lib.mkIf cfg.createUser { + isSystemUser = true; + group = cfg.group; + home = cfg.dataDir; + createHome = true; + description = "Zerobyte service user"; + }; + + users.groups.${cfg.group} = lib.mkIf cfg.createUser {}; + + systemd.services.zerobyte = { + description = "Zerobyte backup management service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + environment = { + NODE_ENV = "production"; + PORT = toString cfg.port; + SERVER_IP = cfg.serverIp; + RESTIC_HOSTNAME = cfg.resticHostname; + DATABASE_URL = "${cfg.dataDir}/data/zerobyte.db"; + MIGRATIONS_PATH = "${cfg.package}/lib/zerobyte/drizzle"; + TZ = cfg.timezone; + } // cfg.environment; + + serviceConfig = { + Type = "simple"; + User = cfg.user; + Group = cfg.group; + ExecStart = "${cfg.package}/bin/zerobyte"; + Restart = "on-failure"; + RestartSec = 5; + + # State directory + StateDirectory = "zerobyte"; + StateDirectoryMode = "0750"; + WorkingDirectory = cfg.dataDir; + + # Capabilities + # - CAP_SYS_ADMIN: Required for FUSE mounts + # - CAP_DAC_READ_SEARCH: Required to read restricted directories (e.g., 700 home dirs) + # - CAP_DAC_OVERRIDE: Required to write to directories not owned by service user + AmbientCapabilities = + lib.optional cfg.fuse.enable "CAP_SYS_ADMIN" + ++ lib.optional (!cfg.protectHome) "CAP_DAC_READ_SEARCH" + ++ lib.optional (cfg.extraReadWritePaths != []) "CAP_DAC_OVERRIDE"; + CapabilityBoundingSet = + lib.optional cfg.fuse.enable "CAP_SYS_ADMIN" + ++ lib.optional (!cfg.protectHome) "CAP_DAC_READ_SEARCH" + ++ lib.optional (cfg.extraReadWritePaths != []) "CAP_DAC_OVERRIDE"; + DeviceAllow = lib.mkIf cfg.fuse.enable [ "/dev/fuse rw" ]; + + # Security hardening + PrivateTmp = true; + ProtectSystem = "strict"; + ProtectHome = cfg.protectHome; + # Disable when capabilities are needed (FUSE, home access, or extra write paths) + NoNewPrivileges = !cfg.fuse.enable && cfg.protectHome && cfg.extraReadWritePaths == []; + ProtectKernelTunables = true; + ProtectKernelModules = true; + ProtectControlGroups = true; + RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ]; + RestrictNamespaces = !cfg.fuse.enable; + LockPersonality = true; + MemoryDenyWriteExecute = false; # Required for bun/V8 + RestrictRealtime = true; + RestrictSUIDSGID = true; + RemoveIPC = true; + PrivateMounts = !cfg.fuse.enable; + + # Allow write access to data directory + ReadWritePaths = [ cfg.dataDir ] ++ cfg.extraReadWritePaths; + }; + }; + + networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ cfg.port ]; + }; + }; + + # nix-darwin Module (macOS) - EXPERIMENTAL/FUTURE USE + # macOS lacks Linux capabilities (CAP_DAC_READ_SEARCH, etc.) and uses TCC + # (Transparency, Consent, and Control) which blocks access to ~/Desktop, + # ~/Documents, etc. even for root. Full support requires significant code + # changes to handle TCC permission grants via System Preferences. + darwinModules.default = { config, lib, pkgs, ... }: + let + cfg = config.services.zerobyte; + in + { + options.services.zerobyte = { + enable = lib.mkEnableOption "Zerobyte backup management service"; + + package = lib.mkOption { + type = lib.types.package; + default = self.packages.${pkgs.system}.zerobyte; + defaultText = lib.literalExpression "pkgs.zerobyte"; + description = "The Zerobyte package to use."; + }; + + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/zerobyte"; + description = "Directory to store Zerobyte data."; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 4096; + description = "Port on which Zerobyte listens."; + }; + + serverIp = lib.mkOption { + type = lib.types.str; + default = "0.0.0.0"; + description = "IP address to bind the server to."; + }; + + timezone = lib.mkOption { + type = lib.types.str; + default = "UTC"; + description = "Timezone for scheduling backups."; + }; + + resticHostname = lib.mkOption { + type = lib.types.str; + default = "zerobyte"; + description = "Hostname used for restic operations."; + }; + + environment = lib.mkOption { + type = lib.types.attrsOf lib.types.str; + default = {}; + description = "Additional environment variables for Zerobyte."; + }; + }; + + config = lib.mkIf cfg.enable { + # Create data directory + system.activationScripts.zerobyte.text = '' + mkdir -p ${cfg.dataDir}/data + chmod 750 ${cfg.dataDir} + ''; + + launchd.daemons.zerobyte = { + serviceConfig = { + Label = "org.zerobyte.daemon"; + ProgramArguments = [ "${cfg.package}/bin/zerobyte" ]; + RunAtLoad = true; + KeepAlive = true; + WorkingDirectory = "${cfg.dataDir}"; + + EnvironmentVariables = { + NODE_ENV = "production"; + PORT = toString cfg.port; + SERVER_IP = cfg.serverIp; + RESTIC_HOSTNAME = cfg.resticHostname; + DATABASE_URL = "${cfg.dataDir}/data/zerobyte.db"; + MIGRATIONS_PATH = "${cfg.package}/lib/zerobyte/drizzle"; + TZ = cfg.timezone; + } // cfg.environment; + + StandardOutPath = "/var/log/zerobyte.log"; + StandardErrorPath = "/var/log/zerobyte.error.log"; + }; + }; + }; + }; + + # NixOS VM Tests (Linux only) + checks = builtins.listToAttrs (map (system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + name = system; + value = { + integration = pkgs.testers.nixosTest { + name = "zerobyte-integration"; + + nodes.machine = { config, pkgs, ... }: { + imports = [ self.nixosModules.default ]; + + services.zerobyte = { + enable = true; + openFirewall = true; + }; + + # Ensure the test VM has enough resources + virtualisation = { + memorySize = 1024; + diskSize = 2048; + }; + }; + + testScript = '' + machine.start() + machine.wait_for_unit("zerobyte.service") + machine.wait_for_open_port(4096) + + # Test healthcheck endpoint (returns {"status":"ok"}) + result = machine.succeed("curl -s http://localhost:4096/healthcheck") + assert '"status":"ok"' in result or '"ok"' in result, f"Healthcheck failed: {result}" + + machine.log("Zerobyte integration test passed!") + ''; + }; + }; + } + ) linuxSystems); + }; +} diff --git a/package.json b/package.json index 2edcbfeb..beac4fe0 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,11 @@ "@react-router/node": "^7.10.0", "@react-router/serve": "^7.10.0", "@scalar/hono-api-reference": "^0.9.25", + "@standard-community/standard-json": "^0.3.5", + "@standard-community/standard-openapi": "^0.2.9", + "@standard-schema/spec": "^1.1.0", "@tanstack/react-query": "^5.90.11", + "@types/json-schema": "^7.0.15", "arktype": "^2.1.28", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -62,9 +66,12 @@ "lucide-react": "^0.555.0", "next-themes": "^0.4.6", "node-cron": "^4.2.1", + "openapi-types": "^12.1.3", + "quansync": "^1.0.0", "react": "^19.2.1", "react-dom": "^19.2.1", "react-hook-form": "^7.68.0", + "react-is": "^19.2.3", "react-router": "^7.10.0", "react-router-hono-server": "^2.22.0", "recharts": "3.5.1",