From be8056f392ce2785149a4ff2eee29ac8467aa196 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Mon, 27 Oct 2025 13:24:24 -0400 Subject: [PATCH 01/20] fix: Use separate snapshots for sequencer and validator workloads, update yarn lock --- report/vite.config.ts | 38 +- report/yarn.lock | 10121 +++++++++++++++++++++++++--------------- runner/service.go | 293 +- 3 files changed, 6619 insertions(+), 3833 deletions(-) diff --git a/report/vite.config.ts b/report/vite.config.ts index c764c5b..d7ce54d 100644 --- a/report/vite.config.ts +++ b/report/vite.config.ts @@ -1,5 +1,6 @@ import { defineConfig, loadEnv } from "vite"; import { resolve } from "path"; +import { existsSync } from "fs"; import { viteStaticCopy } from "vite-plugin-static-copy"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; @@ -18,6 +19,29 @@ export default defineConfig(({ mode }) => { ? env.VITE_ALLOWED_HOSTS.split(",").map((host) => host.trim()) : ["localhost"]; + // Check if output directory exists + const outputDirPath = resolve(__dirname, "../output"); + const hasOutputDir = existsSync(outputDirPath); + + // Build plugins array + const plugins = [react(), tailwindcss()]; + + // Only add static copy plugin if output directory exists + if (hasOutputDir) { + plugins.push( + viteStaticCopy({ + targets: [ + { + src: "../output/**/*", + dest: "output", + }, + ], + }) + ); + } else { + console.log("Output directory not found, skipping static copy"); + } + return { server: { port: 3000, @@ -46,18 +70,6 @@ export default defineConfig(({ mode }) => { env: processEnvVars, }), }, - // assetsInclude: ['../output/**/*'] - plugins: [ - react(), - tailwindcss(), - viteStaticCopy({ - targets: [ - { - src: "../output/**/*", - dest: "output", - }, - ], - }), - ], + plugins, }; }); diff --git a/report/yarn.lock b/report/yarn.lock index dbdb468..a394548 100644 --- a/report/yarn.lock +++ b/report/yarn.lock @@ -1,3726 +1,6395 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" - integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== - -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.26.0": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz" - integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.10" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.10" - "@babel/parser" "^7.26.10" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.10" - "@babel/types" "^7.26.10" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.26.10", "@babel/generator@^7.27.0": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz" - integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== - dependencies: - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.26.5": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz" - integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA== - dependencies: - "@babel/compat-data" "^7.26.8" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-plugin-utils@^7.25.9": - version "7.26.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.10": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz" - integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== - dependencies: - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.26.10", "@babel/parser@^7.27.0": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz" - integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== - dependencies: - "@babel/types" "^7.27.0" - -"@babel/plugin-transform-react-jsx-self@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz" - integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-react-jsx-source@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz" - integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.26.9", "@babel/template@^7.27.0": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" - integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz" - integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.27.0" - "@babel/parser" "^7.27.0" - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz" - integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.6.1" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz" - integrity sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.12.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@floating-ui/core@^1.7.1": - version "1.7.1" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz" - integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw== - dependencies: - "@floating-ui/utils" "^0.2.9" - -"@floating-ui/dom@^1.0.0": - version "1.7.1" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz" - integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ== - dependencies: - "@floating-ui/core" "^1.7.1" - "@floating-ui/utils" "^0.2.9" - -"@floating-ui/react-dom@^2.0.0": - version "2.1.3" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz" - integrity sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/utils@^0.2.9": - version "0.2.9" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz" - integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@radix-ui/primitive@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz" - integrity sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA== - -"@radix-ui/react-arrow@1.1.7": - version "1.1.7" - resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz" - integrity sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - -"@radix-ui/react-compose-refs@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" - integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== - -"@radix-ui/react-context@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz" - integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== - -"@radix-ui/react-dismissable-layer@1.1.10": - version "1.1.10" - resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz" - integrity sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-escape-keydown" "1.1.1" - -"@radix-ui/react-id@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz" - integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-popper@1.2.7": - version "1.2.7" - resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz" - integrity sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ== - dependencies: - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-layout-effect" "1.1.1" - "@radix-ui/react-use-rect" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" - "@radix-ui/rect" "1.1.1" - -"@radix-ui/react-portal@1.1.9": - version "1.1.9" - resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz" - integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-presence@1.1.4": - version "1.1.4" - resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz" - integrity sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-primitive@2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" - integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== - dependencies: - "@radix-ui/react-slot" "1.2.3" - -"@radix-ui/react-slot@1.2.3": - version "1.2.3" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" - integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== - dependencies: - "@radix-ui/react-compose-refs" "1.1.2" - -"@radix-ui/react-tooltip@^1.2.7": - version "1.2.7" - resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz" - integrity sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw== - dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-visually-hidden" "1.2.3" - -"@radix-ui/react-use-callback-ref@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz" - integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== - -"@radix-ui/react-use-controllable-state@1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz" - integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== - dependencies: - "@radix-ui/react-use-effect-event" "0.0.2" - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-use-effect-event@0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz" - integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-use-escape-keydown@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz" - integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.1" - -"@radix-ui/react-use-layout-effect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz" - integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== - -"@radix-ui/react-use-rect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz" - integrity sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w== - dependencies: - "@radix-ui/rect" "1.1.1" - -"@radix-ui/react-use-size@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz" - integrity sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.1" - -"@radix-ui/react-visually-hidden@1.2.3": - version "1.2.3" - resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz" - integrity sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug== - dependencies: - "@radix-ui/react-primitive" "2.1.3" - -"@radix-ui/rect@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz" - integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw== - -"@rollup/rollup-darwin-arm64@4.39.0": - version "4.39.0" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz" - integrity sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@tailwindcss/node@4.1.4": - version "4.1.4" - resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz" - integrity sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw== - dependencies: - enhanced-resolve "^5.18.1" - jiti "^2.4.2" - lightningcss "1.29.2" - tailwindcss "4.1.4" - -"@tailwindcss/oxide-darwin-arm64@4.1.4": - version "4.1.4" - resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz" - integrity sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg== - -"@tailwindcss/oxide@4.1.4": - version "4.1.4" - resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz" - integrity sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ== - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.4" - "@tailwindcss/oxide-darwin-arm64" "4.1.4" - "@tailwindcss/oxide-darwin-x64" "4.1.4" - "@tailwindcss/oxide-freebsd-x64" "4.1.4" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.4" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.4" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.4" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.4" - "@tailwindcss/oxide-linux-x64-musl" "4.1.4" - "@tailwindcss/oxide-wasm32-wasi" "4.1.4" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.4" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.4" - -"@tailwindcss/vite@^4.1.4": - version "4.1.4" - resolved "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.4.tgz" - integrity sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A== - dependencies: - "@tailwindcss/node" "4.1.4" - "@tailwindcss/oxide" "4.1.4" - tailwindcss "4.1.4" - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.7" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz" - integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== - dependencies: - "@babel/types" "^7.20.7" - -"@types/d3-array@*": - version "3.2.1" - resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz" - integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== - -"@types/d3-axis@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz" - integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-brush@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz" - integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-chord@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz" - integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== - -"@types/d3-color@*": - version "3.1.3" - resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz" - integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== - -"@types/d3-contour@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" - integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== - dependencies: - "@types/d3-array" "*" - "@types/geojson" "*" - -"@types/d3-delaunay@*": - version "6.0.4" - resolved "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz" - integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== - -"@types/d3-dispatch@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz" - integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== - -"@types/d3-drag@*": - version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz" - integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-dsv@*": - version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz" - integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== - -"@types/d3-ease@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz" - integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== - -"@types/d3-fetch@*": - version "3.0.7" - resolved "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz" - integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== - dependencies: - "@types/d3-dsv" "*" - -"@types/d3-force@*": - version "3.0.10" - resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz" - integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== - -"@types/d3-format@*": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz" - integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== - -"@types/d3-geo@*": - version "3.1.0" - resolved "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz" - integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== - dependencies: - "@types/geojson" "*" - -"@types/d3-hierarchy@*": - version "3.1.7" - resolved "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz" - integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== - -"@types/d3-interpolate@*": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz" - integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== - dependencies: - "@types/d3-color" "*" - -"@types/d3-path@*": - version "3.1.1" - resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz" - integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== - -"@types/d3-polygon@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz" - integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== - -"@types/d3-quadtree@*": - version "3.0.6" - resolved "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz" - integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== - -"@types/d3-random@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz" - integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== - -"@types/d3-scale-chromatic@*": - version "3.1.0" - resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" - integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== - -"@types/d3-scale@*": - version "4.0.9" - resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz" - integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== - dependencies: - "@types/d3-time" "*" - -"@types/d3-selection@*": - version "3.0.11" - resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz" - integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== - -"@types/d3-shape@*": - version "3.1.7" - resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz" - integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== - dependencies: - "@types/d3-path" "*" - -"@types/d3-time-format@*": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz" - integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== - -"@types/d3-time@*": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz" - integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== - -"@types/d3-timer@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz" - integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== - -"@types/d3-transition@*": - version "3.0.9" - resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz" - integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== - dependencies: - "@types/d3-selection" "*" - -"@types/d3-zoom@*": - version "3.0.8" - resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" - integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== - dependencies: - "@types/d3-interpolate" "*" - "@types/d3-selection" "*" - -"@types/d3@^7.4.3": - version "7.4.3" - resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" - integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== - dependencies: - "@types/d3-array" "*" - "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-delaunay" "*" - "@types/d3-dispatch" "*" - "@types/d3-drag" "*" - "@types/d3-dsv" "*" - "@types/d3-ease" "*" - "@types/d3-fetch" "*" - "@types/d3-force" "*" - "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" - "@types/d3-polygon" "*" - "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" - "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" - "@types/d3-transition" "*" - "@types/d3-zoom" "*" - -"@types/estree@^1.0.0", "@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/geojson@*": - version "7946.0.16" - resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz" - integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash@^4.17.16": - version "4.17.16" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz" - integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== - -"@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^20.11.24": - version "20.17.30" - resolved "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz" - integrity sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg== - dependencies: - undici-types "~6.19.2" - -"@types/react-dom@*", "@types/react-dom@^19.1.2": - version "19.1.2" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz" - integrity sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw== - -"@types/react@*", "@types/react@^19.0.0", "@types/react@^19.1.0": - version "19.1.0" - resolved "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz" - integrity sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w== - dependencies: - csstype "^3.0.2" - -"@typescript-eslint/eslint-plugin@^8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz" - integrity sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/type-utils" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^2.0.1" - -"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@^8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz" - integrity sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ== - dependencies: - "@typescript-eslint/scope-manager" "8.45.0" - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/typescript-estree" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz" - integrity sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.45.0" - "@typescript-eslint/types" "^8.45.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz" - integrity sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg== - dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - -"@typescript-eslint/scope-manager@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz" - integrity sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA== - dependencies: - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - -"@typescript-eslint/tsconfig-utils@^8.45.0", "@typescript-eslint/tsconfig-utils@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz" - integrity sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w== - -"@typescript-eslint/type-utils@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz" - integrity sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA== - dependencies: - "@typescript-eslint/typescript-estree" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - debug "^4.3.4" - ts-api-utils "^2.0.1" - -"@typescript-eslint/types@^8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz" - integrity sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA== - -"@typescript-eslint/types@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz" - integrity sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw== - -"@typescript-eslint/types@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz" - integrity sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA== - -"@typescript-eslint/typescript-estree@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz" - integrity sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ== - dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.0.1" - -"@typescript-eslint/typescript-estree@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz" - integrity sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA== - dependencies: - "@typescript-eslint/project-service" "8.45.0" - "@typescript-eslint/tsconfig-utils" "8.45.0" - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/utils@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz" - integrity sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/typescript-estree" "8.30.1" - -"@typescript-eslint/visitor-keys@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz" - integrity sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA== - dependencies: - "@typescript-eslint/types" "8.30.1" - eslint-visitor-keys "^4.2.0" - -"@typescript-eslint/visitor-keys@8.45.0": - version "8.45.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz" - integrity sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag== - dependencies: - "@typescript-eslint/types" "8.45.0" - eslint-visitor-keys "^4.2.1" - -"@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -"@vitejs/plugin-react@^4.3.4": - version "4.3.4" - resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz" - integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== - dependencies: - "@babel/core" "^7.26.0" - "@babel/plugin-transform-react-jsx-self" "^7.25.9" - "@babel/plugin-transform-react-jsx-source" "^7.25.9" - "@types/babel__core" "^7.20.5" - react-refresh "^0.14.2" - -"@vitest/expect@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz" - integrity sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA== - dependencies: - "@vitest/spy" "3.1.2" - "@vitest/utils" "3.1.2" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/mocker@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz" - integrity sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw== - dependencies: - "@vitest/spy" "3.1.2" - estree-walker "^3.0.3" - magic-string "^0.30.17" - -"@vitest/pretty-format@^3.1.2", "@vitest/pretty-format@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz" - integrity sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz" - integrity sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g== - dependencies: - "@vitest/utils" "3.1.2" - pathe "^2.0.3" - -"@vitest/snapshot@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz" - integrity sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q== - dependencies: - "@vitest/pretty-format" "3.1.2" - magic-string "^0.30.17" - pathe "^2.0.3" - -"@vitest/spy@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz" - integrity sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA== - dependencies: - tinyspy "^3.0.2" - -"@vitest/utils@3.1.2": - version "3.1.2" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz" - integrity sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg== - dependencies: - "@vitest/pretty-format" "3.1.2" - loupe "^3.1.3" - tinyrainbow "^2.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: - version "8.14.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-includes@^3.1.6, array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.5: - version "1.2.6" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, "browserslist@>= 4.21.0": - version "4.24.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -caniuse-lite@^1.0.30001688: - version "1.0.30001713" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz" - integrity sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q== - -chai@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz" - integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" - integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== - -cross-spawn@^7.0.2: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: - version "3.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" - integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== - dependencies: - internmap "1 - 2" - -d3-axis@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-contour@4: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz" - integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.4" - resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" - integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -"d3-ease@1 - 3", d3-ease@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo@3: - version "3.1.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz" - integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-scale-chromatic@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" - integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@3: - version "3.2.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^7.8.5: - version "7.9.0" - resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" - integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delaunator@5: - version "5.0.1" - resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" - integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== - dependencies: - robust-predicates "^3.0.2" - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -electron-to-chromium@^1.5.73: - version "1.5.136" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz" - integrity sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ== - -enhanced-resolve@^5.18.1: - version "5.18.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz" - integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: - version "1.23.9" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz" - integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.3" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.2.7" - get-proto "^1.0.0" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-regex "^1.2.1" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.0" - math-intrinsics "^1.1.0" - object-inspect "^1.13.3" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.3" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.18" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz" - integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.6" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - iterator.prototype "^1.1.4" - safe-array-concat "^1.1.3" - -es-module-lexer@^1.6.0: - version "1.7.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^10.1.2: - version "10.1.2" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz" - integrity sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.0: - version "2.12.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" - integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.31.0: - version "2.31.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz" - integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.8" - array.prototype.findlastindex "^1.2.5" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.0" - hasown "^2.0.2" - is-core-module "^2.15.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.0" - semver "^6.3.1" - string.prototype.trimend "^1.0.8" - tsconfig-paths "^3.15.0" - -eslint-plugin-react-hooks@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz" - integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== - -eslint-plugin-react@^7.37.5: - version "7.37.5" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" - integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.9" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^8.57.1, eslint@>=7.0.0: - version "8.57.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -expect-type@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz" - integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fdir@^6.4.4: - version "6.4.4" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz" - integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -fs-extra@^11.1.0: - version "11.3.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz" - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-string@^1.0.7, is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iterator.prototype@^1.1.4: - version "1.1.5" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" - integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== - dependencies: - define-data-property "^1.1.4" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - get-proto "^1.0.0" - has-symbols "^1.1.0" - set-function-name "^2.0.2" - -jiti@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lightningcss-darwin-arm64@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz" - integrity sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA== - -lightningcss@^1.21.0, lightningcss@1.29.2: - version "1.29.2" - resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz" - integrity sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA== - dependencies: - detect-libc "^2.0.3" - optionalDependencies: - lightningcss-darwin-arm64 "1.29.2" - lightningcss-darwin-x64 "1.29.2" - lightningcss-freebsd-x64 "1.29.2" - lightningcss-linux-arm-gnueabihf "1.29.2" - lightningcss-linux-arm64-gnu "1.29.2" - lightningcss-linux-arm64-musl "1.29.2" - lightningcss-linux-x64-gnu "1.29.2" - lightningcss-linux-x64-musl "1.29.2" - lightningcss-win32-arm64-msvc "1.29.2" - lightningcss-win32-x64-msvc "1.29.2" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^3.1.0, loupe@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz" - integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -magic-string@^0.30.17: - version "0.30.17" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.8: - version "3.3.11" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz" - integrity sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -"picomatch@^3 || ^4", picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss@^8.4.43: - version "8.5.3" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz" - integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -"react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react-dom@^19.1.0, react-dom@>=16.8.0, react-dom@>=18: - version "19.1.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" - integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== - dependencies: - scheduler "^0.26.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-refresh@^0.14.2: - version "0.14.2" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" - integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== - -react-router-dom@^7.5.1: - version "7.5.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz" - integrity sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA== - dependencies: - react-router "7.5.1" - -react-router@7.5.1: - version "7.5.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-7.5.1.tgz" - integrity sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA== - dependencies: - cookie "^1.0.1" - set-cookie-parser "^2.6.0" - turbo-stream "2.4.0" - -"react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.1.0, react@>=16.8.0, react@>=18: - version "19.1.0" - resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" - integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regexp.prototype.flags@^1.5.3: - version "1.5.4" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.22.4: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -robust-predicates@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" - integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== - -rollup@^4.20.0: - version "4.39.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz" - integrity sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.39.0" - "@rollup/rollup-android-arm64" "4.39.0" - "@rollup/rollup-darwin-arm64" "4.39.0" - "@rollup/rollup-darwin-x64" "4.39.0" - "@rollup/rollup-freebsd-arm64" "4.39.0" - "@rollup/rollup-freebsd-x64" "4.39.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.39.0" - "@rollup/rollup-linux-arm-musleabihf" "4.39.0" - "@rollup/rollup-linux-arm64-gnu" "4.39.0" - "@rollup/rollup-linux-arm64-musl" "4.39.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.39.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.39.0" - "@rollup/rollup-linux-riscv64-gnu" "4.39.0" - "@rollup/rollup-linux-riscv64-musl" "4.39.0" - "@rollup/rollup-linux-s390x-gnu" "4.39.0" - "@rollup/rollup-linux-x64-gnu" "4.39.0" - "@rollup/rollup-linux-x64-musl" "4.39.0" - "@rollup/rollup-win32-arm64-msvc" "4.39.0" - "@rollup/rollup-win32-ia32-msvc" "4.39.0" - "@rollup/rollup-win32-x64-msvc" "4.39.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@1: - version "1.3.3" - resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.26.0: - version "0.26.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" - integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.6.0: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -set-cookie-parser@^2.6.0: - version "2.7.1" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" - integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.9.0: - version "3.9.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz" - integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== - -string.prototype.matchall@^4.0.12: - version "4.0.12" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz" - integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - regexp.prototype.flags "^1.5.3" - set-function-name "^2.0.2" - side-channel "^1.1.0" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swr@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz" - integrity sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A== - dependencies: - dequal "^2.0.3" - use-sync-external-store "^1.4.0" - -tailwindcss@^4.1.4, tailwindcss@4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz" - integrity sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A== - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinyglobby@^0.2.13: - version "0.2.13" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz" - integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -tinypool@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz" - integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^2.0.1, ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -turbo-stream@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz" - integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -typescript@^5.3.3, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", "typescript@>=4.8.4 <6.0.0": - version "5.8.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" - integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.1.1: - version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-sync-external-store@^1.4.0: - version "1.5.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" - integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== - -vite-node@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz" - integrity sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA== - dependencies: - cac "^6.7.14" - debug "^4.4.0" - es-module-lexer "^1.6.0" - pathe "^2.0.3" - vite "^5.0.0 || ^6.0.0" - -vite-plugin-static-copy@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.1.tgz" - integrity sha512-EfsPcBm3ewg3UMG8RJaC0ADq6/qnUZnokXx4By4+2cAcipjT9i0Y0owIJGqmZI7d6nxk4qB1q5aXOwNuSyPdyA== - dependencies: - chokidar "^3.5.3" - fast-glob "^3.2.11" - fs-extra "^11.1.0" - p-map "^7.0.3" - picocolors "^1.0.0" - -"vite@^4.2.0 || ^5.0.0 || ^6.0.0", "vite@^5.0.0 || ^6.0.0", vite@^5.1.4, "vite@^5.2.0 || ^6": - version "5.4.18" - resolved "https://registry.npmjs.org/vite/-/vite-5.4.18.tgz" - integrity sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz" - integrity sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ== - dependencies: - "@vitest/expect" "3.1.2" - "@vitest/mocker" "3.1.2" - "@vitest/pretty-format" "^3.1.2" - "@vitest/runner" "3.1.2" - "@vitest/snapshot" "3.1.2" - "@vitest/spy" "3.1.2" - "@vitest/utils" "3.1.2" - chai "^5.2.0" - debug "^4.4.0" - expect-type "^1.2.1" - magic-string "^0.30.17" - pathe "^2.0.3" - std-env "^3.9.0" - tinybench "^2.9.0" - tinyexec "^0.3.2" - tinyglobby "^0.2.13" - tinypool "^1.0.2" - tinyrainbow "^2.0.0" - vite "^5.0.0 || ^6.0.0" - vite-node "3.1.2" - why-is-node-running "^2.3.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.18: - version "1.1.19" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca + languageName: node + linkType: hard + +"@babel/core@npm:^7.26.0": + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/generator@npm:7.27.0" + dependencies: + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.26.5": + version: 7.27.0 + resolution: "@babel/helper-compilation-targets@npm:7.27.0" + dependencies: + "@babel/compat-data": "npm:^7.26.8" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/375c9f80e6540118f41bd53dd54d670b8bf91235d631bdead44c8b313b26e9cd89aed5c6df770ad13a87a464497b5346bb72b9462ba690473da422f5402618b6 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/helpers@npm:7.27.0" + dependencies: + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/parser@npm:7.27.0" + dependencies: + "@babel/types": "npm:^7.27.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-self@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-source@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa + languageName: node + linkType: hard + +"@babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/template@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/traverse@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.0" + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/types@npm:7.27.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 + languageName: node + linkType: hard + +"@emnapi/core@npm:^1.4.0, @emnapi/core@npm:^1.4.3": + version: 1.6.0 + resolution: "@emnapi/core@npm:1.6.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.1.0" + tslib: "npm:^2.4.0" + checksum: 10c0/40e384f39104a9f8260e671c0110f8618961afc564afb2e626af79175717a8b5e2d8b2ae3d30194d318a71247e0fc833601666233adfeb244c46cadc06c58a51 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.4.3": + version: 1.6.0 + resolution: "@emnapi/runtime@npm:1.6.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/e3d2452a8fb83bb59fe60dfcf4cff99f9680c13c07dff8ad28639ccc8790151841ef626a67014bde132939bad73dfacc440ade8c3db2ab12693ea9c8ba4d37fb + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.1": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.6.1 + resolution: "@eslint-community/eslint-utils@npm:4.6.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/cdeb6f8fc33a83726357d7f736075cdbd6e79dc7ac4b00b15680f1111d0f33bda583e7fafa5937245a058cc66302dc47568bba57b251302dc74964d8e87f56d7 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + +"@floating-ui/core@npm:^1.7.1": + version: 1.7.1 + resolution: "@floating-ui/core@npm:1.7.1" + dependencies: + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/40df1e1dd8a2bad6f70c1ee163f0e151c456f52b9b98a38488d88720b2be72ccd631501a66f8369f96d2e8ad1c4250936b6fd4243e3a99833f2d008ee6afec18 + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.0.0": + version: 1.7.1 + resolution: "@floating-ui/dom@npm:1.7.1" + dependencies: + "@floating-ui/core": "npm:^1.7.1" + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/33b0e892f4c50ce568169cd58793ff5e3bc1e72ee007237d73b9458d4475e1e5f5a4b3f9e6752422d5f5ac902bc0c135ca7dc0a23c6df187fd9d28dc34cdceed + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0": + version: 2.1.3 + resolution: "@floating-ui/react-dom@npm:2.1.3" + dependencies: + "@floating-ui/dom": "npm:^1.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/e88750ea2fb352264d52d502d3979f94155ce2c8ab9a50862810d0cfc8c8e49cb6bbde466d668736cb38624d089360ef97451397b647408a0eb2c1870234c19a + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^0.2.8": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/primitive@npm:1.1.2" + checksum: 10c0/5e2d2528d2fe37c16865e77b0beaac2b415a817ad13d8178db6e8187b2a092672568a64ee0041510abfde3034490a5cadd3057049bb15789020c06892047597c + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-arrow@npm:1.1.7" + dependencies: + "@radix-ui/react-primitive": "npm:2.1.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/c3b46766238b3ee2a394d8806a5141432361bf1425110c9f0dcf480bda4ebd304453a53f294b5399c6ee3ccfcae6fd544921fd01ddc379cf5942acdd7168664b + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-compose-refs@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/d36a9c589eb75d634b9b139c80f916aadaf8a68a7c1c4b8c6c6b88755af1a92f2e343457042089f04cc3f23073619d08bb65419ced1402e9d4e299576d970771 + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-context@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/cece731f8cc25d494c6589cc681e5c01a93867d895c75889973afa1a255f163c286e390baa7bc028858eaabe9f6b57270d0ca6377356f652c5557c1c7a41ccce + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.1.10": + version: 1.1.10 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.10" + dependencies: + "@radix-ui/primitive": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-escape-keydown": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/21a2d03689f5e06586135b6a735937ef14f2571fdf6044a3019bc3f9fa368a9400b5a9b631f43e8ad3682693449e369ffa7cc8642764246ce18ebe7359a45faf + languageName: node + linkType: hard + +"@radix-ui/react-id@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-id@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/7d12e76818763d592c331277ef62b197e2e64945307e650bd058f0090e5ae48bbd07691b23b7e9e977901ef4eadcb3e2d5eaeb17a13859083384be83fc1292c7 + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.2.7": + version: 1.2.7 + resolution: "@radix-ui/react-popper@npm:1.2.7" + dependencies: + "@floating-ui/react-dom": "npm:^2.0.0" + "@radix-ui/react-arrow": "npm:1.1.7" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + "@radix-ui/react-use-rect": "npm:1.1.1" + "@radix-ui/react-use-size": "npm:1.1.1" + "@radix-ui/rect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/fb901329df5432225b0be08778a89faaa25c40e8042f0f181218e385cae26811420b6e4b1effc70955393e09d83cd462d1b0eb6ca6d33282d76692972b602ad8 + languageName: node + linkType: hard + +"@radix-ui/react-portal@npm:1.1.9": + version: 1.1.9 + resolution: "@radix-ui/react-portal@npm:1.1.9" + dependencies: + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/45b432497c722720c72c493a29ef6085bc84b50eafe79d48b45c553121b63e94f9cdb77a3a74b9c49126f8feb3feee009fe400d48b7759d3552396356b192cd7 + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.1.4": + version: 1.1.4 + resolution: "@radix-ui/react-presence@npm:1.1.4" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/8202647139d6f5097b0abcc43dfba471c00b69da95ca336afe3ea23a165e05ca21992f40fc801760fe442f3e064e54e2f2cbcb9ad758c4b07ef6c69a5b6777bd + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.1.3": + version: 2.1.3 + resolution: "@radix-ui/react-primitive@npm:2.1.3" + dependencies: + "@radix-ui/react-slot": "npm:1.2.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/fdff9b84913bb4172ef6d3af7442fca5f9bba5f2709cba08950071f819d7057aec3a4a2d9ef44cf9cbfb8014d02573c6884a04cff175895823aaef809ebdb034 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-slot@npm:1.2.3" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/5913aa0d760f505905779515e4b1f0f71a422350f077cc8d26d1aafe53c97f177fec0e6d7fbbb50d8b5e498aa9df9f707ca75ae3801540c283b26b0136138eef + languageName: node + linkType: hard + +"@radix-ui/react-tooltip@npm:^1.2.7": + version: 1.2.7 + resolution: "@radix-ui/react-tooltip@npm:1.2.7" + dependencies: + "@radix-ui/primitive": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-dismissable-layer": "npm:1.1.10" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.7" + "@radix-ui/react-portal": "npm:1.1.9" + "@radix-ui/react-presence": "npm:1.1.4" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-slot": "npm:1.2.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + "@radix-ui/react-visually-hidden": "npm:1.2.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/28798d576c6ffec4f11120cd563aa9d5ab9afb9a37dc18778176442756d026c8c46eec1ddc647b2b5914045495fcb89f82530106e91acb55776b7d6b1a10fb57 + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/5f6aff8592dea6a7e46589808912aba3fb3b626cf6edd2b14f01638b61dbbe49eeb9f67cd5601f4c15b2fb547b9a7e825f7c4961acd4dd70176c969ae405f8d8 + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-use-controllable-state@npm:1.2.2" + dependencies: + "@radix-ui/react-use-effect-event": "npm:0.0.2" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f55c4b06e895293aed4b44c9ef26fb24432539f5346fcd6519c7745800535b571058685314e83486a45bf61dc83887e24826490d3068acc317fb0a9010516e63 + languageName: node + linkType: hard + +"@radix-ui/react-use-effect-event@npm:0.0.2": + version: 0.0.2 + resolution: "@radix-ui/react-use-effect-event@npm:0.0.2" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/e84ff72a3e76c5ae9c94941028bb4b6472f17d4104481b9eab773deab3da640ecea035e54da9d6f4df8d84c18ef6913baf92b7511bee06930dc58bd0c0add417 + languageName: node + linkType: hard + +"@radix-ui/react-use-escape-keydown@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.1" + dependencies: + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/bff53be99e940fef1d3c4df7d560e1d9133182e5a98336255d3063327d1d3dd4ec54a95dc5afe15cca4fb6c184f0a956c70de2815578c318cf995a7f9beabaa1 + languageName: node + linkType: hard + +"@radix-ui/react-use-layout-effect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9f98fdaba008dfc58050de60a77670b885792df473cf82c1cef8daee919a5dd5a77d270209f5f0b0abfaac78cb1627396e3ff56c81b735be550409426fe8b040 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-rect@npm:1.1.1" + dependencies: + "@radix-ui/rect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/271711404c05c589c8dbdaa748749e7daf44bcc6bffc9ecd910821c3ebca0ee245616cf5b39653ce690f53f875c3836fd3f36f51ab1c628273b6db599eee4864 + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-size@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/851d09a816f44282e0e9e2147b1b571410174cc048703a50c4fa54d672de994fd1dfff1da9d480ecfd12c77ae8f48d74f01adaf668f074156b8cd0043c6c21d8 + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-visually-hidden@npm:1.2.3" + dependencies: + "@radix-ui/react-primitive": "npm:2.1.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/cf86a37f1cbee50a964056f3dc4f6bb1ee79c76daa321f913aa20ff3e1ccdfafbf2b114d7bb616aeefc7c4b895e6ca898523fdb67710d89bd5d8edb739a0d9b6 + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/rect@npm:1.1.1" + checksum: 10c0/0dac4f0f15691199abe6a0e067821ddd9d0349c0c05f39834e4eafc8403caf724106884035ae91bbc826e10367e6a5672e7bec4d4243860fa7649de246b1f60b + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.39.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-android-arm64@npm:4.39.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.39.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.39.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.39.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.39.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.39.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.39.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.39.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.39.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.39.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.39.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.39.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.39.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.39.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.39.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.39.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.39.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.39.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.39.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b + languageName: node + linkType: hard + +"@tailwindcss/node@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/node@npm:4.1.4" + dependencies: + enhanced-resolve: "npm:^5.18.1" + jiti: "npm:^2.4.2" + lightningcss: "npm:1.29.2" + tailwindcss: "npm:4.1.4" + checksum: 10c0/0369c89a1f3588ac4d24a156e1e0e089fc596adc82e13f88cc8817bd507876110e7be081335ab25379bce2a2d8e9e693236cde0a6e81cc4fc545211d1a32de11 + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.4" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.4" + dependencies: + "@emnapi/core": "npm:^1.4.0" + "@emnapi/runtime": "npm:^1.4.0" + "@emnapi/wasi-threads": "npm:^1.0.1" + "@napi-rs/wasm-runtime": "npm:^0.2.8" + "@tybys/wasm-util": "npm:^0.9.0" + tslib: "npm:^2.8.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/oxide@npm:4.1.4" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.4" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.4" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.4" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.4" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.4" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.4" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.4" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.4" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.4" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.4" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.4" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.4" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-wasm32-wasi": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10c0/1e01157774265587cdc7209f4c248a21463b0dde1672e49ff3667b6b8918bdbdc48ebb4bdf228489170dc221c5dec54492a9cdf699244562d8966ae8c6cdd508 + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4.1.4": + version: 4.1.4 + resolution: "@tailwindcss/vite@npm:4.1.4" + dependencies: + "@tailwindcss/node": "npm:4.1.4" + "@tailwindcss/oxide": "npm:4.1.4" + tailwindcss: "npm:4.1.4" + peerDependencies: + vite: ^5.2.0 || ^6 + checksum: 10c0/21cbc6d3069923bbbcca9fb9f851c32abde47f124eefcfb246e3870d73d3e56909118b3fdf1619b7f74fa8d45c562811a22237409b24d083b4d02a98bcafc3b1 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.10.0": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*": + version: 7.20.7 + resolution: "@types/babel__traverse@npm:7.20.7" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd + languageName: node + linkType: hard + +"@types/d3-array@npm:*": + version: 3.2.1 + resolution: "@types/d3-array@npm:3.2.1" + checksum: 10c0/38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca + languageName: node + linkType: hard + +"@types/d3-axis@npm:*": + version: 3.0.6 + resolution: "@types/d3-axis@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/d756d42360261f44d8eefd0950c5bb0a4f67a46dd92069da3f723ac36a1e8cb2b9ce6347d836ef19d5b8aef725dbcf8fdbbd6cfbff676ca4b0642df2f78b599a + languageName: node + linkType: hard + +"@types/d3-brush@npm:*": + version: 3.0.6 + resolution: "@types/d3-brush@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/fd6e2ac7657a354f269f6b9c58451ffae9d01b89ccb1eb6367fd36d635d2f1990967215ab498e0c0679ff269429c57fad6a2958b68f4d45bc9f81d81672edc01 + languageName: node + linkType: hard + +"@types/d3-chord@npm:*": + version: 3.0.6 + resolution: "@types/d3-chord@npm:3.0.6" + checksum: 10c0/c5a25eb5389db01e63faec0c5c2ec7cc41c494e9b3201630b494c4e862a60f1aa83fabbc33a829e7e1403941e3c30d206c741559b14406ac2a4239cfdf4b4c17 + languageName: node + linkType: hard + +"@types/d3-color@npm:*": + version: 3.1.3 + resolution: "@types/d3-color@npm:3.1.3" + checksum: 10c0/65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae + languageName: node + linkType: hard + +"@types/d3-contour@npm:*": + version: 3.0.6 + resolution: "@types/d3-contour@npm:3.0.6" + dependencies: + "@types/d3-array": "npm:*" + "@types/geojson": "npm:*" + checksum: 10c0/e7d83e94719af4576ceb5ac7f277c5806f83ba6c3631744ae391cffc3641f09dfa279470b83053cd0b2acd6784e8749c71141d05bdffa63ca58ffb5b31a0f27c + languageName: node + linkType: hard + +"@types/d3-delaunay@npm:*": + version: 6.0.4 + resolution: "@types/d3-delaunay@npm:6.0.4" + checksum: 10c0/d154a8864f08c4ea23ecb9bdabcef1c406a25baa8895f0cb08a0ed2799de0d360e597552532ce7086ff0cdffa8f3563f9109d18f0191459d32bb620a36939123 + languageName: node + linkType: hard + +"@types/d3-dispatch@npm:*": + version: 3.0.6 + resolution: "@types/d3-dispatch@npm:3.0.6" + checksum: 10c0/405eb7d0ec139fbf72fa6a43b0f3ca8a1f913bb2cb38f607827e63fca8d4393f021f32f3b96b33c93ddbd37789453a0b3624f14f504add5308fd9aec8a46dda0 + languageName: node + linkType: hard + +"@types/d3-drag@npm:*": + version: 3.0.7 + resolution: "@types/d3-drag@npm:3.0.7" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d + languageName: node + linkType: hard + +"@types/d3-dsv@npm:*": + version: 3.0.7 + resolution: "@types/d3-dsv@npm:3.0.7" + checksum: 10c0/c0f01da862465594c8a28278b51c850af3b4239cc22b14fd1a19d7a98f93d94efa477bf59d8071beb285dca45bf614630811451e18e7c52add3a0abfee0a1871 + languageName: node + linkType: hard + +"@types/d3-ease@npm:*": + version: 3.0.2 + resolution: "@types/d3-ease@npm:3.0.2" + checksum: 10c0/aff5a1e572a937ee9bff6465225d7ba27d5e0c976bd9eacdac2e6f10700a7cb0c9ea2597aff6b43a6ed850a3210030870238894a77ec73e309b4a9d0333f099c + languageName: node + linkType: hard + +"@types/d3-fetch@npm:*": + version: 3.0.7 + resolution: "@types/d3-fetch@npm:3.0.7" + dependencies: + "@types/d3-dsv": "npm:*" + checksum: 10c0/3d147efa52a26da1a5d40d4d73e6cebaaa964463c378068062999b93ea3731b27cc429104c21ecbba98c6090e58ef13429db6399238c5e3500162fb3015697a0 + languageName: node + linkType: hard + +"@types/d3-force@npm:*": + version: 3.0.10 + resolution: "@types/d3-force@npm:3.0.10" + checksum: 10c0/c82b459079a106b50e346c9b79b141f599f2fc4f598985a5211e72c7a2e20d35bd5dc6e91f306b323c8bfa325c02c629b1645f5243f1c6a55bd51bc85cccfa92 + languageName: node + linkType: hard + +"@types/d3-format@npm:*": + version: 3.0.4 + resolution: "@types/d3-format@npm:3.0.4" + checksum: 10c0/3ac1600bf9061a59a228998f7cd3f29e85cbf522997671ba18d4d84d10a2a1aff4f95aceb143fa9960501c3ec351e113fc75884e6a504ace44dc1744083035ee + languageName: node + linkType: hard + +"@types/d3-geo@npm:*": + version: 3.1.0 + resolution: "@types/d3-geo@npm:3.1.0" + dependencies: + "@types/geojson": "npm:*" + checksum: 10c0/3745a93439038bb5b0b38facf435f7079812921d46406f5d38deaee59e90084ff742443c7ea0a8446df81a0d81eaf622fe7068cf4117a544bd4aa3b2dc182f88 + languageName: node + linkType: hard + +"@types/d3-hierarchy@npm:*": + version: 3.1.7 + resolution: "@types/d3-hierarchy@npm:3.1.7" + checksum: 10c0/873711737d6b8e7b6f1dda0bcd21294a48f75024909ae510c5d2c21fad2e72032e0958def4d9f68319d3aaac298ad09c49807f8bfc87a145a82693b5208613c7 + languageName: node + linkType: hard + +"@types/d3-interpolate@npm:*": + version: 3.0.4 + resolution: "@types/d3-interpolate@npm:3.0.4" + dependencies: + "@types/d3-color": "npm:*" + checksum: 10c0/066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4 + languageName: node + linkType: hard + +"@types/d3-path@npm:*": + version: 3.1.1 + resolution: "@types/d3-path@npm:3.1.1" + checksum: 10c0/2c36eb31ebaf2ce4712e793fd88087117976f7c4ed69cc2431825f999c8c77cca5cea286f3326432b770739ac6ccd5d04d851eb65e7a4dbcc10c982b49ad2c02 + languageName: node + linkType: hard + +"@types/d3-polygon@npm:*": + version: 3.0.2 + resolution: "@types/d3-polygon@npm:3.0.2" + checksum: 10c0/f46307bb32b6c2aef8c7624500e0f9b518de8f227ccc10170b869dc43e4c542560f6c8d62e9f087fac45e198d6e4b623e579c0422e34c85baf56717456d3f439 + languageName: node + linkType: hard + +"@types/d3-quadtree@npm:*": + version: 3.0.6 + resolution: "@types/d3-quadtree@npm:3.0.6" + checksum: 10c0/7eaa0a4d404adc856971c9285e1c4ab17e9135ea669d847d6db7e0066126a28ac751864e7ce99c65d526e130f56754a2e437a1617877098b3bdcc3ef23a23616 + languageName: node + linkType: hard + +"@types/d3-random@npm:*": + version: 3.0.3 + resolution: "@types/d3-random@npm:3.0.3" + checksum: 10c0/5f4fea40080cd6d4adfee05183d00374e73a10c530276a6455348983dda341003a251def28565a27c25d9cf5296a33e870e397c9d91ff83fb7495a21c96b6882 + languageName: node + linkType: hard + +"@types/d3-scale-chromatic@npm:*": + version: 3.1.0 + resolution: "@types/d3-scale-chromatic@npm:3.1.0" + checksum: 10c0/93c564e02d2e97a048e18fe8054e4a935335da6ab75a56c3df197beaa87e69122eef0dfbeb7794d4a444a00e52e3123514ee27cec084bd21f6425b7037828cc2 + languageName: node + linkType: hard + +"@types/d3-scale@npm:*": + version: 4.0.9 + resolution: "@types/d3-scale@npm:4.0.9" + dependencies: + "@types/d3-time": "npm:*" + checksum: 10c0/4ac44233c05cd50b65b33ecb35d99fdf07566bcdbc55bc1306b2f27d1c5134d8c560d356f2c8e76b096e9125ffb8d26d95f78d56e210d1c542cb255bdf31d6c8 + languageName: node + linkType: hard + +"@types/d3-selection@npm:*": + version: 3.0.11 + resolution: "@types/d3-selection@npm:3.0.11" + checksum: 10c0/0c512956c7503ff5def4bb32e0c568cc757b9a2cc400a104fc0f4cfe5e56d83ebde2a97821b6f2cb26a7148079d3b86a2f28e11d68324ed311cf35c2ed980d1d + languageName: node + linkType: hard + +"@types/d3-shape@npm:*": + version: 3.1.7 + resolution: "@types/d3-shape@npm:3.1.7" + dependencies: + "@types/d3-path": "npm:*" + checksum: 10c0/38e59771c1c4c83b67aa1f941ce350410522a149d2175832fdc06396b2bb3b2c1a2dd549e0f8230f9f24296ee5641a515eaf10f55ee1ef6c4f83749e2dd7dcfd + languageName: node + linkType: hard + +"@types/d3-time-format@npm:*": + version: 4.0.3 + resolution: "@types/d3-time-format@npm:4.0.3" + checksum: 10c0/9ef5e8e2b96b94799b821eed5d61a3d432c7903247966d8ad951b8ce5797fe46554b425cb7888fa5bf604b4663c369d7628c0328ffe80892156671c58d1a7f90 + languageName: node + linkType: hard + +"@types/d3-time@npm:*": + version: 3.0.4 + resolution: "@types/d3-time@npm:3.0.4" + checksum: 10c0/6d9e2255d63f7a313a543113920c612e957d70da4fb0890931da6c2459010291b8b1f95e149a538500c1c99e7e6c89ffcce5554dd29a31ff134a38ea94b6d174 + languageName: node + linkType: hard + +"@types/d3-timer@npm:*": + version: 3.0.2 + resolution: "@types/d3-timer@npm:3.0.2" + checksum: 10c0/c644dd9571fcc62b1aa12c03bcad40571553020feeb5811f1d8a937ac1e65b8a04b759b4873aef610e28b8714ac71c9885a4d6c127a048d95118f7e5b506d9e1 + languageName: node + linkType: hard + +"@types/d3-transition@npm:*": + version: 3.0.9 + resolution: "@types/d3-transition@npm:3.0.9" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/4f68b9df7ac745b3491216c54203cbbfa0f117ae4c60e2609cdef2db963582152035407fdff995b10ee383bae2f05b7743493f48e1b8e46df54faa836a8fb7b5 + languageName: node + linkType: hard + +"@types/d3-zoom@npm:*": + version: 3.0.8 + resolution: "@types/d3-zoom@npm:3.0.8" + dependencies: + "@types/d3-interpolate": "npm:*" + "@types/d3-selection": "npm:*" + checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 + languageName: node + linkType: hard + +"@types/d3@npm:^7.4.3": + version: 7.4.3 + resolution: "@types/d3@npm:7.4.3" + dependencies: + "@types/d3-array": "npm:*" + "@types/d3-axis": "npm:*" + "@types/d3-brush": "npm:*" + "@types/d3-chord": "npm:*" + "@types/d3-color": "npm:*" + "@types/d3-contour": "npm:*" + "@types/d3-delaunay": "npm:*" + "@types/d3-dispatch": "npm:*" + "@types/d3-drag": "npm:*" + "@types/d3-dsv": "npm:*" + "@types/d3-ease": "npm:*" + "@types/d3-fetch": "npm:*" + "@types/d3-force": "npm:*" + "@types/d3-format": "npm:*" + "@types/d3-geo": "npm:*" + "@types/d3-hierarchy": "npm:*" + "@types/d3-interpolate": "npm:*" + "@types/d3-path": "npm:*" + "@types/d3-polygon": "npm:*" + "@types/d3-quadtree": "npm:*" + "@types/d3-random": "npm:*" + "@types/d3-scale": "npm:*" + "@types/d3-scale-chromatic": "npm:*" + "@types/d3-selection": "npm:*" + "@types/d3-shape": "npm:*" + "@types/d3-time": "npm:*" + "@types/d3-time-format": "npm:*" + "@types/d3-timer": "npm:*" + "@types/d3-transition": "npm:*" + "@types/d3-zoom": "npm:*" + checksum: 10c0/a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 + languageName: node + linkType: hard + +"@types/estree@npm:1.0.7, @types/estree@npm:^1.0.0": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c + languageName: node + linkType: hard + +"@types/geojson@npm:*": + version: 7946.0.16 + resolution: "@types/geojson@npm:7946.0.16" + checksum: 10c0/1ff24a288bd5860b766b073ead337d31d73bdc715e5b50a2cee5cb0af57a1ed02cc04ef295f5fa68dc40fe3e4f104dd31282b2b818a5ba3231bc1001ba084e3c + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac + languageName: node + linkType: hard + +"@types/lodash@npm:^4.17.16": + version: 4.17.16 + resolution: "@types/lodash@npm:4.17.16" + checksum: 10c0/cf017901b8ab1d7aabc86d5189d9288f4f99f19a75caf020c0e2c77b8d4cead4db0d0b842d009b029339f92399f49f34377dd7c2721053388f251778b4c23534 + languageName: node + linkType: hard + +"@types/node@npm:^20.11.24": + version: 20.17.30 + resolution: "@types/node@npm:20.17.30" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/649782c7822367d751472d70c948bcc50cded1a4744610f706f81cd54e1fc015523567d7e3e17f6b19e3e2797f6f23b653e898bdb4a2f21f8759ceba49976310 + languageName: node + linkType: hard + +"@types/react-dom@npm:^19.1.2": + version: 19.1.2 + resolution: "@types/react-dom@npm:19.1.2" + peerDependencies: + "@types/react": ^19.0.0 + checksum: 10c0/100c341cacba9ec8ae1d47ee051072a3450e9573bf8eeb7262490e341cb246ea0f95a07a1f2077e61cf92648f812a0324c602fcd811bd87b7ce41db2811510cd + languageName: node + linkType: hard + +"@types/react@npm:^19.1.0": + version: 19.1.0 + resolution: "@types/react@npm:19.1.0" + dependencies: + csstype: "npm:^3.0.2" + checksum: 10c0/632fd20ee176e55801a61c5f854141b043571a3e363ef106b047b766a813a12735cbb37abb3d61d126346979f530f2ed269a60c8ef3cdee54e5e9fe4174e5dad + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.30.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.30.1" + "@typescript-eslint/type-utils": "npm:8.30.1" + "@typescript-eslint/utils": "npm:8.30.1" + "@typescript-eslint/visitor-keys": "npm:8.30.1" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/e34e067c977a20fe927a30e5ffd5402b03eb12d1c9dc932e7c4a772e78fda9e34708fa2d12ace34bad2c51ecaf5b8cfaa4b372c0c5550fe06587b721f6eae57b + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/parser@npm:8.45.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/8b419bcf795b112a39fcac05dcf147835059345b6399035ffa3f76a9d8e320f3fac79cae2fe4320dcda83fa059b017ca7626a7b4e3da08a614415c8867d169b8 + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/project-service@npm:8.45.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.45.0" + "@typescript-eslint/types": "npm:^8.45.0" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/98af065a1a3ed9d3d1eb265e09d3e9c2ae676d500a8c1d764f5609fe2c1b86749516b709804eb814fae688be7809d11748b9ae691d43c28da51dac390ca81fa9 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/scope-manager@npm:8.30.1" + dependencies: + "@typescript-eslint/types": "npm:8.30.1" + "@typescript-eslint/visitor-keys": "npm:8.30.1" + checksum: 10c0/8560fd02bb2a73b56f79af1dfa311491926f3625a04c0f32777c7c0bdec47b4a677addf2d2e2cc313416bb59b7a6e0bff7837449816a5ec5ff81e923daa76ca7 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/scope-manager@npm:8.45.0" + dependencies: + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" + checksum: 10c0/54cd36206f6b4fc8e1e48576ed01e0d6ab20c2a9c4c7d90d5cc3a2d317dd8a13abe148ffecf471b16f1224aba5749e0905472745626bef9ae5bed771776f4abe + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.45.0, @typescript-eslint/tsconfig-utils@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.45.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/227a9b7a5baaf35466fd369992cb933192515df1156ddf22f438deb344c2523695208e1036f5590b20603f31724de75a47fe0ee84e2fd4c8e9f3606f23f68112 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/type-utils@npm:8.30.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.30.1" + "@typescript-eslint/utils": "npm:8.30.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/c233d2b0b06bd8eca4ee38aebb7544d4084143590328f38c00302f98a62b06868394d4ab1cd798af68d5a47efd84976cc14d415e9e519396dc89aa8d4d47c9ee + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/types@npm:8.30.1" + checksum: 10c0/461e800bf911c24d9b61bdbeed897921454acc0c24b4e8a79f943c14234241828c13a31dce31dcce77511185f806a2fb94769075e122e3182ba5a32dd55573eb + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/types@npm:8.45.0" + checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.30.1" + dependencies: + "@typescript-eslint/types": "npm:8.30.1" + "@typescript-eslint/visitor-keys": "npm:8.30.1" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/9eb0b1bc4b5df37c84ac411d77ce0edf934b5fdde021ed45c984aa7894132ff7a276d2b95e2d29ef84c411df8ecdf096eec3e07ec1ee5b1fa8c623d40a82ecf0 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.45.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.45.0" + "@typescript-eslint/tsconfig-utils": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/8c2f44a00fe859a6cd4b50157c484c5b6a1c7af5d48e89ae79c5f4924947964962fc8f478ad4c2ade788907fceee9b72d4e376508ea79b51392f91082a37d239 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/utils@npm:8.30.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.30.1" + "@typescript-eslint/types": "npm:8.30.1" + "@typescript-eslint/typescript-estree": "npm:8.30.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/ad54aa386edc2e19957c73ef25eea3e263e7e15e941c72e91ca6c8ea2536979d343a6069de0e40b15f0e732ddaacbfcc3d5f25a1583e11a32120c42c471802ea + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.30.1": + version: 8.30.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.30.1" + dependencies: + "@typescript-eslint/types": "npm:8.30.1" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/bdc182289c68a5c8f891f9aecf6ccb59743c3f2b1bbe57f57f8c7ce1688f4381182e301919895cefc929539eea914eeb847f7d351cdc3f685ed6c5ee67a10c9e + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.45.0" + dependencies: + "@typescript-eslint/types": "npm:8.45.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/119adcf50c902dad7f7757bcdd88fad0a23a171d309d9b7cefe78af12e451cf84c04ae611f4c31f7e23f16c2b47665ad92e6e5648fc77d542ef306f465bf1f29 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a + languageName: node + linkType: hard + +"@vitejs/plugin-react@npm:^4.3.4": + version: 4.3.4 + resolution: "@vitejs/plugin-react@npm:4.3.4" + dependencies: + "@babel/core": "npm:^7.26.0" + "@babel/plugin-transform-react-jsx-self": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-source": "npm:^7.25.9" + "@types/babel__core": "npm:^7.20.5" + react-refresh: "npm:^0.14.2" + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + checksum: 10c0/38a47a1dbafae0b97142943d83ee3674cb3331153a60b1a3fd29d230c12c9dfe63b7c345b231a3450168ed8a9375a9a1a253c3d85e9efdc19478c0d56b98496c + languageName: node + linkType: hard + +"@vitest/expect@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/expect@npm:3.1.2" + dependencies: + "@vitest/spy": "npm:3.1.2" + "@vitest/utils": "npm:3.1.2" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/63507f77b225196d79f5aabedbb10f93974808a2b507661b66def95e803e6f7f958049e9b985d2d5fee83317f157f8018fea6e1240c64a5fec8e9753235ad081 + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/mocker@npm:3.1.2" + dependencies: + "@vitest/spy": "npm:3.1.2" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/4447962d7e160d774cf5b1eef03067230b5e36131e3441d3dd791ad38b6c06e16940f21fa20c311c58b635ba376ffb45d003b6f04d0d4cc0d7c4be854df4b8e4 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.1.2, @vitest/pretty-format@npm:^3.1.2": + version: 3.1.2 + resolution: "@vitest/pretty-format@npm:3.1.2" + dependencies: + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/f4a79be6d5a1a0b3215ba66b3cc62b2e0fc3a81b4eee07b2644600450b796a8630ee86180691391a5597c9a792f3d213d54f2043f4a0809a9386473bfcca85fb + languageName: node + linkType: hard + +"@vitest/runner@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/runner@npm:3.1.2" + dependencies: + "@vitest/utils": "npm:3.1.2" + pathe: "npm:^2.0.3" + checksum: 10c0/7312013c87a6869d07380506e808f686ab04cb989f8ae6d3c7ea16a4990fce715801c8c4d5836612706a9e8a2e5ed01629d728360fba035d8f2570a90b0050cd + languageName: node + linkType: hard + +"@vitest/snapshot@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/snapshot@npm:3.1.2" + dependencies: + "@vitest/pretty-format": "npm:3.1.2" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10c0/f3e451ec41eb54ace4c08f3dc3dbd3c283ff73b4c8eab899bb6bcd6589bf864bcaa33afb611751a76c87c5ca31fb3420511633fb7fb06af2692a70e6c8578db2 + languageName: node + linkType: hard + +"@vitest/spy@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/spy@npm:3.1.2" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10c0/0f827970c34e256f3af964df5a5133c181ef1475b73a15b47565ad3187e4b2627e949e632c21e34a694e16b98ceb1e670f5e7dc99baeb53cb029578147d4ccee + languageName: node + linkType: hard + +"@vitest/utils@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/utils@npm:3.1.2" + dependencies: + "@vitest/pretty-format": "npm:3.1.2" + loupe: "npm:^3.1.3" + tinyrainbow: "npm:^2.0.0" + checksum: 10c0/9e778ab7cf483396d650ddd079e702af6b9f087443a99045707865bf433cfa3c4f468d94d17a44173e6adcc5cce218a1b0073d1b94bbd84a03262033e427336d + languageName: node + linkType: hard + +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn@npm:^8.9.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + is-string: "npm:^1.0.7" + checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 + languageName: node + linkType: hard + +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-shim-unscopables: "npm:^1.1.0" + checksum: 10c0/82559310d2e57ec5f8fc53d7df420e3abf0ba497935de0a5570586035478ba7d07618cb18e2d4ada2da514c8fb98a034aaf5c06caa0a57e2f7f4c4adedef5956 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf + languageName: node + linkType: hard + +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + languageName: node + linkType: hard + +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001713 + resolution: "caniuse-lite@npm:1.0.30001713" + checksum: 10c0/f5468abfe73ce30e29cc8bde2ea67df2aab69032bdd93345e0640efefb76b7901c84fe1d28d591a797e65fe52fc24cae97060bb5552f9f9740322aff95ce2f9d + languageName: node + linkType: hard + +"chai@npm:^5.2.0": + version: 5.2.0 + resolution: "chai@npm:5.2.0" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/dfd1cb719c7cebb051b727672d382a35338af1470065cb12adb01f4ee451bbf528e0e0f9ab2016af5fc1eea4df6e7f4504dc8443f8f00bd8fb87ad32dc516f7d + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"commander@npm:7": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie@npm:^1.0.1": + version: 1.0.2 + resolution: "cookie@npm:1.0.2" + checksum: 10c0/fd25fe79e8fbcfcaf6aa61cd081c55d144eeeba755206c058682257cb38c4bd6795c6620de3f064c740695bb65b7949ebb1db7a95e4636efb8357a335ad3f54b + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + +"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.0": + version: 3.2.4 + resolution: "d3-array@npm:3.2.4" + dependencies: + internmap: "npm:1 - 2" + checksum: 10c0/08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50 + languageName: node + linkType: hard + +"d3-axis@npm:3": + version: 3.0.0 + resolution: "d3-axis@npm:3.0.0" + checksum: 10c0/a271e70ba1966daa5aaf6a7f959ceca3e12997b43297e757c7b945db2e1ead3c6ee226f2abcfa22abbd4e2e28bd2b71a0911794c4e5b911bbba271328a582c78 + languageName: node + linkType: hard + +"d3-brush@npm:3": + version: 3.0.0 + resolution: "d3-brush@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-drag: "npm:2 - 3" + d3-interpolate: "npm:1 - 3" + d3-selection: "npm:3" + d3-transition: "npm:3" + checksum: 10c0/07baf00334c576da2f68a91fc0da5732c3a5fa19bd3d7aed7fd24d1d674a773f71a93e9687c154176f7246946194d77c48c2d8fed757f5dcb1a4740067ec50a8 + languageName: node + linkType: hard + +"d3-chord@npm:3": + version: 3.0.1 + resolution: "d3-chord@npm:3.0.1" + dependencies: + d3-path: "npm:1 - 3" + checksum: 10c0/baa6013914af3f4fe1521f0d16de31a38eb8a71d08ff1dec4741f6f45a828661e5cd3935e39bd14e3032bdc78206c283ca37411da21d46ec3cfc520be6e7a7ce + languageName: node + linkType: hard + +"d3-color@npm:1 - 3, d3-color@npm:3": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c + languageName: node + linkType: hard + +"d3-contour@npm:4": + version: 4.0.2 + resolution: "d3-contour@npm:4.0.2" + dependencies: + d3-array: "npm:^3.2.0" + checksum: 10c0/98bc5fbed6009e08707434a952076f39f1cd6ed8b9288253cc3e6a3286e4e80c63c62d84954b20e64bf6e4ededcc69add54d3db25e990784a59c04edd3449032 + languageName: node + linkType: hard + +"d3-delaunay@npm:6": + version: 6.0.4 + resolution: "d3-delaunay@npm:6.0.4" + dependencies: + delaunator: "npm:5" + checksum: 10c0/57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754 + languageName: node + linkType: hard + +"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": + version: 3.0.1 + resolution: "d3-dispatch@npm:3.0.1" + checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753 + languageName: node + linkType: hard + +"d3-drag@npm:2 - 3, d3-drag@npm:3": + version: 3.0.0 + resolution: "d3-drag@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-selection: "npm:3" + checksum: 10c0/d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa + languageName: node + linkType: hard + +"d3-dsv@npm:1 - 3, d3-dsv@npm:3": + version: 3.0.1 + resolution: "d3-dsv@npm:3.0.1" + dependencies: + commander: "npm:7" + iconv-lite: "npm:0.6" + rw: "npm:1" + bin: + csv2json: bin/dsv2json.js + csv2tsv: bin/dsv2dsv.js + dsv2dsv: bin/dsv2dsv.js + dsv2json: bin/dsv2json.js + json2csv: bin/json2dsv.js + json2dsv: bin/json2dsv.js + json2tsv: bin/json2dsv.js + tsv2csv: bin/dsv2dsv.js + tsv2json: bin/dsv2json.js + checksum: 10c0/10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab + languageName: node + linkType: hard + +"d3-ease@npm:1 - 3, d3-ease@npm:3": + version: 3.0.1 + resolution: "d3-ease@npm:3.0.1" + checksum: 10c0/fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0 + languageName: node + linkType: hard + +"d3-fetch@npm:3": + version: 3.0.1 + resolution: "d3-fetch@npm:3.0.1" + dependencies: + d3-dsv: "npm:1 - 3" + checksum: 10c0/4f467a79bf290395ac0cbb5f7562483f6a18668adc4c8eb84c9d3eff048b6f6d3b6f55079ba1ebf1908dabe000c941d46be447f8d78453b2dad5fb59fb6aa93b + languageName: node + linkType: hard + +"d3-force@npm:3": + version: 3.0.0 + resolution: "d3-force@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-quadtree: "npm:1 - 3" + d3-timer: "npm:1 - 3" + checksum: 10c0/220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf + languageName: node + linkType: hard + +"d3-format@npm:1 - 3, d3-format@npm:3": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: 10c0/049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75 + languageName: node + linkType: hard + +"d3-geo@npm:3": + version: 3.1.1 + resolution: "d3-geo@npm:3.1.1" + dependencies: + d3-array: "npm:2.5.0 - 3" + checksum: 10c0/d32270dd2dc8ac3ea63e8805d63239c4c8ec6c0d339d73b5e5a30a87f8f54db22a78fb434369799465eae169503b25f9a107c642c8a16c32a3285bc0e6d8e8c1 + languageName: node + linkType: hard + +"d3-hierarchy@npm:3": + version: 3.1.2 + resolution: "d3-hierarchy@npm:3.1.2" + checksum: 10c0/6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf + languageName: node + linkType: hard + +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a + languageName: node + linkType: hard + +"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 10c0/dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da + languageName: node + linkType: hard + +"d3-polygon@npm:3": + version: 3.0.1 + resolution: "d3-polygon@npm:3.0.1" + checksum: 10c0/e236aa7f33efa9a4072907af7dc119f85b150a0716759d4fe5f12f62573018264a6cbde8617fbfa6944a7ae48c1c0c8d3f39ae72e11f66dd471e9b5e668385df + languageName: node + linkType: hard + +"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": + version: 3.0.1 + resolution: "d3-quadtree@npm:3.0.1" + checksum: 10c0/18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090 + languageName: node + linkType: hard + +"d3-random@npm:3": + version: 3.0.1 + resolution: "d3-random@npm:3.0.1" + checksum: 10c0/987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41 + languageName: node + linkType: hard + +"d3-scale-chromatic@npm:3": + version: 3.1.0 + resolution: "d3-scale-chromatic@npm:3.1.0" + dependencies: + d3-color: "npm:1 - 3" + d3-interpolate: "npm:1 - 3" + checksum: 10c0/9a3f4671ab0b971f4a411b42180d7cf92bfe8e8584e637ce7e698d705e18d6d38efbd20ec64f60cc0dfe966c20d40fc172565bc28aaa2990c0a006360eed91af + languageName: node + linkType: hard + +"d3-scale@npm:4": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" + dependencies: + d3-array: "npm:2.10.0 - 3" + d3-format: "npm:1 - 3" + d3-interpolate: "npm:1.2.0 - 3" + d3-time: "npm:2.1.1 - 3" + d3-time-format: "npm:2 - 4" + checksum: 10c0/65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1 + languageName: node + linkType: hard + +"d3-selection@npm:2 - 3, d3-selection@npm:3": + version: 3.0.0 + resolution: "d3-selection@npm:3.0.0" + checksum: 10c0/e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b + languageName: node + linkType: hard + +"d3-shape@npm:3": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: "npm:^3.1.0" + checksum: 10c0/f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132 + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 4, d3-time-format@npm:4": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" + dependencies: + d3-time: "npm:1 - 3" + checksum: 10c0/735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206 + languageName: node + linkType: hard + +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" + dependencies: + d3-array: "npm:2 - 3" + checksum: 10c0/a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1 + languageName: node + linkType: hard + +"d3-timer@npm:1 - 3, d3-timer@npm:3": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a + languageName: node + linkType: hard + +"d3-transition@npm:2 - 3, d3-transition@npm:3": + version: 3.0.1 + resolution: "d3-transition@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + d3-dispatch: "npm:1 - 3" + d3-ease: "npm:1 - 3" + d3-interpolate: "npm:1 - 3" + d3-timer: "npm:1 - 3" + peerDependencies: + d3-selection: 2 - 3 + checksum: 10c0/4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad + languageName: node + linkType: hard + +"d3-zoom@npm:3": + version: 3.0.0 + resolution: "d3-zoom@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-drag: "npm:2 - 3" + d3-interpolate: "npm:1 - 3" + d3-selection: "npm:2 - 3" + d3-transition: "npm:2 - 3" + checksum: 10c0/ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3 + languageName: node + linkType: hard + +"d3@npm:^7.8.5": + version: 7.9.0 + resolution: "d3@npm:7.9.0" + dependencies: + d3-array: "npm:3" + d3-axis: "npm:3" + d3-brush: "npm:3" + d3-chord: "npm:3" + d3-color: "npm:3" + d3-contour: "npm:4" + d3-delaunay: "npm:6" + d3-dispatch: "npm:3" + d3-drag: "npm:3" + d3-dsv: "npm:3" + d3-ease: "npm:3" + d3-fetch: "npm:3" + d3-force: "npm:3" + d3-format: "npm:3" + d3-geo: "npm:3" + d3-hierarchy: "npm:3" + d3-interpolate: "npm:3" + d3-path: "npm:3" + d3-polygon: "npm:3" + d3-quadtree: "npm:3" + d3-random: "npm:3" + d3-scale: "npm:4" + d3-scale-chromatic: "npm:3" + d3-selection: "npm:3" + d3-shape: "npm:3" + d3-time: "npm:3" + d3-time-format: "npm:4" + d3-timer: "npm:3" + d3-transition: "npm:3" + d3-zoom: "npm:3" + checksum: 10c0/3dd9c08c73cfaa69c70c49e603c85e049c3904664d9c79a1a52a0f52795828a1ff23592dc9a7b2257e711d68a615472a13103c212032f38e016d609796e087e8 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 + languageName: node + linkType: hard + +"debug@npm:4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"delaunator@npm:5": + version: 5.0.1 + resolution: "delaunator@npm:5.0.1" + dependencies: + robust-predicates: "npm:^3.0.2" + checksum: 10c0/3d7ea4d964731c5849af33fec0a271bc6753487b331fd7d43ccb17d77834706e1c383e6ab8fda0032da955e7576d1083b9603cdaf9cbdfd6b3ebd1fb8bb675a5 + languageName: node + linkType: hard + +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.3": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.136 + resolution: "electron-to-chromium@npm:1.5.136" + checksum: 10c0/6a207e397638b0428b31c87d409a73f6bd953598cb7359ee4c3c175e645c3ae0cc99fc5128eaca19e2f1052200fd016eb4bb1012a55e5824eb1dce85b0396184 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.18.1": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.6" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.4" + safe-array-concat: "npm:^1.1.3" + checksum: 10c0/97e3125ca472d82d8aceea11b790397648b52c26d8768ea1c1ee6309ef45a8755bb63225a43f3150c7591cffc17caf5752459f1e70d583b4184370a8f04ebd2f + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.6.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^10.1.2": + version: 10.1.2 + resolution: "eslint-config-prettier@npm:10.1.2" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/c22c8e29193cc8fd70becf1c2dd072513f2b3004a175c2a49404c79d1745ba4dc0edc2afd00d16b0e26d24f95813a0469e7445a25104aec218f6d84cdb1697e9 + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.31.0": + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^5.2.0": + version: 5.2.0 + resolution: "eslint-plugin-react-hooks@npm:5.2.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 10c0/1c8d50fa5984c6dea32470651807d2922cc3934cf3425e78f84a24c2dfd972e7f019bee84aefb27e0cf2c13fea0ac1d4473267727408feeb1c56333ca1489385 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.37.5": + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.2.1" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.9" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 + languageName: node + linkType: hard + +"eslint@npm:^8.57.1": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"expect-type@npm:^1.2.1": + version: 1.2.1 + resolution: "expect-type@npm:1.2.1" + checksum: 10c0/b775c9adab3c190dd0d398c722531726cdd6022849b4adba19dceab58dda7e000a7c6c872408cd73d665baa20d381eca36af4f7b393a4ba60dd10232d1fb8898 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.19.1 + resolution: "fastq@npm:1.19.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 + languageName: node + linkType: hard + +"fdir@npm:^6.4.4": + version: 6.4.4 + resolution: "fdir@npm:6.4.4" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/6ccc33be16945ee7bc841e1b4178c0b4cf18d3804894cb482aa514651c962a162f96da7ffc6ebfaf0df311689fb70091b04dd6caffe28d56b9ebdc0e7ccadfdd + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"fs-extra@npm:^11.1.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 + languageName: node + linkType: hard + +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 10c0/8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed + languageName: node + linkType: hard + +"ip-address@npm:^10.0.1": + version: 10.0.1 + resolution: "ip-address@npm:10.0.1" + checksum: 10c0/1634d79dae18394004775cb6d699dc46b7c23df6d2083164025a2b15240c1164fccde53d0e08bd5ee4fc53913d033ab6b5e395a809ad4b956a940c446e948843 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db + languageName: node + linkType: hard + +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-darwin-arm64@npm:1.29.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-darwin-x64@npm:1.29.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-freebsd-x64@npm:1.29.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.29.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm64-gnu@npm:1.29.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-arm64-musl@npm:1.29.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-x64-gnu@npm:1.29.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-linux-x64-musl@npm:1.29.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-win32-arm64-msvc@npm:1.29.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss-win32-x64-msvc@npm:1.29.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:1.29.2": + version: 1.29.2 + resolution: "lightningcss@npm:1.29.2" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-darwin-arm64: "npm:1.29.2" + lightningcss-darwin-x64: "npm:1.29.2" + lightningcss-freebsd-x64: "npm:1.29.2" + lightningcss-linux-arm-gnueabihf: "npm:1.29.2" + lightningcss-linux-arm64-gnu: "npm:1.29.2" + lightningcss-linux-arm64-musl: "npm:1.29.2" + lightningcss-linux-x64-gnu: "npm:1.29.2" + lightningcss-linux-x64-musl: "npm:1.29.2" + lightningcss-win32-arm64-msvc: "npm:1.29.2" + lightningcss-win32-x64-msvc: "npm:1.29.2" + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/e06bb99c98e9f56cfcf37b5ce0e0198cdeeac2993ef2e5b878b6b0934fff54c7528f38bf8875e7bd71e64c9b20b29c0cada222d1e0089c8f94c1159bbb5d611f + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"loupe@npm:^3.1.0, loupe@npm:^3.1.3": + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 10c0/f5dab4144254677de83a35285be1b8aba58b3861439ce4ba65875d0d5f3445a4a496daef63100ccf02b2dbc25bf58c6db84c9cb0b96d6435331e9d0a33b48541 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.8": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.5.0 + resolution: "node-gyp@npm:11.5.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + tinyglobby: "npm:^0.2.12" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/31ff49586991b38287bb15c3d529dd689cfc32f992eed9e6997b9d712d5d21fe818a8b1bbfe3b76a7e33765c20210c5713212f4aa329306a615b87d8a786da3a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc + languageName: node + linkType: hard + +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c + languageName: node + linkType: hard + +"object.values@npm:^1.1.6, object.values@npm:^1.2.0, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map@npm:^7.0.2, p-map@npm:^7.0.3": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 + languageName: node + linkType: hard + +"postcss@npm:^8.4.43": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" + dependencies: + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier@npm:^3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"react-dom@npm:^19.1.0": + version: 19.1.0 + resolution: "react-dom@npm:19.1.0" + dependencies: + scheduler: "npm:^0.26.0" + peerDependencies: + react: ^19.1.0 + checksum: 10c0/3e26e89bb6c67c9a6aa86cb888c7a7f8258f2e347a6d2a15299c17eb16e04c19194e3452bc3255bd34000a61e45e2cb51e46292392340432f133e5a5d2dfb5fc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.2": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb + languageName: node + linkType: hard + +"react-router-dom@npm:^7.5.1": + version: 7.5.1 + resolution: "react-router-dom@npm:7.5.1" + dependencies: + react-router: "npm:7.5.1" + peerDependencies: + react: ">=18" + react-dom: ">=18" + checksum: 10c0/52446158f883b599385f4feb2e11491440b350bc67e3b39b9eb79f76c20706075c813c3f9383b24a56a24dc2f22e9ee1c9910019b775248aa99485bcb6933e0e + languageName: node + linkType: hard + +"react-router@npm:7.5.1": + version: 7.5.1 + resolution: "react-router@npm:7.5.1" + dependencies: + cookie: "npm:^1.0.1" + set-cookie-parser: "npm:^2.6.0" + turbo-stream: "npm:2.4.0" + peerDependencies: + react: ">=18" + react-dom: ">=18" + peerDependenciesMeta: + react-dom: + optional: true + checksum: 10c0/54e9f77ede0bf36c12685a59c5d965f77f2223d01cd922ce7b6ef4f8fa5435e66c796f9f5da3487bde0cb98dadd64f5a406696d4f52e031af812857aaab0f76b + languageName: node + linkType: hard + +"react@npm:^19.1.0": + version: 19.1.0 + resolution: "react@npm:19.1.0" + checksum: 10c0/530fb9a62237d54137a13d2cfb67a7db6a2156faed43eecc423f4713d9b20c6f2728b026b45e28fcd72e8eadb9e9ed4b089e99f5e295d2f0ad3134251bdd3698 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 + languageName: node + linkType: hard + +"report@workspace:.": + version: 0.0.0-use.local + resolution: "report@workspace:." + dependencies: + "@radix-ui/react-tooltip": "npm:^1.2.7" + "@tailwindcss/vite": "npm:^4.1.4" + "@types/d3": "npm:^7.4.3" + "@types/lodash": "npm:^4.17.16" + "@types/node": "npm:^20.11.24" + "@types/react": "npm:^19.1.0" + "@types/react-dom": "npm:^19.1.2" + "@typescript-eslint/eslint-plugin": "npm:^8.30.1" + "@typescript-eslint/parser": "npm:^8.45.0" + "@vitejs/plugin-react": "npm:^4.3.4" + clsx: "npm:^2.1.1" + d3: "npm:^7.8.5" + eslint: "npm:^8.57.1" + eslint-config-prettier: "npm:^10.1.2" + eslint-plugin-import: "npm:^2.31.0" + eslint-plugin-react: "npm:^7.37.5" + eslint-plugin-react-hooks: "npm:^5.2.0" + lodash: "npm:^4.17.21" + prettier: "npm:^3.5.3" + react: "npm:^19.1.0" + react-dom: "npm:^19.1.0" + react-router-dom: "npm:^7.5.1" + swr: "npm:^2.3.3" + tailwindcss: "npm:^4.1.4" + typescript: "npm:^5.3.3" + vite: "npm:^5.1.4" + vite-plugin-static-copy: "npm:^2.3.1" + vitest: "npm:^3.1.2" + languageName: unknown + linkType: soft + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve@npm:^1.22.4": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"robust-predicates@npm:^3.0.2": + version: 3.0.2 + resolution: "robust-predicates@npm:3.0.2" + checksum: 10c0/4ecd53649f1c2d49529c85518f2fa69ffb2f7a4453f7fd19c042421c7b4d76c3efb48bc1c740c8f7049346d7cb58cf08ee0c9adaae595cc23564d360adb1fde4 + languageName: node + linkType: hard + +"rollup@npm:^4.20.0": + version: 4.39.0 + resolution: "rollup@npm:4.39.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.39.0" + "@rollup/rollup-android-arm64": "npm:4.39.0" + "@rollup/rollup-darwin-arm64": "npm:4.39.0" + "@rollup/rollup-darwin-x64": "npm:4.39.0" + "@rollup/rollup-freebsd-arm64": "npm:4.39.0" + "@rollup/rollup-freebsd-x64": "npm:4.39.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.39.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.39.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.39.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.39.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.39.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.39.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-x64-musl": "npm:4.39.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.39.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.39.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.39.0" + "@types/estree": "npm:1.0.7" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/2dc0c23ca04bd00295035b405c977261559aed8acc9902ee9ff44e4a6b54734fcb64999c32143c43804dcb543da7983032831b893a902633b006c21848a093ce + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rw@npm:1": + version: 1.3.3 + resolution: "rw@npm:1.3.3" + checksum: 10c0/b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"scheduler@npm:^0.26.0": + version: 0.26.0 + resolution: "scheduler@npm:0.26.0" + checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 + languageName: node + linkType: hard + +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e + languageName: node + linkType: hard + +"semver@npm:^7.6.0": + version: 7.7.2 + resolution: "semver@npm:7.7.2" + bin: + semver: bin/semver.js + checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea + languageName: node + linkType: hard + +"set-cookie-parser@npm:^2.6.0": + version: 2.7.1 + resolution: "set-cookie-parser@npm:2.7.1" + checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.7 + resolution: "socks@npm:2.8.7" + dependencies: + ip-address: "npm:^10.0.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"std-env@npm:^3.9.0": + version: 3.9.0 + resolution: "std-env@npm:3.9.0" + checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.3" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"swr@npm:^2.3.3": + version: 2.3.3 + resolution: "swr@npm:2.3.3" + dependencies: + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/882fc8291912860e0c50eae3470ebf0cd58b0144cb12adcc4b14c5cef913ea06479043830508d8b0b3d4061d99ad8dd52485c9c879fbd4e9b893484e6d8da9e3 + languageName: node + linkType: hard + +"tailwindcss@npm:4.1.4, tailwindcss@npm:^4.1.4": + version: 4.1.4 + resolution: "tailwindcss@npm:4.1.4" + checksum: 10c0/4927653b740861f0279b6b465c87e188652d3c0e311c633b4efe5d72bbb4dce12b9dddc674a386a3d0454ef4dd4951aac6fd7346dcd9b2b2b06952e431c1835d + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.5.1 + resolution: "tar@npm:7.5.1" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/0dad0596a61586180981133b20c32cfd93c5863c5b7140d646714e6ea8ec84583b879e5dc3928a4d683be6e6109ad7ea3de1cf71986d5194f81b3a016c8858c9 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.13": + version: 0.2.13 + resolution: "tinyglobby@npm:0.2.13" + dependencies: + fdir: "npm:^6.4.4" + picomatch: "npm:^4.0.2" + checksum: 10c0/ef07dfaa7b26936601d3f6d999f7928a4d1c6234c5eb36896bb88681947c0d459b7ebe797022400e555fe4b894db06e922b95d0ce60cb05fd827a0a66326b18c + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10c0/31ac184c0ff1cf9a074741254fe9ea6de95026749eb2b8ec6fd2b9d8ca94abdccda731f8e102e7f32e72ed3b36d32c6975fd5f5523df3f1b6de6c3d8dfd95e63 + languageName: node + linkType: hard + +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10c0/c83c52bef4e0ae7fb8ec6a722f70b5b6fa8d8be1c85792e829f56c0e1be94ab70b293c032dc5048d4d37cfe678f1f5babb04bdc65fd123098800148ca989184f + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.0.1, ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + languageName: node + linkType: hard + +"tslib@npm:^2.4.0, tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"turbo-stream@npm:2.4.0": + version: 2.4.0 + resolution: "turbo-stream@npm:2.4.0" + checksum: 10c0/e68b2569f1f16e6e9633d090c6024b2ae9f0e97bfeacb572451ca3732e120ebbb546f3bc4afc717c46cb57b5aea6104e04ef497f9912eef6a7641e809518e98a + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 + languageName: node + linkType: hard + +"typescript@npm:^5.3.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.4.0": + version: 1.5.0 + resolution: "use-sync-external-store@npm:1.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + languageName: node + linkType: hard + +"vite-node@npm:3.1.2": + version: 3.1.2 + resolution: "vite-node@npm:3.1.2" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/eb0788b43a241c69ca23ba6cf5ab5226157947938dc4e02247b2008e1fd425e45a347d3caac7d53e0b804beb4c9e97395908fd87c1f23bda1590e1b011c63edb + languageName: node + linkType: hard + +"vite-plugin-static-copy@npm:^2.3.1": + version: 2.3.1 + resolution: "vite-plugin-static-copy@npm:2.3.1" + dependencies: + chokidar: "npm:^3.5.3" + fast-glob: "npm:^3.2.11" + fs-extra: "npm:^11.1.0" + p-map: "npm:^7.0.3" + picocolors: "npm:^1.0.0" + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + checksum: 10c0/21bc3823b70534c09c73ff272851329242fa4e307160681950883afca78b1bb4aa156c1a81431a3cb72ad1a81d49293a63b4e3c10d19e22ec3bfbc80099cae94 + languageName: node + linkType: hard + +"vite@npm:^5.0.0 || ^6.0.0, vite@npm:^5.1.4": + version: 5.4.18 + resolution: "vite@npm:5.4.18" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/a8cbbec6bdf399e62c386d70b8485e4f2f1b427beb19bc7c5d52b402a0c3750b7ff469fc20a8333755ea13bc1b0af5df3f22c8fd37d1739ee51d709b7a4740b6 + languageName: node + linkType: hard + +"vitest@npm:^3.1.2": + version: 3.1.2 + resolution: "vitest@npm:3.1.2" + dependencies: + "@vitest/expect": "npm:3.1.2" + "@vitest/mocker": "npm:3.1.2" + "@vitest/pretty-format": "npm:^3.1.2" + "@vitest/runner": "npm:3.1.2" + "@vitest/snapshot": "npm:3.1.2" + "@vitest/spy": "npm:3.1.2" + "@vitest/utils": "npm:3.1.2" + chai: "npm:^5.2.0" + debug: "npm:^4.4.0" + expect-type: "npm:^1.2.1" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + std-env: "npm:^3.9.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.13" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.1.2" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.1.2 + "@vitest/ui": 3.1.2 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/14b9c99812282d88b6e1dafde8cca22b07dcefa0a00d240145cf5cb95b082c287807bd884f417a046992bc74246aaf64662fd07179e60547c9277fbc8986439b + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard diff --git a/runner/service.go b/runner/service.go index dcaf325..7c186f5 100644 --- a/runner/service.go +++ b/runner/service.go @@ -44,6 +44,10 @@ type service struct { portState portmanager.PortManager metadataPath string + // tracks persistent test directories for reuse_existing snapshots + // key: nodeType, value: map["sequencer"|"validator"] -> directory path + persistentTestDirs map[string]map[string]string + config config.Config version string log log.Logger @@ -53,12 +57,13 @@ func NewService(version string, cfg config.Config, log log.Logger) Service { metadataPath := path.Join(cfg.OutputDir(), "metadata.json") s := &service{ - metadataPath: metadataPath, - portState: portmanager.NewPortManager(), - dataDirState: benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")), - config: cfg, - version: version, - log: log, + metadataPath: metadataPath, + portState: portmanager.NewPortManager(), + dataDirState: benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")), + persistentTestDirs: make(map[string]map[string]string), + config: cfg, + version: version, + log: log, } return s @@ -80,99 +85,130 @@ func readBenchmarkConfig(path string) (*benchmark.BenchmarkConfig, error) { return config, err } -func (s *service) setupInternalDirectories(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string) (*config.InternalClientOptions, error) { +func (s *service) setupInternalDirectories(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string, dataDirOverride string) (*config.InternalClientOptions, error) { err := os.MkdirAll(testDir, 0755) if err != nil { return nil, errors.Wrap(err, "failed to create test directory") } metricsPath := path.Join(testDir, "metrics") - err = os.Mkdir(metricsPath, 0755) + // Use MkdirAll to avoid error if directory already exists + err = os.MkdirAll(metricsPath, 0755) if err != nil { return nil, errors.Wrap(err, "failed to create metrics directory") } // write chain config to testDir/chain.json chainCfgPath := path.Join(testDir, "chain.json") - chainCfgFile, err := os.OpenFile(chainCfgPath, os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, errors.Wrap(err, "failed to open chain config file") - } + // Only create chain config if it doesn't exist (for reuse_existing) + if !s.fileExists(chainCfgPath) { + chainCfgFile, err := os.OpenFile(chainCfgPath, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return nil, errors.Wrap(err, "failed to open chain config file") + } - err = json.NewEncoder(chainCfgFile).Encode(genesis) - if err != nil { - return nil, errors.Wrap(err, "failed to write chain config") + err = json.NewEncoder(chainCfgFile).Encode(genesis) + if err != nil { + return nil, errors.Wrap(err, "failed to write chain config") + } + if err := chainCfgFile.Close(); err != nil { + return nil, errors.Wrap(err, "failed to close chain config file") + } } var dataDirPath string - isSnapshot := snapshot != nil && snapshot.Command != "" - if isSnapshot { - dataDirPath = path.Join(testDir, "data") - - initialSnapshotPath := s.dataDirState.GetInitialSnapshotPath(params.NodeType) - - if initialSnapshotPath != "" && s.fileExists(initialSnapshotPath) { - snapshotMethod := snapshot.GetSnapshotMethod() - - switch snapshotMethod { - case benchmark.SnapshotMethodReuseExisting: - dataDirPath = initialSnapshotPath - s.log.Info("Reusing existing snapshot", "snapshotPath", initialSnapshotPath, "method", snapshotMethod) - case benchmark.SnapshotMethodHeadRollback: - // For head_rollback, copy the snapshot but mark it for rollback later - err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) - if err != nil { - return nil, errors.Wrap(err, "failed to copy from initial snapshot for head rollback") + var isSnapshot bool + + // If dataDirOverride is provided, use it (already set up by caller) + if dataDirOverride != "" { + dataDirPath = dataDirOverride + isSnapshot = true // dataDirOverride is only set when using snapshots + s.log.Info("Using pre-configured datadir", "path", dataDirPath, "role", role) + } else { + isSnapshot = snapshot != nil && snapshot.Command != "" + if isSnapshot { + dataDirPath = path.Join(testDir, "data") + + initialSnapshotPath := s.dataDirState.GetInitialSnapshotPath(params.NodeType) + + if initialSnapshotPath != "" && s.fileExists(initialSnapshotPath) { + snapshotMethod := snapshot.GetSnapshotMethod() + + switch snapshotMethod { + case benchmark.SnapshotMethodReuseExisting: + dataDirPath = initialSnapshotPath + s.log.Info("Reusing existing snapshot", "snapshotPath", initialSnapshotPath, "method", snapshotMethod) + case benchmark.SnapshotMethodHeadRollback: + // For head_rollback, copy the snapshot but mark it for rollback later + err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + if err != nil { + return nil, errors.Wrap(err, "failed to copy from initial snapshot for head rollback") + } + s.log.Info("Copied from initial snapshot for head rollback", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath, "method", snapshotMethod) + default: + // Default chain_copy behavior + err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + if err != nil { + return nil, errors.Wrap(err, "failed to copy from initial snapshot") + } + s.log.Info("Copied from initial snapshot", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath) } - s.log.Info("Copied from initial snapshot for head rollback", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath, "method", snapshotMethod) - default: - // Default chain_copy behavior - err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + } else { + // Fallback to direct snapshot creation + if initialSnapshotPath != "" { + s.log.Warn("Initial snapshot path registered but doesn't exist, falling back to direct snapshot creation", + "path", initialSnapshotPath, "nodeType", params.NodeType) + } + snapshotDir, err := s.dataDirState.EnsureSnapshot(*snapshot, params.NodeType, role) if err != nil { - return nil, errors.Wrap(err, "failed to copy from initial snapshot") + return nil, errors.Wrap(err, "failed to ensure snapshot") } - s.log.Info("Copied from initial snapshot", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath) + dataDirPath = snapshotDir } } else { - // Fallback to direct snapshot creation - if initialSnapshotPath != "" { - s.log.Warn("Initial snapshot path registered but doesn't exist, falling back to direct snapshot creation", - "path", initialSnapshotPath, "nodeType", params.NodeType) - } - snapshotDir, err := s.dataDirState.EnsureSnapshot(*snapshot, params.NodeType, role) + // if no snapshot, just create a new datadir + dataDirPath = path.Join(testDir, "data") + err = os.Mkdir(dataDirPath, 0755) if err != nil { - return nil, errors.Wrap(err, "failed to ensure snapshot") + return nil, errors.Wrap(err, "failed to create data directory") } - dataDirPath = snapshotDir } + } + + jwtSecretPath := path.Join(testDir, "jwt_secret") + var jwtSecretStr string + + // Check if JWT secret already exists (for reuse_existing) + if s.fileExists(jwtSecretPath) { + jwtSecretBytes, err := os.ReadFile(jwtSecretPath) + if err != nil { + return nil, errors.Wrap(err, "failed to read existing jwt secret") + } + jwtSecretStr = string(jwtSecretBytes) + s.log.Info("Reusing existing JWT secret", "path", jwtSecretPath, "role", role) } else { - // if no snapshot, just create a new datadir - dataDirPath = path.Join(testDir, "data") - err = os.Mkdir(dataDirPath, 0755) + // Generate new JWT secret + var jwtSecret [32]byte + _, err = rand.Read(jwtSecret[:]) if err != nil { - return nil, errors.Wrap(err, "failed to create data directory") + return nil, errors.Wrap(err, "failed to generate jwt secret") } - } - - var jwtSecret [32]byte - _, err = rand.Read(jwtSecret[:]) - if err != nil { - return nil, errors.Wrap(err, "failed to generate jwt secret") - } - jwtSecretPath := path.Join(testDir, "jwt_secret") - jwtSecretFile, err := os.OpenFile(jwtSecretPath, os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, errors.Wrap(err, "failed to open jwt secret file") - } + jwtSecretFile, err := os.OpenFile(jwtSecretPath, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return nil, errors.Wrap(err, "failed to open jwt secret file") + } - _, err = jwtSecretFile.Write([]byte(hex.EncodeToString(jwtSecret[:]))) - if err != nil { - return nil, errors.Wrap(err, "failed to write jwt secret") - } + jwtSecretStr = hex.EncodeToString(jwtSecret[:]) + _, err = jwtSecretFile.Write([]byte(jwtSecretStr)) + if err != nil { + return nil, errors.Wrap(err, "failed to write jwt secret") + } - if err = jwtSecretFile.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close jwt secret file") + if err = jwtSecretFile.Close(); err != nil { + return nil, errors.Wrap(err, "failed to close jwt secret file") + } + s.log.Info("Generated new JWT secret", "path", jwtSecretPath, "role", role) } options := s.config.ClientOptions() @@ -184,7 +220,7 @@ func (s *service) setupInternalDirectories(testDir string, params types.RunParam ClientOptions: options, JWTSecretPath: jwtSecretPath, MetricsPath: metricsPath, - JWTSecret: hex.EncodeToString(jwtSecret[:]), + JWTSecret: jwtSecretStr, ChainCfgPath: chainCfgPath, DataDirPath: dataDirPath, TestDirPath: testDir, @@ -320,18 +356,56 @@ func (s *service) getGenesisForSnapshotConfig(snapshotConfig *benchmark.Snapshot return genesis, nil } -func (s *service) setupDataDirs(workingDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition) (*config.InternalClientOptions, *config.InternalClientOptions, error) { - // create temp directory for this test - testName := fmt.Sprintf("%d-%s-test", time.Now().Unix(), params.NodeType) - sequencerTestDir := path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) - validatorTestDir := path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) +func (s *service) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition) (*config.InternalClientOptions, *config.InternalClientOptions, error) { + // Special handling for SnapshotMethodReuseExisting to avoid both nodes using the same datadir + var sequencerDataDirOverride, validatorDataDirOverride string + + if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + sequencerDataDirOverride = path.Join(sequencerTestDir, "data") + validatorDataDirOverride = path.Join(validatorTestDir, "data") + + // Check if this is the first run (directories don't exist yet) + isFirstRun := !s.fileExists(sequencerDataDirOverride) && !s.fileExists(validatorDataDirOverride) + + if isFirstRun { + initialSnapshotPath := s.dataDirState.GetInitialSnapshotPath(params.NodeType) + if initialSnapshotPath != "" && s.fileExists(initialSnapshotPath) { + s.log.Info("First run with reuse_existing: copying to validator, moving to sequencer", + "initialSnapshot", initialSnapshotPath, + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) + + // First: copy from initial snapshot to validator directory + err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, validatorDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to copy initial snapshot to validator directory") + } + s.log.Info("Copied initial snapshot to validator directory", "path", validatorDataDirOverride) + + err = os.MkdirAll(sequencerTestDir, 0755) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to create sequencer test directory") + } + + err = os.Rename(initialSnapshotPath, sequencerDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to move initial snapshot to sequencer directory") + } + s.log.Info("Moved initial snapshot to sequencer directory", "from", initialSnapshotPath, "to", sequencerDataDirOverride) + } + } else { + s.log.Info("Reusing existing data directories from previous run", + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) + } + } - sequencerOptions, err := s.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer") + sequencerOptions, err := s.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", sequencerDataDirOverride) if err != nil { return nil, nil, errors.Wrap(err, "failed to setup internal directories") } - validatorOptions, err := s.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator") + validatorOptions, err := s.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", validatorDataDirOverride) if err != nil { return nil, nil, errors.Wrap(err, "failed to setup internal directories") } @@ -551,13 +625,41 @@ func (s *service) runTest(ctx context.Context, params types.RunParams, workingDi return nil, errors.Wrap(err, "failed to get genesis block") } - // create temp directory for this test - testName := fmt.Sprintf("%d-%s-test", time.Now().Unix(), params.NodeType) - sequencerTestDir := path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) - validatorTestDir := path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) + // Determine if we're using reuse_existing method + isReuseExisting := snapshotConfig != nil && snapshotConfig.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting + + var sequencerTestDir, validatorTestDir string + var testName string + + if isReuseExisting { + // For reuse_existing, use persistent test directories + if _, exists := s.persistentTestDirs[params.NodeType]; !exists { + s.persistentTestDirs[params.NodeType] = make(map[string]string) + } + + // Create or get persistent directories + if s.persistentTestDirs[params.NodeType]["sequencer"] == "" { + testName := fmt.Sprintf("persistent-%s", params.NodeType) + s.persistentTestDirs[params.NodeType]["sequencer"] = path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) + s.persistentTestDirs[params.NodeType]["validator"] = path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) + s.log.Info("Created persistent test directories to reuse snapshots", + "nodeType", params.NodeType, + "sequencer", s.persistentTestDirs[params.NodeType]["sequencer"], + "validator", s.persistentTestDirs[params.NodeType]["validator"]) + } + + sequencerTestDir = s.persistentTestDirs[params.NodeType]["sequencer"] + validatorTestDir = s.persistentTestDirs[params.NodeType]["validator"] + s.log.Info("Reusing persistent test directories", "sequencer", sequencerTestDir, "validator", validatorTestDir) + } else { + // For other methods, create temporary directories with timestamps + testName := fmt.Sprintf("%d-%s-test", time.Now().Unix(), params.NodeType) + sequencerTestDir = path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) + validatorTestDir = path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) + } // setup data directories (restore from snapshot if needed) - sequencerOptions, validatorOptions, err := s.setupDataDirs(workingDir, params, genesis, snapshotConfig) + sequencerOptions, validatorOptions, err := s.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshotConfig) if err != nil { return nil, errors.Wrap(err, "failed to setup data dirs") } @@ -568,19 +670,22 @@ func (s *service) runTest(ctx context.Context, params types.RunParams, workingDi } } - defer func() { - // clean up test directory - err := os.RemoveAll(sequencerTestDir) - if err != nil { - log.Error("failed to remove test directory", "err", err) - } + // Only cleanup directories if NOT using reuse_existing + if !isReuseExisting { + defer func() { + // clean up test directory + err := os.RemoveAll(sequencerTestDir) + if err != nil { + log.Error("failed to remove test directory", "err", err) + } - // clean up test directory - err = os.RemoveAll(validatorTestDir) - if err != nil { - log.Error("failed to remove test directory", "err", err) - } - }() + // clean up test directory + err = os.RemoveAll(validatorTestDir) + if err != nil { + log.Error("failed to remove test directory", "err", err) + } + }() + } batcherKeyBytes := common.FromHex("0xd2ba8e70072983384203c438d4e94bf399cbd88bbcafb82b61cc96ed12541707") batcherKey, err := crypto.ToECDSA(batcherKeyBytes) From be41d203725f291f936bfaafe6e5a685dc7449bb Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Mon, 27 Oct 2025 17:25:09 -0400 Subject: [PATCH 02/20] Add comma --- report/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report/vite.config.ts b/report/vite.config.ts index d7ce54d..f42c863 100644 --- a/report/vite.config.ts +++ b/report/vite.config.ts @@ -36,7 +36,7 @@ export default defineConfig(({ mode }) => { dest: "output", }, ], - }) + }), ); } else { console.log("Output directory not found, skipping static copy"); From eff0e15be78c9ddc027969eaf2d40048c7ebf5be Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Tue, 28 Oct 2025 13:03:08 -0400 Subject: [PATCH 03/20] Move datadir management to separate module --- runner/clients/reth/client.go | 2 +- runner/datadir/manager.go | 327 ++++++++++++++++++++++++++++++++ runner/service.go | 342 +++++++++------------------------- 3 files changed, 413 insertions(+), 258 deletions(-) create mode 100644 runner/datadir/manager.go diff --git a/runner/clients/reth/client.go b/runner/clients/reth/client.go index 76bf705..971e18d 100644 --- a/runner/clients/reth/client.go +++ b/runner/clients/reth/client.go @@ -90,7 +90,7 @@ func (r *RethClient) Run(ctx context.Context, cfg *types.RuntimeConfig) error { args = append(args, "--authrpc.jwtsecret", r.options.JWTSecretPath) args = append(args, "--metrics", fmt.Sprintf("%d", r.metricsPort)) args = append(args, "--engine.state-provider-metrics") - args = append(args, "-vvv") + args = append(args, "-vvvv") args = append(args, cfg.Args...) diff --git a/runner/datadir/manager.go b/runner/datadir/manager.go new file mode 100644 index 0000000..03cb3d1 --- /dev/null +++ b/runner/datadir/manager.go @@ -0,0 +1,327 @@ +package datadir + +import ( + "crypto/rand" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path" + + "github.com/base/base-bench/runner/benchmark" + "github.com/base/base-bench/runner/config" + "github.com/base/base-bench/runner/network/types" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" + "github.com/pkg/errors" +) + +// Manager handles the creation and management of test data directories +type Manager struct { + // tracks persistent test directories for reuse_existing snapshots + // key: nodeType, value: map["sequencer"|"validator"] -> TestDirConfig + persistentTestDirs map[string]map[string]*TestDirConfig + + snapshotManager benchmark.SnapshotManager + workingDir string + log log.Logger +} + +// TestDirConfig contains the configuration for a test directory +type TestDirConfig struct { + SequencerOptions *config.InternalClientOptions + ValidatorOptions *config.InternalClientOptions +} + +// NewManager creates a new DataDirManager +func NewManager(workingDir string, snapshotManager benchmark.SnapshotManager, log log.Logger) *Manager { + return &Manager{ + persistentTestDirs: make(map[string]map[string]*TestDirConfig), + snapshotManager: snapshotManager, + workingDir: workingDir, + log: log, + } +} + +// fileExists checks if a file exists +func (m *Manager) fileExists(path string) bool { + _, err := os.Stat(path) + return err == nil +} + +// SetupTestDirs sets up test directories for a benchmark run +// For reuse_existing snapshots, it creates persistent directories that will be reused across tests +// For other snapshot methods, directories will be created per-test in runTest +func (m *Manager) SetupTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*TestDirConfig, error) { + isReuseExisting := snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting + + if !isReuseExisting { + return nil, nil + } + + // For reuse_existing, create persistent directories + nodeType := params.NodeType + + if _, exists := m.persistentTestDirs[nodeType]; !exists { + m.persistentTestDirs[nodeType] = make(map[string]*TestDirConfig) + } + + // Check if we already have persistent directories for this node type + if existingConfig, exists := m.persistentTestDirs[nodeType]["config"]; exists { + m.log.Info("Reusing existing persistent test directories", "nodeType", nodeType) + return existingConfig, nil + } + + // Create new persistent directories + testName := fmt.Sprintf("persistent-%s", nodeType) + sequencerTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-sequencer", testName)) + validatorTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-validator", testName)) + + m.log.Info("Creating persistent test directories for reuse_existing", + "nodeType", nodeType, + "sequencer", sequencerTestDir, + "validator", validatorTestDir) + + // Setup data directories + sequencerOptions, validatorOptions, err := m.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshot, clientOptions) + if err != nil { + return nil, errors.Wrap(err, "failed to setup data dirs") + } + + testDirConfig := &TestDirConfig{ + SequencerOptions: sequencerOptions, + ValidatorOptions: validatorOptions, + } + + m.persistentTestDirs[nodeType]["config"] = testDirConfig + + return testDirConfig, nil +} + +// GetOrCreateTestDirs gets existing persistent directories or creates temporary ones +func (m *Manager) GetOrCreateTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions, testTimestamp int64) (*config.InternalClientOptions, *config.InternalClientOptions, bool, error) { + isReuseExisting := snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting + + if isReuseExisting { + // Return pre-configured persistent directories + if config, exists := m.persistentTestDirs[params.NodeType]["config"]; exists { + m.log.Info("Using persistent test directories", "nodeType", params.NodeType) + return config.SequencerOptions, config.ValidatorOptions, false, nil // false = don't cleanup + } + return nil, nil, false, fmt.Errorf("persistent directories not setup for node type %s", params.NodeType) + } + + // For non-reuse_existing, create temporary directories + testName := fmt.Sprintf("%d-%s-test", testTimestamp, params.NodeType) + sequencerTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-sequencer", testName)) + validatorTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-validator", testName)) + + sequencerOptions, validatorOptions, err := m.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshot, clientOptions) + if err != nil { + return nil, nil, false, errors.Wrap(err, "failed to setup data dirs") + } + + return sequencerOptions, validatorOptions, true, nil // true = cleanup after test +} + +// setupDataDirs sets up the data directories for sequencer and validator +func (m *Manager) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*config.InternalClientOptions, *config.InternalClientOptions, error) { + var sequencerDataDirOverride, validatorDataDirOverride string + + if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + sequencerDataDirOverride = path.Join(sequencerTestDir, "data") + validatorDataDirOverride = path.Join(validatorTestDir, "data") + + // Check if this is the first run (directories don't exist yet) + isFirstRun := !m.fileExists(sequencerDataDirOverride) && !m.fileExists(validatorDataDirOverride) + + if isFirstRun { + initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) + if initialSnapshotPath != "" && m.fileExists(initialSnapshotPath) { + m.log.Info("First run with reuse_existing: copying to validator, moving to sequencer", + "initialSnapshot", initialSnapshotPath, + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) + + // First: copy from initial snapshot to validator directory + err := m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, validatorDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to copy initial snapshot to validator directory") + } + m.log.Info("Copied initial snapshot to validator directory", "path", validatorDataDirOverride) + + err = os.MkdirAll(sequencerTestDir, 0755) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to create sequencer test directory") + } + + err = os.Rename(initialSnapshotPath, sequencerDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to move initial snapshot to sequencer directory") + } + m.log.Info("Moved initial snapshot to sequencer directory", "from", initialSnapshotPath, "to", sequencerDataDirOverride) + } + } else { + m.log.Info("Reusing existing data directories from previous run", + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) + } + } + + sequencerOptions, err := m.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", sequencerDataDirOverride, clientOptions) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to setup internal directories") + } + + validatorOptions, err := m.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", validatorDataDirOverride, clientOptions) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to setup internal directories") + } + + return sequencerOptions, validatorOptions, nil +} + +// setupInternalDirectories sets up the internal directory structure for a test +func (m *Manager) setupInternalDirectories(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string, dataDirOverride string, clientOptions config.ClientOptions) (*config.InternalClientOptions, error) { + err := os.MkdirAll(testDir, 0755) + if err != nil { + return nil, errors.Wrap(err, "failed to create test directory") + } + + metricsPath := path.Join(testDir, "metrics") + // Use MkdirAll to avoid error if directory already exists + err = os.MkdirAll(metricsPath, 0755) + if err != nil { + return nil, errors.Wrap(err, "failed to create metrics directory") + } + + // write chain config to testDir/chain.json + chainCfgPath := path.Join(testDir, "chain.json") + // Only create chain config if it doesn't exist (for reuse_existing) + if !m.fileExists(chainCfgPath) { + chainCfgFile, err := os.OpenFile(chainCfgPath, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return nil, errors.Wrap(err, "failed to open chain config file") + } + + err = json.NewEncoder(chainCfgFile).Encode(genesis) + if err != nil { + return nil, errors.Wrap(err, "failed to write chain config") + } + if err := chainCfgFile.Close(); err != nil { + return nil, errors.Wrap(err, "failed to close chain config file") + } + } + + var dataDirPath string + var isSnapshot bool + + // If dataDirOverride is provided, use it (already set up by caller) + if dataDirOverride != "" { + dataDirPath = dataDirOverride + isSnapshot = true // dataDirOverride is only set when using snapshots + m.log.Info("Using pre-configured datadir", "path", dataDirPath, "role", role) + } else { + isSnapshot = snapshot != nil && snapshot.Command != "" + if isSnapshot { + dataDirPath = path.Join(testDir, "data") + + initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) + + if initialSnapshotPath != "" && m.fileExists(initialSnapshotPath) { + snapshotMethod := snapshot.GetSnapshotMethod() + + switch snapshotMethod { + case benchmark.SnapshotMethodReuseExisting: + dataDirPath = initialSnapshotPath + m.log.Info("Reusing existing snapshot", "snapshotPath", initialSnapshotPath, "method", snapshotMethod) + case benchmark.SnapshotMethodHeadRollback: + // For head_rollback, copy the snapshot but mark it for rollback later + err := m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + if err != nil { + return nil, errors.Wrap(err, "failed to copy from initial snapshot for head rollback") + } + m.log.Info("Copied from initial snapshot for head rollback", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath, "method", snapshotMethod) + default: + // Default chain_copy behavior + err := m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + if err != nil { + return nil, errors.Wrap(err, "failed to copy from initial snapshot") + } + m.log.Info("Copied from initial snapshot", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath) + } + } else { + // Fallback to direct snapshot creation + if initialSnapshotPath != "" { + m.log.Warn("Initial snapshot path registered but doesn't exist, falling back to direct snapshot creation", + "path", initialSnapshotPath, "nodeType", params.NodeType) + } + snapshotDir, err := m.snapshotManager.EnsureSnapshot(*snapshot, params.NodeType, role) + if err != nil { + return nil, errors.Wrap(err, "failed to ensure snapshot") + } + dataDirPath = snapshotDir + } + } else { + // if no snapshot, just create a new datadir + dataDirPath = path.Join(testDir, "data") + err = os.Mkdir(dataDirPath, 0755) + if err != nil { + return nil, errors.Wrap(err, "failed to create data directory") + } + } + } + + jwtSecretPath := path.Join(testDir, "jwt_secret") + var jwtSecretStr string + + // Check if JWT secret already exists (for reuse_existing) + if m.fileExists(jwtSecretPath) { + jwtSecretBytes, err := os.ReadFile(jwtSecretPath) + if err != nil { + return nil, errors.Wrap(err, "failed to read existing jwt secret") + } + jwtSecretStr = string(jwtSecretBytes) + m.log.Info("Reusing existing JWT secret", "path", jwtSecretPath, "role", role) + } else { + // Generate new JWT secret + var jwtSecret [32]byte + _, err = rand.Read(jwtSecret[:]) + if err != nil { + return nil, errors.Wrap(err, "failed to generate jwt secret") + } + + jwtSecretFile, err := os.OpenFile(jwtSecretPath, os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + return nil, errors.Wrap(err, "failed to open jwt secret file") + } + + jwtSecretStr = hex.EncodeToString(jwtSecret[:]) + _, err = jwtSecretFile.Write([]byte(jwtSecretStr)) + if err != nil { + return nil, errors.Wrap(err, "failed to write jwt secret") + } + + if err = jwtSecretFile.Close(); err != nil { + return nil, errors.Wrap(err, "failed to close jwt secret file") + } + m.log.Info("Generated new JWT secret", "path", jwtSecretPath, "role", role) + } + + options := clientOptions + options = params.ClientOptions(options) + + options.SkipInit = isSnapshot + + internalOptions := &config.InternalClientOptions{ + ClientOptions: options, + JWTSecretPath: jwtSecretPath, + MetricsPath: metricsPath, + JWTSecret: jwtSecretStr, + ChainCfgPath: chainCfgPath, + DataDirPath: dataDirPath, + TestDirPath: testDir, + } + + return internalOptions, nil +} diff --git a/runner/service.go b/runner/service.go index 7c186f5..4014509 100644 --- a/runner/service.go +++ b/runner/service.go @@ -22,6 +22,7 @@ import ( "github.com/base/base-bench/runner/benchmark" "github.com/base/base-bench/runner/benchmark/portmanager" "github.com/base/base-bench/runner/config" + "github.com/base/base-bench/runner/datadir" "github.com/base/base-bench/runner/metrics" "github.com/base/base-bench/runner/network" "github.com/base/base-bench/runner/network/types" @@ -40,13 +41,10 @@ type Service interface { type service struct { // tracks the state of the datadirs for each test // this is used to avoid copying the datadirs for each test - dataDirState benchmark.SnapshotManager - portState portmanager.PortManager - metadataPath string - - // tracks persistent test directories for reuse_existing snapshots - // key: nodeType, value: map["sequencer"|"validator"] -> directory path - persistentTestDirs map[string]map[string]string + dataDirState benchmark.SnapshotManager + dataDirManager *datadir.Manager + portState portmanager.PortManager + metadataPath string config config.Config version string @@ -55,15 +53,16 @@ type service struct { func NewService(version string, cfg config.Config, log log.Logger) Service { metadataPath := path.Join(cfg.OutputDir(), "metadata.json") + snapshotManager := benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")) s := &service{ - metadataPath: metadataPath, - portState: portmanager.NewPortManager(), - dataDirState: benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")), - persistentTestDirs: make(map[string]map[string]string), - config: cfg, - version: version, - log: log, + metadataPath: metadataPath, + portState: portmanager.NewPortManager(), + dataDirState: snapshotManager, + dataDirManager: datadir.NewManager(cfg.DataDir(), snapshotManager, log), + config: cfg, + version: version, + log: log, } return s @@ -85,150 +84,6 @@ func readBenchmarkConfig(path string) (*benchmark.BenchmarkConfig, error) { return config, err } -func (s *service) setupInternalDirectories(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string, dataDirOverride string) (*config.InternalClientOptions, error) { - err := os.MkdirAll(testDir, 0755) - if err != nil { - return nil, errors.Wrap(err, "failed to create test directory") - } - - metricsPath := path.Join(testDir, "metrics") - // Use MkdirAll to avoid error if directory already exists - err = os.MkdirAll(metricsPath, 0755) - if err != nil { - return nil, errors.Wrap(err, "failed to create metrics directory") - } - - // write chain config to testDir/chain.json - chainCfgPath := path.Join(testDir, "chain.json") - // Only create chain config if it doesn't exist (for reuse_existing) - if !s.fileExists(chainCfgPath) { - chainCfgFile, err := os.OpenFile(chainCfgPath, os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, errors.Wrap(err, "failed to open chain config file") - } - - err = json.NewEncoder(chainCfgFile).Encode(genesis) - if err != nil { - return nil, errors.Wrap(err, "failed to write chain config") - } - if err := chainCfgFile.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close chain config file") - } - } - - var dataDirPath string - var isSnapshot bool - - // If dataDirOverride is provided, use it (already set up by caller) - if dataDirOverride != "" { - dataDirPath = dataDirOverride - isSnapshot = true // dataDirOverride is only set when using snapshots - s.log.Info("Using pre-configured datadir", "path", dataDirPath, "role", role) - } else { - isSnapshot = snapshot != nil && snapshot.Command != "" - if isSnapshot { - dataDirPath = path.Join(testDir, "data") - - initialSnapshotPath := s.dataDirState.GetInitialSnapshotPath(params.NodeType) - - if initialSnapshotPath != "" && s.fileExists(initialSnapshotPath) { - snapshotMethod := snapshot.GetSnapshotMethod() - - switch snapshotMethod { - case benchmark.SnapshotMethodReuseExisting: - dataDirPath = initialSnapshotPath - s.log.Info("Reusing existing snapshot", "snapshotPath", initialSnapshotPath, "method", snapshotMethod) - case benchmark.SnapshotMethodHeadRollback: - // For head_rollback, copy the snapshot but mark it for rollback later - err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) - if err != nil { - return nil, errors.Wrap(err, "failed to copy from initial snapshot for head rollback") - } - s.log.Info("Copied from initial snapshot for head rollback", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath, "method", snapshotMethod) - default: - // Default chain_copy behavior - err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) - if err != nil { - return nil, errors.Wrap(err, "failed to copy from initial snapshot") - } - s.log.Info("Copied from initial snapshot", "initialSnapshotPath", initialSnapshotPath, "dataDirPath", dataDirPath) - } - } else { - // Fallback to direct snapshot creation - if initialSnapshotPath != "" { - s.log.Warn("Initial snapshot path registered but doesn't exist, falling back to direct snapshot creation", - "path", initialSnapshotPath, "nodeType", params.NodeType) - } - snapshotDir, err := s.dataDirState.EnsureSnapshot(*snapshot, params.NodeType, role) - if err != nil { - return nil, errors.Wrap(err, "failed to ensure snapshot") - } - dataDirPath = snapshotDir - } - } else { - // if no snapshot, just create a new datadir - dataDirPath = path.Join(testDir, "data") - err = os.Mkdir(dataDirPath, 0755) - if err != nil { - return nil, errors.Wrap(err, "failed to create data directory") - } - } - } - - jwtSecretPath := path.Join(testDir, "jwt_secret") - var jwtSecretStr string - - // Check if JWT secret already exists (for reuse_existing) - if s.fileExists(jwtSecretPath) { - jwtSecretBytes, err := os.ReadFile(jwtSecretPath) - if err != nil { - return nil, errors.Wrap(err, "failed to read existing jwt secret") - } - jwtSecretStr = string(jwtSecretBytes) - s.log.Info("Reusing existing JWT secret", "path", jwtSecretPath, "role", role) - } else { - // Generate new JWT secret - var jwtSecret [32]byte - _, err = rand.Read(jwtSecret[:]) - if err != nil { - return nil, errors.Wrap(err, "failed to generate jwt secret") - } - - jwtSecretFile, err := os.OpenFile(jwtSecretPath, os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, errors.Wrap(err, "failed to open jwt secret file") - } - - jwtSecretStr = hex.EncodeToString(jwtSecret[:]) - _, err = jwtSecretFile.Write([]byte(jwtSecretStr)) - if err != nil { - return nil, errors.Wrap(err, "failed to write jwt secret") - } - - if err = jwtSecretFile.Close(); err != nil { - return nil, errors.Wrap(err, "failed to close jwt secret file") - } - s.log.Info("Generated new JWT secret", "path", jwtSecretPath, "role", role) - } - - options := s.config.ClientOptions() - options = params.ClientOptions(options) - - options.SkipInit = isSnapshot - - internalOptions := &config.InternalClientOptions{ - ClientOptions: options, - JWTSecretPath: jwtSecretPath, - MetricsPath: metricsPath, - JWTSecret: jwtSecretStr, - ChainCfgPath: chainCfgPath, - DataDirPath: dataDirPath, - TestDirPath: testDir, - } - - return internalOptions, nil -} - type TestRunMetadata struct { TestName string `json:"test_name"` Success bool `json:"success"` @@ -356,63 +211,6 @@ func (s *service) getGenesisForSnapshotConfig(snapshotConfig *benchmark.Snapshot return genesis, nil } -func (s *service) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition) (*config.InternalClientOptions, *config.InternalClientOptions, error) { - // Special handling for SnapshotMethodReuseExisting to avoid both nodes using the same datadir - var sequencerDataDirOverride, validatorDataDirOverride string - - if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { - sequencerDataDirOverride = path.Join(sequencerTestDir, "data") - validatorDataDirOverride = path.Join(validatorTestDir, "data") - - // Check if this is the first run (directories don't exist yet) - isFirstRun := !s.fileExists(sequencerDataDirOverride) && !s.fileExists(validatorDataDirOverride) - - if isFirstRun { - initialSnapshotPath := s.dataDirState.GetInitialSnapshotPath(params.NodeType) - if initialSnapshotPath != "" && s.fileExists(initialSnapshotPath) { - s.log.Info("First run with reuse_existing: copying to validator, moving to sequencer", - "initialSnapshot", initialSnapshotPath, - "sequencerDataDir", sequencerDataDirOverride, - "validatorDataDir", validatorDataDirOverride) - - // First: copy from initial snapshot to validator directory - err := s.dataDirState.CopyFromInitialSnapshot(initialSnapshotPath, validatorDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to copy initial snapshot to validator directory") - } - s.log.Info("Copied initial snapshot to validator directory", "path", validatorDataDirOverride) - - err = os.MkdirAll(sequencerTestDir, 0755) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to create sequencer test directory") - } - - err = os.Rename(initialSnapshotPath, sequencerDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to move initial snapshot to sequencer directory") - } - s.log.Info("Moved initial snapshot to sequencer directory", "from", initialSnapshotPath, "to", sequencerDataDirOverride) - } - } else { - s.log.Info("Reusing existing data directories from previous run", - "sequencerDataDir", sequencerDataDirOverride, - "validatorDataDir", validatorDataDirOverride) - } - } - - sequencerOptions, err := s.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", sequencerDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup internal directories") - } - - validatorOptions, err := s.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", validatorDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup internal directories") - } - - return sequencerOptions, validatorOptions, nil -} - func (s *service) setupBlobsDir(workingDir string) error { // create temp directory for blobs blobsDir := path.Join(workingDir, "blobs") @@ -447,6 +245,59 @@ func (s *service) setupInitialSnapshots(testPlans []benchmark.TestPlan) error { return nil } +func (s *service) setupPersistentTestDirs(testPlans []benchmark.TestPlan) error { + // Collect all test runs that use reuse_existing snapshots + testRunsWithReuseExisting := make(map[string]struct { + params types.RunParams + genesis *core.Genesis + snapshot *benchmark.SnapshotDefinition + }) + + for _, testPlan := range testPlans { + for _, run := range testPlan.Runs { + // Find the appropriate snapshot for this node type + var snapshotConfig *benchmark.SnapshotDefinition + for _, s := range testPlan.InitialSnapshots { + if s.NodeType == run.Params.NodeType { + snapshotConfig = &s + break + } + } + + // Only setup if using reuse_existing method + if snapshotConfig != nil && snapshotConfig.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + // Get genesis for this snapshot + genesis, err := s.getGenesisForSnapshotConfig(snapshotConfig) + if err != nil { + return errors.Wrap(err, "failed to get genesis block") + } + + testRunsWithReuseExisting[run.Params.NodeType] = struct { + params types.RunParams + genesis *core.Genesis + snapshot *benchmark.SnapshotDefinition + }{ + params: run.Params, + genesis: genesis, + snapshot: snapshotConfig, + } + } + } + } + + // Setup persistent directories for each unique node type with reuse_existing + for nodeType, runInfo := range testRunsWithReuseExisting { + s.log.Info("Setting up persistent test directories", "nodeType", nodeType) + _, err := s.dataDirManager.SetupTestDirs(runInfo.params, runInfo.genesis, runInfo.snapshot, s.config.ClientOptions()) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("failed to setup persistent test directories for node type %s", nodeType)) + } + s.log.Info("Persistent test directories setup completed", "nodeType", nodeType) + } + + return nil +} + func (s *service) detectSnapshotHeadBlocks(testPlans []benchmark.TestPlan) error { // Collect all unique snapshots that use head_rollback method snapshotsToDetect := make(map[string]benchmark.SnapshotDefinition) @@ -625,43 +476,11 @@ func (s *service) runTest(ctx context.Context, params types.RunParams, workingDi return nil, errors.Wrap(err, "failed to get genesis block") } - // Determine if we're using reuse_existing method - isReuseExisting := snapshotConfig != nil && snapshotConfig.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting - - var sequencerTestDir, validatorTestDir string - var testName string - - if isReuseExisting { - // For reuse_existing, use persistent test directories - if _, exists := s.persistentTestDirs[params.NodeType]; !exists { - s.persistentTestDirs[params.NodeType] = make(map[string]string) - } - - // Create or get persistent directories - if s.persistentTestDirs[params.NodeType]["sequencer"] == "" { - testName := fmt.Sprintf("persistent-%s", params.NodeType) - s.persistentTestDirs[params.NodeType]["sequencer"] = path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) - s.persistentTestDirs[params.NodeType]["validator"] = path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) - s.log.Info("Created persistent test directories to reuse snapshots", - "nodeType", params.NodeType, - "sequencer", s.persistentTestDirs[params.NodeType]["sequencer"], - "validator", s.persistentTestDirs[params.NodeType]["validator"]) - } - - sequencerTestDir = s.persistentTestDirs[params.NodeType]["sequencer"] - validatorTestDir = s.persistentTestDirs[params.NodeType]["validator"] - s.log.Info("Reusing persistent test directories", "sequencer", sequencerTestDir, "validator", validatorTestDir) - } else { - // For other methods, create temporary directories with timestamps - testName := fmt.Sprintf("%d-%s-test", time.Now().Unix(), params.NodeType) - sequencerTestDir = path.Join(workingDir, fmt.Sprintf("%s-sequencer", testName)) - validatorTestDir = path.Join(workingDir, fmt.Sprintf("%s-validator", testName)) - } - - // setup data directories (restore from snapshot if needed) - sequencerOptions, validatorOptions, err := s.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshotConfig) + // Get or create test directories using the datadir manager + testTimestamp := time.Now().Unix() + sequencerOptions, validatorOptions, shouldCleanup, err := s.dataDirManager.GetOrCreateTestDirs(params, genesis, snapshotConfig, s.config.ClientOptions(), testTimestamp) if err != nil { - return nil, errors.Wrap(err, "failed to setup data dirs") + return nil, errors.Wrap(err, "failed to get or create test dirs") } if proofConfig != nil { @@ -670,23 +489,26 @@ func (s *service) runTest(ctx context.Context, params types.RunParams, workingDi } } - // Only cleanup directories if NOT using reuse_existing - if !isReuseExisting { + // Only cleanup directories if shouldCleanup is true (non-reuse_existing) + if shouldCleanup { defer func() { // clean up test directory - err := os.RemoveAll(sequencerTestDir) + err := os.RemoveAll(sequencerOptions.TestDirPath) if err != nil { - log.Error("failed to remove test directory", "err", err) + log.Error("failed to remove sequencer test directory", "err", err) } // clean up test directory - err = os.RemoveAll(validatorTestDir) + err = os.RemoveAll(validatorOptions.TestDirPath) if err != nil { - log.Error("failed to remove test directory", "err", err) + log.Error("failed to remove validator test directory", "err", err) } }() } + // Generate testName for output + testName := fmt.Sprintf("%d-%s-test", testTimestamp, params.NodeType) + batcherKeyBytes := common.FromHex("0xd2ba8e70072983384203c438d4e94bf399cbd88bbcafb82b61cc96ed12541707") batcherKey, err := crypto.ToECDSA(batcherKeyBytes) if err != nil { @@ -851,6 +673,12 @@ func (s *service) Run(ctx context.Context) error { return errors.Wrap(err, "failed to detect snapshot head blocks") } + // Setup persistent test directories for reuse_existing snapshots before running any tests + err = s.setupPersistentTestDirs(testPlans) + if err != nil { + return errors.Wrap(err, "failed to setup persistent test directories") + } + // Create machine info from config var machineInfo *benchmark.MachineInfo s.log.Info("Machine info config values", From d871d09990f3bfeb8ca5ba604ae82123324f5f88 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Tue, 28 Oct 2025 13:11:31 -0400 Subject: [PATCH 04/20] Remove unused function --- runner/service.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/runner/service.go b/runner/service.go index 4014509..c2922e0 100644 --- a/runner/service.go +++ b/runner/service.go @@ -68,11 +68,6 @@ func NewService(version string, cfg config.Config, log log.Logger) Service { return s } -func (s *service) fileExists(path string) bool { - _, err := os.Stat(path) - return err == nil -} - func readBenchmarkConfig(path string) (*benchmark.BenchmarkConfig, error) { file, err := os.OpenFile(path, os.O_RDONLY, 0) if err != nil { From 6dcccce4a9b4c455422e17f56018de4410f7eb37 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Tue, 28 Oct 2025 14:57:44 -0400 Subject: [PATCH 05/20] Disable caching --- runner/clients/reth/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/runner/clients/reth/client.go b/runner/clients/reth/client.go index 971e18d..894099d 100644 --- a/runner/clients/reth/client.go +++ b/runner/clients/reth/client.go @@ -90,6 +90,7 @@ func (r *RethClient) Run(ctx context.Context, cfg *types.RuntimeConfig) error { args = append(args, "--authrpc.jwtsecret", r.options.JWTSecretPath) args = append(args, "--metrics", fmt.Sprintf("%d", r.metricsPort)) args = append(args, "--engine.state-provider-metrics") + args = append(args, "--engine.disable-caching-and-prewarming") args = append(args, "-vvvv") args = append(args, cfg.Args...) From e566596d8ed4a1ecd747ef4d85b992c3f7f2a439 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Fri, 31 Oct 2025 10:34:27 -0400 Subject: [PATCH 06/20] Ensure snapshot exists for both roles --- runner/datadir/manager.go | 176 ++++++++++++++++++++------------------ runner/service.go | 7 +- 2 files changed, 99 insertions(+), 84 deletions(-) diff --git a/runner/datadir/manager.go b/runner/datadir/manager.go index 03cb3d1..7a99075 100644 --- a/runner/datadir/manager.go +++ b/runner/datadir/manager.go @@ -19,30 +19,29 @@ import ( // Manager handles the creation and management of test data directories type Manager struct { // tracks persistent test directories for reuse_existing snapshots - // key: nodeType, value: map["sequencer"|"validator"] -> TestDirConfig - persistentTestDirs map[string]map[string]*TestDirConfig + // key: nodeType-role (e.g., "reth-sequencer"), value: InternalClientOptions + persistentTestDirs map[string]*config.InternalClientOptions snapshotManager benchmark.SnapshotManager workingDir string log log.Logger } -// TestDirConfig contains the configuration for a test directory -type TestDirConfig struct { - SequencerOptions *config.InternalClientOptions - ValidatorOptions *config.InternalClientOptions -} - // NewManager creates a new DataDirManager func NewManager(workingDir string, snapshotManager benchmark.SnapshotManager, log log.Logger) *Manager { return &Manager{ - persistentTestDirs: make(map[string]map[string]*TestDirConfig), + persistentTestDirs: make(map[string]*config.InternalClientOptions), snapshotManager: snapshotManager, workingDir: workingDir, log: log, } } +// getPersistentDirKey returns the key for persistent directory storage +func (m *Manager) getPersistentDirKey(nodeType, role string) string { + return fmt.Sprintf("%s-%s", nodeType, role) +} + // fileExists checks if a file exists func (m *Manager) fileExists(path string) bool { _, err := os.Stat(path) @@ -52,50 +51,56 @@ func (m *Manager) fileExists(path string) bool { // SetupTestDirs sets up test directories for a benchmark run // For reuse_existing snapshots, it creates persistent directories that will be reused across tests // For other snapshot methods, directories will be created per-test in runTest -func (m *Manager) SetupTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*TestDirConfig, error) { +func (m *Manager) SetupTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) error { isReuseExisting := snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting if !isReuseExisting { - return nil, nil + return nil } - // For reuse_existing, create persistent directories nodeType := params.NodeType - if _, exists := m.persistentTestDirs[nodeType]; !exists { - m.persistentTestDirs[nodeType] = make(map[string]*TestDirConfig) - } + // Setup sequencer directory + sequencerKey := m.getPersistentDirKey(nodeType, "sequencer") + if _, exists := m.persistentTestDirs[sequencerKey]; !exists { + testName := fmt.Sprintf("persistent-%s-sequencer", nodeType) + sequencerTestDir := path.Join(m.workingDir, testName) + + m.log.Info("Creating persistent sequencer test directory for reuse_existing", + "nodeType", nodeType, + "role", "sequencer", + "dir", sequencerTestDir) - // Check if we already have persistent directories for this node type - if existingConfig, exists := m.persistentTestDirs[nodeType]["config"]; exists { - m.log.Info("Reusing existing persistent test directories", "nodeType", nodeType) - return existingConfig, nil + sequencerOptions, err := m.setupRoleDirectory(sequencerTestDir, params, genesis, snapshot, "sequencer", clientOptions) + if err != nil { + return errors.Wrap(err, "failed to setup sequencer directory") + } + + m.persistentTestDirs[sequencerKey] = sequencerOptions + m.log.Info("Sequencer persistent directory setup complete", "nodeType", nodeType) } - // Create new persistent directories - testName := fmt.Sprintf("persistent-%s", nodeType) - sequencerTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-sequencer", testName)) - validatorTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-validator", testName)) + // Setup validator directory + validatorKey := m.getPersistentDirKey(nodeType, "validator") + if _, exists := m.persistentTestDirs[validatorKey]; !exists { + testName := fmt.Sprintf("persistent-%s-validator", nodeType) + validatorTestDir := path.Join(m.workingDir, testName) - m.log.Info("Creating persistent test directories for reuse_existing", - "nodeType", nodeType, - "sequencer", sequencerTestDir, - "validator", validatorTestDir) + m.log.Info("Creating persistent validator test directory for reuse_existing", + "nodeType", nodeType, + "role", "validator", + "dir", validatorTestDir) - // Setup data directories - sequencerOptions, validatorOptions, err := m.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshot, clientOptions) - if err != nil { - return nil, errors.Wrap(err, "failed to setup data dirs") - } + validatorOptions, err := m.setupRoleDirectory(validatorTestDir, params, genesis, snapshot, "validator", clientOptions) + if err != nil { + return errors.Wrap(err, "failed to setup validator directory") + } - testDirConfig := &TestDirConfig{ - SequencerOptions: sequencerOptions, - ValidatorOptions: validatorOptions, + m.persistentTestDirs[validatorKey] = validatorOptions + m.log.Info("Validator persistent directory setup complete", "nodeType", nodeType) } - m.persistentTestDirs[nodeType]["config"] = testDirConfig - - return testDirConfig, nil + return nil } // GetOrCreateTestDirs gets existing persistent directories or creates temporary ones @@ -104,11 +109,17 @@ func (m *Manager) GetOrCreateTestDirs(params types.RunParams, genesis *core.Gene if isReuseExisting { // Return pre-configured persistent directories - if config, exists := m.persistentTestDirs[params.NodeType]["config"]; exists { + sequencerKey := m.getPersistentDirKey(params.NodeType, "sequencer") + validatorKey := m.getPersistentDirKey(params.NodeType, "validator") + + sequencerOptions, seqExists := m.persistentTestDirs[sequencerKey] + validatorOptions, valExists := m.persistentTestDirs[validatorKey] + + if seqExists && valExists { m.log.Info("Using persistent test directories", "nodeType", params.NodeType) - return config.SequencerOptions, config.ValidatorOptions, false, nil // false = don't cleanup + return sequencerOptions, validatorOptions, false, nil // false = don't cleanup } - return nil, nil, false, fmt.Errorf("persistent directories not setup for node type %s", params.NodeType) + return nil, nil, false, fmt.Errorf("persistent directories not setup for node type %s (sequencer: %v, validator: %v)", params.NodeType, seqExists, valExists) } // For non-reuse_existing, create temporary directories @@ -124,58 +135,61 @@ func (m *Manager) GetOrCreateTestDirs(params types.RunParams, genesis *core.Gene return sequencerOptions, validatorOptions, true, nil // true = cleanup after test } -// setupDataDirs sets up the data directories for sequencer and validator -func (m *Manager) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*config.InternalClientOptions, *config.InternalClientOptions, error) { - var sequencerDataDirOverride, validatorDataDirOverride string - - if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { - sequencerDataDirOverride = path.Join(sequencerTestDir, "data") - validatorDataDirOverride = path.Join(validatorTestDir, "data") +// setupRoleDirectory sets up a directory for a specific role (sequencer or validator) +// This assumes the initial snapshot has already been downloaded via EnsureInitialSnapshot +func (m *Manager) setupRoleDirectory(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string, clientOptions config.ClientOptions) (*config.InternalClientOptions, error) { + dataDirPath := path.Join(testDir, "data") - // Check if this is the first run (directories don't exist yet) - isFirstRun := !m.fileExists(sequencerDataDirOverride) && !m.fileExists(validatorDataDirOverride) + // Check if this is the first run (directory doesn't exist yet) + isFirstRun := !m.fileExists(dataDirPath) - if isFirstRun { - initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) - if initialSnapshotPath != "" && m.fileExists(initialSnapshotPath) { - m.log.Info("First run with reuse_existing: copying to validator, moving to sequencer", - "initialSnapshot", initialSnapshotPath, - "sequencerDataDir", sequencerDataDirOverride, - "validatorDataDir", validatorDataDirOverride) + if isFirstRun && snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + // Get the initial snapshot path that was already downloaded + initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) + if initialSnapshotPath == "" || !m.fileExists(initialSnapshotPath) { + return nil, fmt.Errorf("initial snapshot not found for node type %s - should have been downloaded in setupInitialSnapshots", params.NodeType) + } - // First: copy from initial snapshot to validator directory - err := m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, validatorDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to copy initial snapshot to validator directory") - } - m.log.Info("Copied initial snapshot to validator directory", "path", validatorDataDirOverride) + m.log.Info("First run with reuse_existing: copying initial snapshot to role directory", + "nodeType", params.NodeType, + "role", role, + "initialSnapshot", initialSnapshotPath, + "dataDirPath", dataDirPath) - err = os.MkdirAll(sequencerTestDir, 0755) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to create sequencer test directory") - } + err := os.MkdirAll(testDir, 0755) + if err != nil { + return nil, errors.Wrap(err, "failed to create test directory") + } - err = os.Rename(initialSnapshotPath, sequencerDataDirOverride) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to move initial snapshot to sequencer directory") - } - m.log.Info("Moved initial snapshot to sequencer directory", "from", initialSnapshotPath, "to", sequencerDataDirOverride) - } - } else { - m.log.Info("Reusing existing data directories from previous run", - "sequencerDataDir", sequencerDataDirOverride, - "validatorDataDir", validatorDataDirOverride) + // Copy the initial snapshot to the role's data directory + err = m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf("failed to copy initial snapshot to %s directory", role)) } + m.log.Info("Copied initial snapshot to role directory", "role", role, "to", dataDirPath) + } else if !isFirstRun { + m.log.Info("Reusing existing data directory from previous run", "role", role, "dataDirPath", dataDirPath) + } + + // Setup internal directories with the data dir override for reuse_existing + var dataDirOverride string + if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + dataDirOverride = dataDirPath } - sequencerOptions, err := m.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", sequencerDataDirOverride, clientOptions) + return m.setupInternalDirectories(testDir, params, genesis, snapshot, role, dataDirOverride, clientOptions) +} + +// setupDataDirs sets up the data directories for sequencer and validator (for non-reuse_existing methods) +func (m *Manager) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*config.InternalClientOptions, *config.InternalClientOptions, error) { + sequencerOptions, err := m.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", "", clientOptions) if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup internal directories") + return nil, nil, errors.Wrap(err, "failed to setup sequencer internal directories") } - validatorOptions, err := m.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", validatorDataDirOverride, clientOptions) + validatorOptions, err := m.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", "", clientOptions) if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup internal directories") + return nil, nil, errors.Wrap(err, "failed to setup validator internal directories") } return sequencerOptions, validatorOptions, nil diff --git a/runner/service.go b/runner/service.go index c2922e0..7687259 100644 --- a/runner/service.go +++ b/runner/service.go @@ -281,13 +281,14 @@ func (s *service) setupPersistentTestDirs(testPlans []benchmark.TestPlan) error } // Setup persistent directories for each unique node type with reuse_existing + // This will create separate snapshots for sequencer and validator roles for nodeType, runInfo := range testRunsWithReuseExisting { - s.log.Info("Setting up persistent test directories", "nodeType", nodeType) - _, err := s.dataDirManager.SetupTestDirs(runInfo.params, runInfo.genesis, runInfo.snapshot, s.config.ClientOptions()) + s.log.Info("Setting up persistent test directories for both roles", "nodeType", nodeType) + err := s.dataDirManager.SetupTestDirs(runInfo.params, runInfo.genesis, runInfo.snapshot, s.config.ClientOptions()) if err != nil { return errors.Wrap(err, fmt.Sprintf("failed to setup persistent test directories for node type %s", nodeType)) } - s.log.Info("Persistent test directories setup completed", "nodeType", nodeType) + s.log.Info("Persistent test directories setup completed for both sequencer and validator", "nodeType", nodeType) } return nil From fec44906932eab940ad1f9d9d7b50c30a9d2ef81 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 28 Oct 2025 10:21:34 -0700 Subject: [PATCH 07/20] feat: skip importing runs missing required files (#117) --- runner/importer/service.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/runner/importer/service.go b/runner/importer/service.go index f631734..e771abb 100644 --- a/runner/importer/service.go +++ b/runner/importer/service.go @@ -9,6 +9,7 @@ import ( "os" "path" "path/filepath" + "slices" "strings" "time" @@ -76,6 +77,13 @@ func (s *Service) downloadOutputFiles(baseURL, runID, runOutputDir string) error "metrics-sequencer.json", } + requiredFiles := []string{ + "result-sequencer.json", + "metrics-validator.json", + "metrics-sequencer.json", + "result-validator.json", + } + // Structure output as output/// localOutputDir := filepath.Join(s.config.OutputDir(), runID, runOutputDir) s.log.Info("Downloading output files", "runID", runID, "runOutputDir", runOutputDir, "localPath", localOutputDir) @@ -89,6 +97,9 @@ func (s *Service) downloadOutputFiles(baseURL, runID, runOutputDir string) error // Try to download the file err := s.downloadFile(fileURL, localFilePath) if err != nil { + if !slices.Contains(requiredFiles, fileName) { + return errors.Wrap(err, "failed to download file") + } s.log.Warn("Failed to download file (continuing)", "file", fileName, "url", fileURL, "error", err) } else { s.log.Debug("Downloaded file", "file", fileName, "localPath", localFilePath) @@ -150,15 +161,19 @@ func (s *Service) LoadSourceMetadata(source string) (*benchmark.RunGroup, error) // If we loaded from URL, download output files for each run if baseURL != "" { s.log.Info("Downloading output files for all runs", "baseURL", baseURL) + newMetadata := make([]benchmark.Run, 0, len(metadata.Runs)) for _, run := range metadata.Runs { if run.OutputDir != "" { err := s.downloadOutputFiles(baseURL, run.ID, run.OutputDir) if err != nil { s.log.Warn("Failed to download output files for run", "runID", run.ID, "outputDir", run.OutputDir, "error", err) // Continue with other runs even if one fails + continue } + newMetadata = append(newMetadata, run) } } + metadata.Runs = newMetadata } return &metadata, nil From 55c8e644b8fe28e064370b01061b1928f158be69 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 28 Oct 2025 12:09:17 -0700 Subject: [PATCH 08/20] fix: relative path when on gha (#118) --- report/src/services/dataService.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/report/src/services/dataService.ts b/report/src/services/dataService.ts index 81a540d..f9aad18 100644 --- a/report/src/services/dataService.ts +++ b/report/src/services/dataService.ts @@ -11,11 +11,11 @@ export class DataService { private baseUrl: string; constructor(baseUrl: string) { - this.baseUrl = baseUrl.replace(/\/$/, ""); // Remove trailing slash + this.baseUrl = baseUrl.replace(/\/$/, "") + "/"; // Ensure trailing slash } async getMetadata(): Promise { - const response = await fetch(`${this.baseUrl}/output/metadata.json`); + const response = await fetch(`${this.baseUrl}output/metadata.json`); if (!response.ok) { throw new Error( @@ -27,7 +27,7 @@ export class DataService { } async getMetrics(outputDir: string, nodeType: string): Promise { - const metricsPath = `${this.baseUrl}/output/${outputDir}/metrics-${nodeType}.json`; + const metricsPath = `${this.baseUrl}output/${outputDir}/metrics-${nodeType}.json`; const response = await fetch(metricsPath); if (!response.ok) { @@ -72,7 +72,7 @@ export function getDataSourceConfig(): DataServiceConfig { const dataSource = getEnvVar("DATA_SOURCE") || "static"; if (dataSource === "api" && apiBaseUrl) { - // API mode: use the configured API base URL + // API mode: use the configured API base URL (ensure trailing slash) return { baseUrl: apiBaseUrl }; } else { // Static mode: use current origin (empty string means relative to current domain) From 00c2f6f0af47670fe870a60de6bb0b908e739027 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 28 Oct 2025 15:27:24 -0700 Subject: [PATCH 09/20] fix: no trailing slash if not set (#119) --- report/src/services/dataService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/report/src/services/dataService.ts b/report/src/services/dataService.ts index f9aad18..f6163f8 100644 --- a/report/src/services/dataService.ts +++ b/report/src/services/dataService.ts @@ -11,7 +11,7 @@ export class DataService { private baseUrl: string; constructor(baseUrl: string) { - this.baseUrl = baseUrl.replace(/\/$/, "") + "/"; // Ensure trailing slash + this.baseUrl = baseUrl; } async getMetadata(): Promise { @@ -73,7 +73,7 @@ export function getDataSourceConfig(): DataServiceConfig { if (dataSource === "api" && apiBaseUrl) { // API mode: use the configured API base URL (ensure trailing slash) - return { baseUrl: apiBaseUrl }; + return { baseUrl: apiBaseUrl.replace(/\/$/, "") + "/" }; } else { // Static mode: use current origin (empty string means relative to current domain) return { baseUrl: "" }; From 51bb268701fc428551bf7003e87fb82efb38790e Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Fri, 31 Oct 2025 09:41:57 -0700 Subject: [PATCH 10/20] feat: hide machine info if unavailable (#120) --- report/src/components/MachineInfo.tsx | 11 +---------- report/src/components/RunList.tsx | 16 ++-------------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/report/src/components/MachineInfo.tsx b/report/src/components/MachineInfo.tsx index 1d6fbfd..e36723f 100644 --- a/report/src/components/MachineInfo.tsx +++ b/report/src/components/MachineInfo.tsx @@ -27,16 +27,7 @@ const MachineInfo = ({ machineInfo }: MachineInfoProps) => { !machineInfo.region && !machineInfo.fileSystem) ) { - return ( -
-

- Machine Information -

-

- Machine information not available for this benchmark run. -

-
- ); + return null; } const providerUrl = diff --git a/report/src/components/RunList.tsx b/report/src/components/RunList.tsx index c693887..52b5db6 100644 --- a/report/src/components/RunList.tsx +++ b/report/src/components/RunList.tsx @@ -340,21 +340,9 @@ const RunList = ({ {isExpanded && (
{/* Machine Information Section */} - {section.runs.length > 0 && ( + {section.runs[0]?.machineInfo && (
- {section.runs[0].machineInfo ? ( - - ) : ( -
-

- Machine Information -

-

- Machine information not available for this benchmark - run. -

-
- )} +
)} From 8c91b90cf43acbbc9347cfcde603c827724c76ef Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Fri, 31 Oct 2025 12:17:25 -0700 Subject: [PATCH 11/20] feat: allow specifying different node args for each run (#122) Signed-off-by: Julian Meyer --- runner/benchmark/benchmark.go | 18 ++++++++++++ runner/clients/reth/client.go | 3 +- runner/config/client.go | 5 +++- runner/config/doc.go | 6 ++++ runner/network/network_benchmark.go | 1 + runner/network/types/types.go | 43 +++++++++++++++++++++++------ 6 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 runner/config/doc.go diff --git a/runner/benchmark/benchmark.go b/runner/benchmark/benchmark.go index 9a65a0b..fe500da 100644 --- a/runner/benchmark/benchmark.go +++ b/runner/benchmark/benchmark.go @@ -80,6 +80,24 @@ func NewParamsFromValues(assignments map[string]interface{}) (*types.RunParams, } else { return nil, fmt.Errorf("invalid num blocks %s", v) } + case "node_args": + // either a list of strings or a string (separated by spaces) + if vStr, ok := v.(string); ok { + params.NodeArgs = strings.Split(vStr, " ") + } else if vArr, ok := v.([]interface{}); ok { + // convert []interface{} to []string + nodeArgs := make([]string, len(vArr)) + for i, arg := range vArr { + arg, ok := arg.(string) + if !ok { + return nil, fmt.Errorf("invalid non-string node arg %v", arg) + } + nodeArgs[i] = arg + } + params.NodeArgs = nodeArgs + } else { + return nil, fmt.Errorf("invalid node args %v", v) + } } } diff --git a/runner/clients/reth/client.go b/runner/clients/reth/client.go index 894099d..8b19e71 100644 --- a/runner/clients/reth/client.go +++ b/runner/clients/reth/client.go @@ -93,8 +93,6 @@ func (r *RethClient) Run(ctx context.Context, cfg *types.RuntimeConfig) error { args = append(args, "--engine.disable-caching-and-prewarming") args = append(args, "-vvvv") - args = append(args, cfg.Args...) - // increase mempool size args = append(args, "--txpool.pending-max-count", "100000000") args = append(args, "--txpool.queued-max-count", "100000000") @@ -102,6 +100,7 @@ func (r *RethClient) Run(ctx context.Context, cfg *types.RuntimeConfig) error { args = append(args, "--txpool.queued-max-size", "100") args = append(args, "--db.read-transaction-timeout", "0") + args = append(args, cfg.Args...) // delete datadir/txpool-transactions-backup.rlp if it exists txpoolBackupPath := fmt.Sprintf("%s/txpool-transactions-backup.rlp", r.options.DataDirPath) diff --git a/runner/config/client.go b/runner/config/client.go index cab0df3..dba28ac 100644 --- a/runner/config/client.go +++ b/runner/config/client.go @@ -64,4 +64,7 @@ func ReadClientOptions(ctx *cli.Context) ClientOptions { } // CommonOptions are common client configuration options. -type CommonOptions struct{} +type CommonOptions struct { + // NodeArgs are the arguments to be passed to the node binary. + NodeArgs []string +} diff --git a/runner/config/doc.go b/runner/config/doc.go new file mode 100644 index 0000000..e41db08 --- /dev/null +++ b/runner/config/doc.go @@ -0,0 +1,6 @@ +/* +config is responsible for reading and validating runtime configuration for the benchmark runner. + +These config options are not stored in the config file, but are set by the CLI flags. +*/ +package config diff --git a/runner/network/network_benchmark.go b/runner/network/network_benchmark.go index c4005d8..ca38ba8 100644 --- a/runner/network/network_benchmark.go +++ b/runner/network/network_benchmark.go @@ -228,6 +228,7 @@ func setupNode(ctx context.Context, l log.Logger, params benchtypes.RunParams, o runtimeConfig := &types.RuntimeConfig{ Stdout: stdoutLogger, Stderr: stderrLogger, + Args: options.NodeArgs, } if err := client.Run(ctx, runtimeConfig); err != nil { diff --git a/runner/network/types/types.go b/runner/network/types/types.go index c981d37..1cb4c64 100644 --- a/runner/network/types/types.go +++ b/runner/network/types/types.go @@ -3,6 +3,7 @@ package types import ( "crypto/ecdsa" "math/big" + "strings" "time" "github.com/base/base-bench/runner/config" @@ -52,16 +53,38 @@ func (c *TestConfig) BatcherAddr() common.Address { // Params is the parameters for a single benchmark run. type RunParams struct { - NodeType string - GasLimit uint64 - PayloadID string + // NodeType is the type of node that's being benchmarked. Examples: geth, reth, nethermined, etc. + NodeType string + + // GasLimit is the gas limit for the benchmark run which is the maximum gas that the sequencer will include per block. + GasLimit uint64 + + // PayloadID is a reference to a transaction payload that will be sent to the sequencer. + PayloadID string + + // BenchmarkRunID is a unique identifier for the benchmark run. BenchmarkRunID string - Name string - Description string - BlockTime time.Duration - Env map[string]string - NumBlocks int - Tags map[string]string + + // Name is the name of the benchmark run in the config file. + Name string + + // Description is the description of the benchmark run in the config file. + Description string + + // BlockTime is the time between blocks in the benchmark run. + BlockTime time.Duration + + // Env is the environment variables for the benchmark run. + Env map[string]string + + // NumBlocks is the number of blocks to run in the benchmark run. + NumBlocks int + + // Tags are the tags for the benchmark run. + Tags map[string]string + + // NodeArgs are the arguments to be passed to the node binary. + NodeArgs []string } func (p RunParams) ToConfig() map[string]interface{} { @@ -71,6 +94,7 @@ func (p RunParams) ToConfig() map[string]interface{} { "TransactionPayload": p.PayloadID, "BenchmarkRun": p.BenchmarkRunID, "BlockTimeMilliseconds": p.BlockTime.Milliseconds(), + "NodeArgs": strings.Join(p.NodeArgs, " "), } for k, v := range p.Tags { @@ -82,6 +106,7 @@ func (p RunParams) ToConfig() map[string]interface{} { // ClientOptions applies any client customization options to the given client options. func (p RunParams) ClientOptions(prevClientOptions config.ClientOptions) config.ClientOptions { + prevClientOptions.NodeArgs = p.NodeArgs return prevClientOptions } From 8c29080a712ce83abe8353435dfea3fdb3e7589e Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 4 Nov 2025 11:48:31 -0800 Subject: [PATCH 12/20] fix: ensure thresholds are using role-specific metric names (#124) --- report/src/components/ChartGrid.tsx | 8 ++++++-- report/src/components/ChartSelector.tsx | 17 ++++++++++++++--- report/src/components/LineChart.tsx | 23 +++++++++++++++-------- report/src/components/RunList.tsx | 8 ++++---- report/src/hooks/useBenchmarkFilters.ts | 13 +++++++++++++ report/src/pages/RunComparison.tsx | 23 +++++++++++++++-------- 6 files changed, 67 insertions(+), 25 deletions(-) diff --git a/report/src/components/ChartGrid.tsx b/report/src/components/ChartGrid.tsx index 217e1a2..562b5bc 100644 --- a/report/src/components/ChartGrid.tsx +++ b/report/src/components/ChartGrid.tsx @@ -5,12 +5,16 @@ import LineChart from "./LineChart"; interface ProvidedProps { data: DataSeries[]; + role: "sequencer" | "validator" | null; } -const ChartGrid: React.FC = ({ data }: ProvidedProps) => { +const ChartGrid: React.FC = ({ data, role }: ProvidedProps) => { return (
{Object.entries(CHART_CONFIG).map(([metricKey, config]) => { + // sequencer and validator have different thresholds + console.log(role, metricKey); + const thresholdKey = role ? `${role}/${metricKey}` : null; const chartData = data.flatMap((s) => s.data); const thresholds = data[0]?.thresholds; const executionMetrics = chartData @@ -32,7 +36,7 @@ const ChartGrid: React.FC = ({ data }: ProvidedProps) => { return (
- +
); })} diff --git a/report/src/components/ChartSelector.tsx b/report/src/components/ChartSelector.tsx index 36018a8..cd9d466 100644 --- a/report/src/components/ChartSelector.tsx +++ b/report/src/components/ChartSelector.tsx @@ -24,9 +24,19 @@ export interface SelectedData { interface ChartSelectorProps { benchmarkRuns: BenchmarkRuns; - onChangeDataQuery: (data: SelectedData[]) => void; + onChangeDataQuery: (data: DataSelection) => void; } +export interface DataSelection { + data: SelectedData[]; + role: "sequencer" | "validator" | null; +} + +export const EmptyDataSelection: DataSelection = { + data: [], + role: null, +}; + const ChartSelector = ({ benchmarkRuns, onChangeDataQuery, @@ -51,6 +61,7 @@ const ChartSelector = ({ filterSelections, setFilters, setByMetric, + role, } = useBenchmarkFilters(runsWithRoles, "role"); const lastSentDataRef = useRef([]); @@ -106,9 +117,9 @@ const ChartSelector = ({ if (!isEqual(dataToSend, lastSentDataRef.current)) { lastSentDataRef.current = dataToSend; - onChangeDataQuery(dataToSend); + onChangeDataQuery({ data: dataToSend, role }); } - }, [matchedRuns, filterSelections.byMetric, onChangeDataQuery]); + }, [matchedRuns, filterSelections.byMetric, role, onChangeDataQuery]); return (
diff --git a/report/src/components/LineChart.tsx b/report/src/components/LineChart.tsx index 442a2c5..a2c0c3a 100644 --- a/report/src/components/LineChart.tsx +++ b/report/src/components/LineChart.tsx @@ -16,6 +16,7 @@ import { isEqual } from "lodash"; interface LineChartProps { series: DataSeries[]; + thresholdKey: string | null; metricKey: string; title?: string; description?: string; @@ -48,6 +49,7 @@ const MAX_TICKS = 10; const LineChart: React.FC = ({ series, + thresholdKey, metricKey, title, description, @@ -342,14 +344,14 @@ const LineChart: React.FC = ({ const maxThreshold = useMemo(() => { let maxThreshold = 0; for (const thresholdMap of [thresholds?.warning, thresholds?.error]) { - if (thresholdMap) { - if (thresholdMap[metricKey] > maxThreshold) { - maxThreshold = thresholdMap[metricKey]; + if (thresholdMap && thresholdKey) { + if (thresholdMap[thresholdKey] > maxThreshold) { + maxThreshold = thresholdMap[thresholdKey]; } } } return maxThreshold; - }, [thresholds, metricKey]); + }, [thresholds, thresholdKey]); return ( = ({ // Add warning threshold line (yellow) if ( thresholds.warning && - thresholds.warning[metricKey] !== undefined + thresholdKey && + thresholds.warning[thresholdKey] !== undefined ) { - const warningY = y(thresholds.warning[metricKey]); + const warningY = y(thresholds.warning[thresholdKey]); svg .append("line") .attr("class", "threshold-line warning") @@ -425,8 +428,12 @@ const LineChart: React.FC = ({ } // Add error threshold line (red) - if (thresholds.error && thresholds.error[metricKey] !== undefined) { - const errorY = y(thresholds.error[metricKey]); + if ( + thresholds.error && + thresholdKey && + thresholds.error[thresholdKey] !== undefined + ) { + const errorY = y(thresholds.error[thresholdKey]); svg .append("line") .attr("class", "threshold-line error") diff --git a/report/src/components/RunList.tsx b/report/src/components/RunList.tsx index 52b5db6..0265129 100644 --- a/report/src/components/RunList.tsx +++ b/report/src/components/RunList.tsx @@ -135,9 +135,9 @@ const RunList = ({ // Handle threshold displays for specific columns if (column === "getPayload") { const warningThreshold = - (run.thresholds?.warning?.["latency/get_payload"] ?? 0) / 1e9; + (run.thresholds?.warning?.["sequencer/latency/get_payload"] ?? 0) / 1e9; const errorThreshold = - (run.thresholds?.error?.["latency/get_payload"] ?? 0) / 1e9; + (run.thresholds?.error?.["sequencer/latency/get_payload"] ?? 0) / 1e9; return ( { + if (filterSelections.byMetric === "role") { + return null; + } + + return ( + (filterSelections.params.role as "sequencer" | "validator") ?? + variables.role[0] + ); + }, [filterSelections.byMetric, filterSelections.params.role, variables]); + return { variables, filterOptions, @@ -103,5 +115,6 @@ export function useBenchmarkFilters( filterSelections, // Return current selections for UI binding setFilters, // Return the simplified setter setByMetric, + role, }; } diff --git a/report/src/pages/RunComparison.tsx b/report/src/pages/RunComparison.tsx index c8572c3..03b853d 100644 --- a/report/src/pages/RunComparison.tsx +++ b/report/src/pages/RunComparison.tsx @@ -1,5 +1,8 @@ import { useMemo, useState } from "react"; -import ChartSelector, { SelectedData } from "../components/ChartSelector"; +import ChartSelector, { + DataSelection, + EmptyDataSelection, +} from "../components/ChartSelector"; import ChartGrid from "../components/ChartGrid"; import { useTestMetadata, useMultipleDataSeries } from "../utils/useDataSeries"; import { DataSeries } from "../types"; @@ -13,7 +16,7 @@ function RunComparison() { throw new Error("Benchmark run ID is required"); } - const [selection, setSelection] = useState([]); + const [selection, setSelection] = useState(EmptyDataSelection); const { data: allBenchmarkRuns, isLoading: isLoadingBenchmarkRuns } = useTestMetadata(); @@ -42,7 +45,7 @@ function RunComparison() { }, [allBenchmarkRuns, benchmarkRunId]); const dataQueryKey = useMemo(() => { - return selection.map((query) => { + return selection.data.map((query) => { // Find the run that matches this outputDir to get the runId const run = benchmarkRuns.runs.find( (r) => r.outputDir === query.outputDir, @@ -50,7 +53,7 @@ function RunComparison() { const runId = run?.id || query.outputDir; // Fallback to outputDir if no ID found return [runId, query.outputDir, query.role] as [string, string, string]; }); - }, [selection, benchmarkRuns]); + }, [selection.data, benchmarkRuns]); const { data: dataPerFile, isLoading } = useMultipleDataSeries(dataQueryKey); const data = useMemo(() => { @@ -59,15 +62,15 @@ function RunComparison() { } return dataPerFile.map((data, index): DataSeries => { - const { name, color } = selection[index]; + const { name, color } = selection.data[index]; return { name, data, color, - thresholds: selection[index].thresholds, + thresholds: selection.data[index].thresholds, }; }); - }, [dataPerFile, selection]); + }, [dataPerFile, selection.data]); if (!benchmarkRuns || isLoadingBenchmarkRuns) { return
Loading...
; @@ -82,7 +85,11 @@ function RunComparison() { onChangeDataQuery={setSelection} benchmarkRuns={benchmarkRuns} /> - {isLoading ? "Loading..." : } + {isLoading ? ( + "Loading..." + ) : ( + + )}
From e32353f39052c7dd6cf72f50f79ad54a2aec344d Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Tue, 4 Nov 2025 12:07:14 -0800 Subject: [PATCH 13/20] feat: sort charts (#126) --- report/src/components/ChartGrid.tsx | 5 ++-- report/src/metricDefinitions.ts | 46 +++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/report/src/components/ChartGrid.tsx b/report/src/components/ChartGrid.tsx index 562b5bc..7217452 100644 --- a/report/src/components/ChartGrid.tsx +++ b/report/src/components/ChartGrid.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { CHART_CONFIG } from "../metricDefinitions"; +import { SORTED_CHART_CONFIG } from "../metricDefinitions"; import { DataSeries } from "../types"; import LineChart from "./LineChart"; @@ -11,9 +11,8 @@ interface ProvidedProps { const ChartGrid: React.FC = ({ data, role }: ProvidedProps) => { return (
- {Object.entries(CHART_CONFIG).map(([metricKey, config]) => { + {SORTED_CHART_CONFIG.map(([metricKey, config]) => { // sequencer and validator have different thresholds - console.log(role, metricKey); const thresholdKey = role ? `${role}/${metricKey}` : null; const chartData = data.flatMap((s) => s.data); const thresholds = data[0]?.thresholds; diff --git a/report/src/metricDefinitions.ts b/report/src/metricDefinitions.ts index e9a7987..b3ed991 100644 --- a/report/src/metricDefinitions.ts +++ b/report/src/metricDefinitions.ts @@ -1,5 +1,5 @@ import { ChartConfig } from "./types"; // Import from types.ts -export const CHART_CONFIG: Record = { +export const CHART_CONFIG = { "latency/send_txs": { type: "line", title: "Send Txs", @@ -210,4 +210,46 @@ export const CHART_CONFIG: Record = { description: "Shows the 90th percentile latency for account loads", unit: "s", }, -}; +} satisfies Record; + +const CHART_CONFIG_ORDER: (keyof typeof CHART_CONFIG)[] = [ + "latency/get_payload", + "latency/new_payload", + "latency/update_fork_choice", + "latency/send_txs", + "gas/per_block", + "transactions/per_block", + "chain/inserts.50-percentile", + "chain/account/reads.50-percentile", + "chain/storage/reads.50-percentile", + "chain/execution.50-percentile", + "chain/account/updates.50-percentile", + "chain/account/hashes.50-percentile", + "chain/storage/updates.50-percentile", + "chain/validation.50-percentile", + "chain/crossvalidation.50-percentile", + "chain/write.50-percentile", + "chain/account/commits.50-percentile", + "chain/storage/commits.50-percentile", + "chain/snapshot/commits.50-percentile", + "chain/triedb/commits.50-percentile", +]; + +export const SORTED_CHART_CONFIG: [string, ChartConfig][] = Object.entries( + CHART_CONFIG, +).sort((a, b) => { + const aIndex = CHART_CONFIG_ORDER.indexOf(a[0] as keyof typeof CHART_CONFIG); + const bIndex = CHART_CONFIG_ORDER.indexOf(b[0] as keyof typeof CHART_CONFIG); + + // if both doesn't exist, sort it last (infinity) + if (aIndex === -1 && bIndex === -1) { + return 0; + } + if (aIndex === -1) { + return 1; + } + if (bIndex === -1) { + return -1; + } + return aIndex - bIndex; +}); From 771ab2a8b450e7f724ac5d48fc6aba07428aa37e Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Wed, 5 Nov 2025 06:43:45 -0800 Subject: [PATCH 14/20] fix: update contributing and readme (#127) --- .github/assets/logo.png | Bin 0 -> 159323 bytes .github/assets/run-switcher.png | Bin 0 -> 40047 bytes CONTRIBUTING.md | 37 ++++++ README.md | 211 +++++++++++++++++++++++++------- 4 files changed, 207 insertions(+), 41 deletions(-) create mode 100644 .github/assets/logo.png create mode 100644 .github/assets/run-switcher.png create mode 100644 CONTRIBUTING.md diff --git a/.github/assets/logo.png b/.github/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cceeffe8b61d1c5b912572ad9e19adc9dff61b77 GIT binary patch literal 159323 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 VUxWT-6Ug>9Alt2QuElR&(ZYv+ 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
kev|b~+i<-E=o+J%x#R!a=q1*^wH(nH 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�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 PWdH(CS3j3^P6 -

Base Benchmark

- Status: Beta - Language: Go - License -
+![Base](.github/assets/logo.png) + +# Base Benchmark Base Benchmark is a performance testing framework for Ethereum execution clients. Compare client performance, identify bottlenecks, and ensure reliability before deployment. -## 🚀 Features + + +[![GitHub contributors](https://img.shields.io/github/contributors/base/benchmark)](https://github.com/base/benchmark/graphs/contributors) +[![GitHub commit activity](https://img.shields.io/github/commit-activity/w/base/benchmark)](https://github.com/base/benchmark/graphs/contributors) +[![GitHub Stars](https://img.shields.io/github/stars/base/benchmark.svg)](https://github.com/base/benchmark/stargazers) +![GitHub repo size](https://img.shields.io/github/repo-size/base/benchmark) +[![GitHub](https://img.shields.io/github/license/base/benchmark?color=blue)](https://github.com/base/benchmark/blob/main/LICENSE) + + + +[![Website base.org](https://img.shields.io/website-up-down-green-red/https/base.org.svg)](https://base.org) +[![Blog](https://img.shields.io/badge/blog-up-green)](https://base.mirror.xyz/) +[![Docs](https://img.shields.io/badge/docs-up-green)](https://docs.base.org/) +[![Discord](https://img.shields.io/discord/1067165013397213286?label=discord)](https://base.org/discord) +[![Twitter Base](https://img.shields.io/twitter/follow/Base?style=social)](https://twitter.com/Base) + + + +[![GitHub pull requests by-label](https://img.shields.io/github/issues-pr-raw/base/benchmark)](https://github.com/base/benchmark/pulls) +[![GitHub Issues](https://img.shields.io/github/issues-raw/base/benchmark.svg)](https://github.com/base/benchmark/issues) -Base Benchmark provides comprehensive testing capabilities: +## Features -- **Performance Evaluation** - Test both block building and validation performance across execution clients -- **Comparative Analysis** - Measure client behavior across various inputs and workloads -- **Metric Collection** - Track critical metrics including submission times, latency, and throughput -- **Flexible Workloads** - Configure transaction patterns to match your specific needs -- **Visual Reports** - Generate interactive HTML dashboards of benchmark results +- **Performance Evaluation:** Test both block building and validation performance across execution clients (Geth, Reth, and more) +- **Comparative Analysis:** Measure client behavior across various inputs and workloads +- **Metric Collection:** Track critical metrics including submission times, latency, and throughput +- **Flexible Workloads:** Configure transaction patterns to match your specific needs +- **Interactive Dashboard:** Generate beautiful HTML reports with charts and run comparisons +- **Import & Merge:** Combine benchmark results from multiple machines with flexible tagging -## 📋 Quick Start +## Repository Structure -[Install Forge](https://book.getfoundry.sh/getting-started/installation) +``` +. +├── Makefile # Build and development tasks +├── go.mod # Go module dependencies +├── benchmark/ # CLI application +│ ├── cmd/ # Main entry point +│ ├── config/ # Configuration types +│ └── flags/ # CLI flags +├── runner/ # Core benchmarking logic +│ ├── benchmark/ # Benchmark execution +│ ├── clients/ # Client integrations (Geth, Reth) +│ ├── importer/ # Run import functionality +│ ├── network/ # Network setup and management +│ └── payload/ # Transaction payload generation +├── configs/ # Benchmark configurations +│ ├── examples/ # Development and testing configs +│ └── public/ # Production-ready benchmarks +├── contracts/ # Smart contracts for testing +│ └── src/ # Solidity source files +├── report/ # Interactive dashboard +│ └── src/ # React TypeScript application +└── clients/ # Client build scripts +``` + +## Prerequisites + +- **Go:** Version 1.21 or later. Install from [go.dev](https://go.dev/dl/) +- **Foundry:** For smart contract compilation. See [installation guide](https://book.getfoundry.sh/getting-started/installation) +- **Node.js:** Version 18+ for the interactive dashboard. Install from [nodejs.org](https://nodejs.org/) -Recursively clone github submodules: +## Getting Started + +### 1. Clone the Repository ```bash +git clone https://github.com/base/benchmark.git +cd benchmark git submodule update --init --recursive ``` +### 2. Build the Application + ```bash -# Build the application make build +``` + +The binary will be located at `bin/benchmark`. -# Build the binaries, geth, reth, rbuilder +### 3. Build Client Binaries (Optional) + +To build Geth and Reth from source: + +```bash make build-binaries +``` -# Run the basic benchmark +Alternatively, you can specify paths to pre-built binaries when running benchmarks. + +### 4. Run Your First Benchmark + +```bash ./bin/base-bench run \ --config ./configs/public/basic.yml \ --root-dir ./data-dir \ - --reth-bin path_to_reth_bin \ - --geth-bin path_to_geth_bin \ --output-dir ./output +``` -# View the interactive dashboard +To see available options: + +```bash +./bin/base-bench run --help +``` + +### 5. View Results in the Interactive Dashboard + +```bash cd report/ -npm i +npm install npm run dev ``` -## 📋 Available Benchmarks +Open your browser to the URL shown (typically `http://localhost:5173`). + +## Available Benchmarks Explore the comprehensive collection of benchmark configurations: @@ -59,7 +130,7 @@ Explore the comprehensive collection of benchmark configurations: Choose from storage operations, precompile tests, token workloads, mainnet simulations, and more. -## 🏗️ Architecture +## Architecture ### Benchmark Structure @@ -99,23 +170,16 @@ Each test executes a standardized workflow: This approach allows precise measurement of performance characteristics for both block production and validation. -## 🔧 Configuration - -### Build - -```bash -make build -ls ./bin/base-bench -``` +## Configuration ### Available Flags ``` NAME: - base-bench run - run benchmark + benchmark run - run benchmark USAGE: - base-bench run [command options] + benchmark run [command options] OPTIONS: --config value Config Path ($BASE_BENCH_CONFIG) @@ -140,16 +204,81 @@ OPTIONS: --help, -h Show help (default: false) ``` -## 📊 Example Reports +## Managing Test Runs + +### Understanding Runs and Suites + +When you view benchmark results in the interactive dashboard, you can switch between different test runs using the run switcher:
-

Performance comparison between Geth and Reth clients

+ Run Switcher
-## 🤝 Contributing +### Creating Test Runs + +Running benchmarks adds a new suite by default: + +```bash +./bin/base-bench run --config ./configs/public/basic.yml +``` + +Each execution creates a new suite entry in the run list, allowing you to track performance over time or across different configurations. + +### Combining Multiple Runs + +Use `import-runs` to merge benchmark results from multiple machines or configurations: + +```bash +./bin/base-bench import-runs \ + --output-dir ./output \ + ./results-from-server-1/metadata.json +``` + +**Two import strategies:** + +1. **Add to latest suite with tags** - Merge imported runs into your most recent suite, using tags to differentiate: + + ```bash + # Add imported runs to the last suite with tags for differentiation + ./bin/base-bench import-runs \ + --src-tag "instance=server-lg" \ + --dest-tag "instance=server-md" \ + --output-dir ./output \ + ./results-from-server-1/metadata.json + + # --src-tag fills missing tags on existing runs (won't overwrite) + # --dest-tag applies to the imported runs + # Useful for comparing hardware configurations within the same test run + ``` + +2. **Create new separate suite** - Add imported runs as an independent suite in the list: + + ```bash + # Interactive mode (recommended) - prompts you to choose strategy and configure tags + ./bin/base-bench import-runs \ + --output-dir ./output \ + ./results-from-server-1/metadata.json + + # Creates a new entry differentiated by BenchmarkRun ID + # Useful for tracking performance across different code versions or time periods + ``` + +**Interactive Mode:** Without specifying tags, the tool enters interactive mode and guides you through: + +- Choosing between adding to last suite or creating new suite +- Configuring appropriate tags if needed +- Confirming the import operation + +This flexibility lets you organize benchmarks by hardware type, client version, or any dimension relevant to your analysis. + +## Contributing + +We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to contribute to this project. + +## License -Contributions are welcome! Please feel free to submit a Pull Request. +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. -## 📜 License +--- -This project is licensed under the [MIT License](LICENSE). +**Built with ❤️ by [Base](https://base.org)** From e1d940424fb87f264dba19d21c9dd2fc379272c7 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Wed, 12 Nov 2025 10:52:18 -0800 Subject: [PATCH 15/20] Add WIP text to snapshot example (#128) --- configs/examples/snapshot.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/configs/examples/snapshot.yml b/configs/examples/snapshot.yml index b79c787..b5b73dc 100644 --- a/configs/examples/snapshot.yml +++ b/configs/examples/snapshot.yml @@ -1,5 +1,7 @@ name: Two-Tier Snapshot Functionality Test description: | + IMPORTANT: This feature is currently in development, and the results are not yet reliable. + Two-Tier Snapshot Functionality Test - Demonstrates the new optimized snapshot system with initial snapshots and per-test copying. This benchmark suite uses a two-tier snapshot approach: @@ -21,7 +23,7 @@ benchmarks: command: ./scripts/setup-base-snapshot.sh --network=sepolia --node-type=reth --destination=/data/snapshots/reth/initial destination: /data/snapshots/reth/initial superchain_chain_id: 84532 - - node_type: geth + - node_type: geth # Download an initial geth snapshot that can be copied for each test command: ./scripts/setup-base-snapshot.sh --network=sepolia --node-type=geth --destination=/data/snapshots/geth/initial destination: /data/snapshots/geth/initial From f84c90cef4128b1f1a9d8bcbbb75a28f0f3cff30 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Thu, 13 Nov 2025 09:44:03 -0800 Subject: [PATCH 16/20] chore: add results page link (#129) --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 68ebd62..81becdc 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,16 @@ Base Benchmark is a performance testing framework for Ethereum execution clients [![GitHub pull requests by-label](https://img.shields.io/github/issues-pr-raw/base/benchmark)](https://github.com/base/benchmark/pulls) [![GitHub Issues](https://img.shields.io/github/issues-raw/base/benchmark.svg)](https://github.com/base/benchmark/issues) +## Results + +Public results are available at the following links: + +| Network | Link | +| ------------ | ---------------------------------------------------------------------- | +| Devnet | [https://base.github.io/benchmark/](https://base.github.io/benchmark/) | +| Base Sepolia | Coming soon | +| Base Mainnet | Coming soon | + ## Features - **Performance Evaluation:** Test both block building and validation performance across execution clients (Geth, Reth, and more) From 65d6aeccceb33f8991a3c92305619f465952fd54 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Wed, 3 Dec 2025 08:24:46 -0800 Subject: [PATCH 17/20] feat: support debug_dbGet for simulating blocks (#130) --- .github/workflows/build.yaml | 12 +- .github/workflows/examples.yaml | 4 +- .github/workflows/public-benchmarks.yaml | 4 +- README.md | 21 + go.mod | 173 ++++---- go.sum | 395 +++++++++--------- mise.toml | 2 +- runner/clients/rbuilder/metrics.go | 3 +- runner/clients/reth/metrics.go | 3 +- runner/network/proofprogram/batcher.go | 4 +- runner/payload/simulator/README.md | 170 ++++++++ runner/payload/simulator/cmd/kv.go | 78 +++- runner/payload/simulator/cmd/main.go | 226 +++++++++- runner/payload/simulator/cmd/stats.go | 67 +-- .../payload/simulator/simulatorstats/types.go | 190 ++++----- 15 files changed, 879 insertions(+), 473 deletions(-) create mode 100644 runner/payload/simulator/README.md diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3475e59..78ddc22 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -20,9 +20,7 @@ jobs: submodules: true - name: Set up Go - uses: actions/setup-go@be3c94b385c4f180051c996d336f57a34c397495 # v3.6.1 - with: - go-version: 1.24 + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - name: Install project dependencies run: | @@ -46,9 +44,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go - uses: actions/setup-go@be3c94b385c4f180051c996d336f57a34c397495 # v3.6.1 - with: - go-version: 1.24 + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - name: Install project dependencies run: | @@ -72,9 +68,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go - uses: actions/setup-go@be3c94b385c4f180051c996d336f57a34c397495 # v3.6.1 - with: - go-version: 1.24 + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@9399c7bb15d4c7d47b27263d024f0a4978346ba4 # v1.11.0 diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 545856e..b1a0bc6 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -22,9 +22,7 @@ jobs: submodules: true - name: Set up Go - uses: actions/setup-go@be3c94b385c4f180051c996d336f57a34c397495 # v3.6.1 - with: - go-version: 1.24 + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@9399c7bb15d4c7d47b27263d024f0a4978346ba4 # v1.11.0 diff --git a/.github/workflows/public-benchmarks.yaml b/.github/workflows/public-benchmarks.yaml index 99bde5c..6b29dfc 100644 --- a/.github/workflows/public-benchmarks.yaml +++ b/.github/workflows/public-benchmarks.yaml @@ -22,9 +22,7 @@ jobs: submodules: true - name: Set up Go - uses: actions/setup-go@be3c94b385c4f180051c996d336f57a34c397495 # v3.6.1 - with: - go-version: 1.24 + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - name: Set up Rust uses: actions-rust-lang/setup-rust-toolchain@9399c7bb15d4c7d47b27263d024f0a4978346ba4 # v1.11.0 diff --git a/README.md b/README.md index 81becdc..527c4a8 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,27 @@ Explore the comprehensive collection of benchmark configurations: Choose from storage operations, precompile tests, token workloads, mainnet simulations, and more. +## Tools + +### Payload Simulator + +The **[Payload Simulator](runner/payload/simulator/README.md)** analyzes real-world block execution characteristics by fetching blocks from live chains and computing statistics about: + +- Account and storage operations (reads, writes, creates, deletes) +- Opcode usage patterns (EXP, KECCAK256, etc.) +- Precompile calls (ecrecover, bn256, BLS12-381, etc.) + +Use it to generate realistic benchmark configurations based on actual mainnet data: + +```bash +go build -o bin/payload-simulator ./runner/payload/simulator/cmd + +# RPC must support debug_executionWitness +./bin/payload-simulator \ + --rpc-url \ + --sample-size 100 +``` + ## Architecture ### Benchmark Structure diff --git a/go.mod b/go.mod index 34f6cc5..263a01b 100644 --- a/go.mod +++ b/go.mod @@ -1,156 +1,167 @@ module github.com/base/base-bench -go 1.23.0 +go 1.24.6 -toolchain go1.23.10 +toolchain go1.24.11 require ( - github.com/aws/aws-sdk-go v1.47.13 - github.com/charmbracelet/huh v0.7.0 + github.com/charmbracelet/huh v0.8.0 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc - github.com/ethereum-optimism/optimism v1.13.3 - github.com/ethereum/go-ethereum v1.16.0 + github.com/ethereum-optimism/optimism v1.16.2 + github.com/ethereum/go-ethereum v1.16.5 github.com/holiman/uint256 v1.3.2 github.com/pkg/errors v0.9.1 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.62.0 - github.com/stretchr/testify v1.10.0 - github.com/urfave/cli/v2 v2.27.6 + github.com/prometheus/common v0.67.4 + github.com/stretchr/testify v1.11.1 + github.com/urfave/cli/v2 v2.27.7 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/BurntSushi/toml v1.5.0 // indirect - github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect + github.com/DataDog/zstd v1.5.7 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect + github.com/VictoriaMetrics/fastcache v1.13.2 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/base/go-bip39 v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.20.0 // indirect - github.com/btcsuite/btcd v0.24.2 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect - github.com/btcsuite/btcd/btcutil v1.1.5 // indirect + github.com/bits-and-blooms/bitset v1.24.4 // indirect + github.com/btcsuite/btcd v0.25.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.6 // indirect + github.com/btcsuite/btcd/btcutil v1.1.6 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/catppuccin/go v0.3.0 // indirect + github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charmbracelet/bubbles v0.21.0 // indirect - github.com/charmbracelet/bubbletea v1.3.4 // indirect - github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect + github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7 // indirect + github.com/charmbracelet/bubbletea v1.3.10 // indirect + github.com/charmbracelet/colorprofile v0.3.3 // indirect github.com/charmbracelet/lipgloss v1.1.0 // indirect - github.com/charmbracelet/x/ansi v0.8.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/ansi v0.11.2 // indirect + github.com/charmbracelet/x/cellbuf v0.0.14 // indirect github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f // indirect - github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect - github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/cockroachdb/errors v1.11.3 // indirect - github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/charmbracelet/x/exp/strings v0.0.0-20251201173703-9f73bfd934ff // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/clipperhouse/displaywidth v0.6.1 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.12.0 // indirect + github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect + github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect github.com/cockroachdb/pebble v1.1.5 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.27 // indirect - github.com/consensys/gnark-crypto v0.16.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect - github.com/crate-crypto/go-eth-kzg v1.3.0 // indirect + github.com/cockroachdb/redact v1.1.6 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb // indirect + github.com/consensys/gnark-crypto v0.19.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/dchest/siphash v1.2.3 // indirect + github.com/deckarep/golang-set/v2 v2.8.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/emicklei/dot v1.9.2 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect - github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect - github.com/ethereum/c-kzg-4844/v2 v2.1.0 // indirect + github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.4-0.20251001155152-4eb15ccedf7e // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect + github.com/ferranbt/fastssz v1.0.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20250918194357-1ec6f2e601c6 // indirect + github.com/getsentry/sentry-go v0.40.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/gofrs/flock v0.8.1 // indirect + github.com/gofrs/flock v0.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect + github.com/graph-gophers/graphql-go v1.8.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/hashicorp/go-bexpr v0.1.15 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.14.0 // indirect + github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect + github.com/ipfs/go-cid v0.6.0 // indirect + github.com/ipfs/go-datastore v0.9.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jbenet/goprocess v0.1.4 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.2 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.36.2 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/libp2p/go-libp2p v0.45.0 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.14.0 // indirect + github.com/multiformats/go-multiaddr v0.16.1 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multicodec v0.10.0 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect + github.com/multiformats/go-multistream v0.6.1 // indirect + github.com/multiformats/go-varint v0.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 // indirect + github.com/oapi-codegen/runtime v1.1.2 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/peterh/liner v1.2.2 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/logging v0.2.2 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.10 // indirect - github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/transport/v3 v3.1.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/procfs v0.19.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect - github.com/rs/cors v1.11.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/schollz/progressbar/v3 v3.18.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/supranational/blst v0.3.14 // indirect + github.com/stretchr/objx v0.5.3 // indirect + github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.14 // indirect - github.com/tklauser/numcpus v0.8.0 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/wlynxg/anet v0.0.4 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - golang.org/x/crypto v0.35.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect - golang.org/x/net v0.36.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/term v0.29.0 // indirect - golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.10.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/time v0.14.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - lukechampine.com/blake3 v1.3.0 // indirect - rsc.io/tmplfunc v0.0.3 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + lukechampine.com/blake3 v1.4.1 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101511.0 +replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101603.5 diff --git a/go.sum b/go.sum index 59d97e0..49da22f 100644 --- a/go.sum +++ b/go.sum @@ -1,46 +1,49 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE= -github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= +github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/VictoriaMetrics/fastcache v1.13.2 h1:2XTB49aLSuCex7e9P5rqrfQcMkzGjh5Vq3GMFa8YpCA= +github.com/VictoriaMetrics/fastcache v1.13.2/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-sdk-go v1.47.13 h1:pJgCtldg5azDAFoEcE0fz6n+FnCc1/FY4krtUa5uvZQ= -github.com/aws/aws-sdk-go v1.47.13/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= -github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY= +github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E= +github.com/base/go-bip39 v1.1.0 h1:ely6zK09KaQbfX8wpcmN4pRXy0SbbqMT2QF45P1BNh0= +github.com/base/go-bip39 v1.1.0/go.mod h1:grZZXX8gYycovDC4cLS/RS0DmctofwHN+MUhedYCbO0= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= -github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= +github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd v0.25.0 h1:JPbjwvHGpSywBRuorFFqTjaVP4y6Qw69XJ1nQ6MyWJM= +github.com/btcsuite/btcd v0.25.0/go.mod h1:qbPE+pEiR9643E1s1xu57awsRhlCIm1ZIi6FfeRA4KE= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= -github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.6 h1:IzlsEr9olcSRKB/n7c4351F3xHKxS2lma+1UFGCYd4E= +github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= @@ -56,68 +59,71 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY= github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= -github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= -github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= -github.com/charmbracelet/huh v0.7.0 h1:W8S1uyGETgj9Tuda3/JdVkc3x7DBLZYPZc4c+/rnRdc= -github.com/charmbracelet/huh v0.7.0/go.mod h1:UGC3DZHlgOKHvHC07a5vHag41zzhpPFj34U92sOmyuk= +github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7 h1:JFgG/xnwFfbezlUnFMJy0nusZvytYysV4SCS2cYbvws= +github.com/charmbracelet/bubbles v0.21.1-0.20250623103423-23b8fd6302d7/go.mod h1:ISC1gtLcVilLOf23wvTfoQuYbW2q0JevFxPfUzZ9Ybw= +github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= +github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= +github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI= +github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4= +github.com/charmbracelet/huh v0.8.0 h1:Xz/Pm2h64cXQZn/Jvele4J3r7DDiqFCNIVteYukxDvY= +github.com/charmbracelet/huh v0.8.0/go.mod h1:5YVc+SlZ1IhQALxRPpkGwwEKftN/+OlJlnJYlDRFqN4= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= -github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= -github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/ansi v0.11.2 h1:XAG3FSjiVtFvgEgGrNBkCNNYrsucAt8c6bfxHyROLLs= +github.com/charmbracelet/x/ansi v0.11.2/go.mod h1:9tY2bzX5SiJCU0iWyskjBeI2BRQfvPqI+J760Mjf+Rg= +github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4= +github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA= github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U= github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ= github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 h1:JSt3B+U9iqk37QUU2Rvb6DSBYRLtWqFqfxf8l5hOZUA= github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f h1:UytXHv0UxnsDFmL/7Z9Q5SBYPwSuRLXHbwx+6LycZ2w= github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4= -github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= -github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= -github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/charmbracelet/x/exp/strings v0.0.0-20251201173703-9f73bfd934ff h1:FzCajq562MNVMy/oN4ytwRd5GTl0VSLFVL2zfB6YVrU= +github.com/charmbracelet/x/exp/strings v0.0.0-20251201173703-9f73bfd934ff/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= github.com/charmbracelet/x/xpty v0.1.2 h1:Pqmu4TEJ8KeA9uSkISKMU3f+C1F6OGBn8ABuGlqCbtI= github.com/charmbracelet/x/xpty v0.1.2/go.mod h1:XK2Z0id5rtLWcpeNiMYBccNNBrP2IJnzHI0Lq13Xzq4= +github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= +github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clipperhouse/displaywidth v0.6.1 h1:/zMlAezfDzT2xy6acHBzwIfyu2ic0hgkT83UX5EY2gY= +github.com/clipperhouse/displaywidth v0.6.1/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= +github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= -github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo= +github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506/go.mod h1:Mw7HqKr2kdtu6aYGn3tPmAftiP3QPX63LdK/zcariIo= github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= -github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= -github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= -github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-eth-kzg v1.3.0 h1:05GrhASN9kDAidaFJOda6A4BEvgvuXbazXg/0E3OOdI= -github.com/crate-crypto/go-eth-kzg v1.3.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/cockroachdb/redact v1.1.6 h1:zXJBwDZ84xJNlHl1rMyCojqyIxv+7YUpQiJLQ7n4314= +github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g= +github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= +github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= -github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= -github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= @@ -126,50 +132,52 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= +github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= +github.com/deckarep/golang-set/v2 v2.8.0 h1:swm0rlPCmdWn9mESxKOjWk8hXSqoxOp+ZlfuyaAdFlQ= +github.com/deckarep/golang-set/v2 v2.8.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/emicklei/dot v1.9.2 h1:E/Wjz+BAH+JDhybEpISbo+QyDMNSiu/wqmIW9y922P8= +github.com/emicklei/dot v1.9.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= -github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= -github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101511.0 h1:9t+f65gmxSlKF2nUthaPRbJKcHm6zWJc5bfxj7taJyY= -github.com/ethereum-optimism/op-geth v1.101511.0/go.mod h1:SkytozVEPtnUeBlquwl0Qv5JKvrN/Y5aqh+VkQo/EOI= -github.com/ethereum-optimism/optimism v1.13.3 h1:rfPx7OembMnoEASU1ozA/Foa7Am7UA+h0SB+OUrxn7s= -github.com/ethereum-optimism/optimism v1.13.3/go.mod h1:WrVFtk3cP45tvHs7MARn9KGQu35XIoXo/IOWU6K/rzk= -github.com/ethereum/c-kzg-4844/v2 v2.1.0 h1:gQropX9YFBhl3g4HYhwE70zq3IHFRgbbNPw0Shwzf5w= -github.com/ethereum/c-kzg-4844/v2 v2.1.0/go.mod h1:TC48kOKjJKPbN7C++qIgt0TJzZ70QznYR7Ob+WXl57E= +github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.4-0.20251001155152-4eb15ccedf7e h1:iy1vBIzACYUyOVyoADUwvAiq2eOPC0yVsDUdolPwQjk= +github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.4-0.20251001155152-4eb15ccedf7e/go.mod h1:DYj7+vYJ4cIB7zera9mv4LcAynCL5u4YVfoeUu6Wa+w= +github.com/ethereum-optimism/op-geth v1.101603.5 h1:TK0SUGDYAJpCcftCD91AV4A1c7AjfPMVoZVBslAQx8E= +github.com/ethereum-optimism/op-geth v1.101603.5/go.mod h1:cnGR2M8zX91+rRQxXyNTEOEpw/IwdR8P11FQX7Xaqwk= +github.com/ethereum-optimism/optimism v1.16.2 h1:2oX2y4drbeifsXgSrxVlkTMYpvsJb2fgUiWAg6d68yE= +github.com/ethereum-optimism/optimism v1.16.2/go.mod h1:xvU0mq1c0mCRqMy80mQAR9/+NsNkOy/fHmeraKqfsgI= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= -github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= -github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= +github.com/ferranbt/fastssz v1.0.0 h1:9EXXYsracSqQRBQiHeaVsG/KQeYblPf40hsQPb9Dzk8= +github.com/ferranbt/fastssz v1.0.0/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= -github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/gballet/go-libpcsclite v0.0.0-20250918194357-1ec6f2e601c6 h1:ko+DlyhLqUHpgrvwqs5ybydoGAqjpJQTXpAS7vUqVlM= +github.com/gballet/go-libpcsclite v0.0.0-20250918194357-1ec6f2e601c6/go.mod h1:3IVE7v4II2gS2V5amIH7F7NeYQtbbORtQtjdflgS1vk= +github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo= +github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= @@ -184,8 +192,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -195,19 +203,18 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.8.0 h1:NT05/H+PdH1/PONExlUycnhULYHBy98dxV63WYc0Ng8= +github.com/graph-gophers/graphql-go v1.8.0/go.mod h1:23olKZ7duEvHlF/2ELEoSZaY1aNPfShjP782SOoNTyM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= -github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= +github.com/hashicorp/go-bexpr v0.1.15 h1:flTYJAqZAlK+t8ezezb6WQGlRO1D4+GEF/HmH+xZo5k= +github.com/hashicorp/go-bexpr v0.1.15/go.mod h1:HGKbAByHn2aJWUV47gL7+IjLK79iU3EZIbOwCXJZLoE= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= @@ -215,8 +222,8 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8z github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db h1:IZUYC/xb3giYwBLMnr8d0TGTzPKFGNTCGgGLoyeX330= +github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db/go.mod h1:xTEYN9KCHxuYHs+NmrmzFcnvHMzLLNiGFafCb1n3Mfg= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= @@ -225,39 +232,30 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4= +github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= -github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30= +github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ= +github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w= +github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -268,26 +266,28 @@ github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzW github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.36.2 h1:BbqRkDaGC3/5xfaJakLV/BrpjlAuYqSB0lRvtzL3B/U= -github.com/libp2p/go-libp2p v0.36.2/go.mod h1:XO3joasRE4Eup8yCTTP/+kX+g92mOgRaadk46LmPhHY= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw= +github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= github.com/libp2p/go-libp2p-pubsub v0.12.0 h1:PENNZjSfk8KYxANRlpipdS7+BfLmOl3L2E/6vSNjbdI= github.com/libp2p/go-libp2p-pubsub v0.12.0/go.mod h1:Oi0zw9aw8/Y5GC99zt+Ef2gYAl+0nZlwdJonDyOz/sE= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -295,9 +295,6 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= @@ -310,20 +307,20 @@ github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aG github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= -github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= +github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc= +github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= +github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= +github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= +github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= @@ -331,9 +328,10 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI= +github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -351,17 +349,16 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= @@ -369,32 +366,35 @@ github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLh github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM= +github.com/pion/transport/v3 v3.1.1/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc= +github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4= +github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQmCN62HpA= +github.com/schollz/progressbar/v3 v3.18.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -402,9 +402,8 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= +github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -412,37 +411,37 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.14 h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo= -github.com/supranational/blst v0.3.14/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= +github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= -github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= -github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= -github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= +github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= +github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -github.com/wlynxg/anet v0.0.4 h1:0de1OFQxnNqAu+x2FAKKCVIrnfGKQbs7FQz++tB0+Uw= -github.com/wlynxg/anet v0.0.4/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= -github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -451,10 +450,10 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= +golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -477,8 +476,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= -golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -486,8 +485,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -505,21 +504,20 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -527,8 +525,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -538,10 +536,10 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -562,8 +560,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -575,14 +573,11 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= -lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= +lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= diff --git a/mise.toml b/mise.toml index c807768..50494b7 100644 --- a/mise.toml +++ b/mise.toml @@ -1,2 +1,2 @@ [tools] -go = "1.22.8" +go = "1.24.11" diff --git a/runner/clients/rbuilder/metrics.go b/runner/clients/rbuilder/metrics.go index 0bbc657..c2b1290 100644 --- a/runner/clients/rbuilder/metrics.go +++ b/runner/clients/rbuilder/metrics.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" "github.com/prometheus/common/expfmt" + "github.com/prometheus/common/model" ) type metricsCollector struct { @@ -65,7 +66,7 @@ func (r *metricsCollector) Collect(ctx context.Context, m *metrics.BlockMetrics) return fmt.Errorf("failed to read metrics response: %w", err) } - txtParser := expfmt.TextParser{} + txtParser := expfmt.NewTextParser(model.LegacyValidation) metrics, err := txtParser.TextToMetricFamilies(bytes.NewReader(body)) if err != nil { return fmt.Errorf("failed to parse metrics: %w", err) diff --git a/runner/clients/reth/metrics.go b/runner/clients/reth/metrics.go index ab57ab8..4cf17d2 100644 --- a/runner/clients/reth/metrics.go +++ b/runner/clients/reth/metrics.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" "github.com/prometheus/common/expfmt" + "github.com/prometheus/common/model" ) type metricsCollector struct { @@ -64,7 +65,7 @@ func (r *metricsCollector) Collect(ctx context.Context, m *metrics.BlockMetrics) return fmt.Errorf("failed to read metrics response: %w", err) } - txtParser := expfmt.TextParser{} + txtParser := expfmt.NewTextParser(model.LegacyValidation) metrics, err := txtParser.TextToMetricFamilies(bytes.NewReader(body)) if err != nil { return fmt.Errorf("failed to parse metrics: %w", err) diff --git a/runner/network/proofprogram/batcher.go b/runner/network/proofprogram/batcher.go index e154fd1..0e4973d 100644 --- a/runner/network/proofprogram/batcher.go +++ b/runner/network/proofprogram/batcher.go @@ -142,7 +142,7 @@ func (b *Batcher) CreateAndSendBatch(payloads []engine.ExecutableData, parentHas return fmt.Errorf("failed to create blob: %w", err) } - sidecar, blobHashes, err := txmgr.MakeSidecar([]*eth.Blob{&blob}) + sidecar, blobHashes, err := txmgr.MakeSidecar([]*eth.Blob{&blob}, false) if err != nil { return fmt.Errorf("failed to create sidecar: %w", err) } @@ -156,7 +156,7 @@ func (b *Batcher) CreateAndSendBatch(payloads []engine.ExecutableData, parentHas return fmt.Errorf("pending header does not have excess blob gas") } - blobBaseFee := eth.CalcBlobFeeDefault(pendingHeader.Header()) + blobBaseFee := eth.CalcBlobFeeCancun(*pendingHeader.Header().ExcessBlobGas) blobFeeCap := new(uint256.Int).Mul(uint256.NewInt(2), uint256.MustFromBig(blobBaseFee)) if blobFeeCap.Lt(uint256.NewInt(params.GWei)) { // ensure we meet 1 gwei geth tx-pool minimum blobFeeCap = uint256.NewInt(params.GWei) diff --git a/runner/payload/simulator/README.md b/runner/payload/simulator/README.md new file mode 100644 index 0000000..128fd3e --- /dev/null +++ b/runner/payload/simulator/README.md @@ -0,0 +1,170 @@ +# Payload Simulator + +The Payload Simulator is a tool for analyzing real-world block execution characteristics on Ethereum and L2 chains. It fetches blocks from a live chain via RPC, re-executes them locally using execution witnesses, and outputs detailed statistics about account operations, storage access patterns, opcode usage, and precompile calls. + +## Use Cases + +- **Benchmark Configuration** - Generate realistic workload parameters based on actual mainnet/testnet data +- **Performance Analysis** - Understand which operations dominate block execution time +- **Precompile Usage** - Identify precompile usage patterns across blocks +- **Capacity Planning** - Analyze storage and account access patterns at scale + +## Building + +From the repository root: + +```bash +go build -o bin/payload-simulator ./runner/payload/simulator/cmd +``` + +## Usage + +> **Note:** The RPC endpoint must support `debug_executionWitness` (for reth) or `debug_dbGet` (for geth) depending on the `--client` flag. + +```bash +./bin/payload-simulator \ + --rpc-url \ + --sample-size 100 \ + --num-workers 10 \ + --client reth +``` + +### Flags + +| Flag | Description | Default | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------- | +| `--rpc-url` | RPC URL of the chain | - | +| `--sample-size` | Number of blocks to sample | `10` | +| `--sample-range` | Range of blocks to sample from. If equal to `sample-size`, fetches consecutive blocks. If larger, randomly samples blocks from the range. | `sample-size` | +| `--num-workers` | Number of parallel workers for fetching and processing | `10` | +| `--genesis` | Path to genesis JSON file | `genesis.json` | +| `--chain-id` | Chain ID to load genesis config from (uses OP Stack defaults if set) | - | +| `--client` | Client type for preimage fetching: `geth` (uses `debug_dbGet`) or `reth` (uses `debug_executionWitness`) | `reth` | + +### Examples + +**Analyze the last 100 consecutive blocks using reth:** + +```bash +./bin/payload-simulator \ + --rpc-url \ + --sample-size 100 \ + --client reth +``` + +**Analyze the last 100 consecutive blocks using geth:** + +```bash +./bin/payload-simulator \ + --rpc-url \ + --sample-size 100 \ + --client geth +``` + +**Sample 50 random blocks from the last 10,000 blocks:** + +```bash +./bin/payload-simulator \ + --rpc-url \ + --sample-size 50 \ + --sample-range 10000 +``` + +**Use custom genesis file:** + +```bash +./bin/payload-simulator \ + --rpc-url \ + --genesis ./custom-genesis.json \ + --sample-size 20 +``` + +## Output Statistics + +The simulator outputs aggregate statistics for blocks and transactions: + +### Account Operations + +- **Accounts Loaded** - Number of account state reads +- **Accounts Deleted** - Number of account deletions +- **Accounts Updated** - Number of account state updates +- **Accounts Created** - Number of new accounts created + +### Storage Operations + +- **Storage Loaded** - Number of storage slot reads (SLOAD) +- **Storage Deleted** - Number of storage slot deletions +- **Storage Updated** - Number of storage slot writes (SSTORE) +- **Storage Created** - Number of new storage slots created + +### Code Metrics + +- **Code Size Loaded** - Total bytes of contract code loaded +- **Number of Contracts Loaded** - Count of unique contracts executed + +### Opcode Statistics + +Tracks usage of expensive opcodes like: + +- `EXP` - Exponentiation +- `KECCAK256` - Keccak hashing + +### Precompile Statistics + +Tracks calls to precompiled contracts: + +- `ecrecover` (0x01) - ECDSA recovery +- `sha256hash` (0x02) - SHA-256 hashing +- `ripemd160hash` (0x03) - RIPEMD-160 hashing +- `dataCopy` (0x04) - Identity/data copy +- `bigModExp` (0x05) - Modular exponentiation +- `bn256Add` (0x06) - BN256 curve addition +- `bn256ScalarMul` (0x07) - BN256 scalar multiplication +- `bn256Pairing` (0x08) - BN256 pairing check +- `blake2F` (0x09) - BLAKE2 compression +- `bls12381*` (0x0b-0x11) - BLS12-381 operations +- `p256Verify` (0x0100) - P-256 signature verification + +## Example Output + +``` +Aggregate block stats: +- Accounts Reads: 1523.45 +- Accounts Deletes: 0.00 +- Accounts Updates: 245.67 +- Accounts Created: 12.34 +- Storage Reads: 8934.56 +- Storage Deletes: 23.45 +- Storage Updates: 1234.56 +- Storage Created: 456.78 +- Code Size Loaded: 234567.89 +- Number of Contracts Loaded: 89.12 +- Opcode Stats: + - EXP: 123.45 + - KECCAK256: 5678.90 +- Precompile Stats: + - ecrecover: 234.56 + - bn256Add: 12.34 + +Aggregate tx stats: +- Accounts Reads: 15.23 +- Storage Reads: 89.34 +... +``` + +## Requirements + +- The RPC endpoint must support the appropriate debug method based on `--client`: + - **reth**: Requires `debug_executionWitness` method + - **geth**: Requires `debug_dbGet` method +- Genesis configuration must match the target chain + +## How It Works + +1. **Block Selection** - Selects block numbers to sample (consecutive or random based on `sample-range`) +2. **Parallel Fetching** - Uses worker pool to fetch blocks and preimage data concurrently + - **reth mode**: Fetches entire execution witness upfront via `debug_executionWitness` + - **geth mode**: Fetches preimages on-demand via `debug_dbGet` during execution +3. **Local Re-execution** - Re-executes each block locally using the preimage data +4. **Statistics Collection** - Traces execution to collect account, storage, opcode, and precompile statistics +5. **Aggregation** - Computes per-block and per-transaction averages across all sampled blocks diff --git a/runner/payload/simulator/cmd/kv.go b/runner/payload/simulator/cmd/kv.go index 1ac165d..fa997a3 100644 --- a/runner/payload/simulator/cmd/kv.go +++ b/runner/payload/simulator/cmd/kv.go @@ -2,23 +2,20 @@ package main import ( "bytes" + "context" "errors" "fmt" + "time" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rpc" ) -// KeyValueStore is a subset of the ethdb.KeyValueStore interface that's required for block processing. -type KeyValueStore interface { - ethdb.KeyValueReader - ethdb.Batcher - // Put inserts the given value into the key-value data store. - Put(key []byte, value []byte) error -} - // StateOracle defines the high-level API used to retrieve L2 state data pre-images // The returned data is always the preimage of the requested hash. type StateOracle interface { @@ -56,13 +53,68 @@ func (o *preimageOracle) NodeByHash(nodeHash common.Hash, chainID eth.ChainID) [ var _ StateOracle = (*preimageOracle)(nil) +type gethPreimageOracle struct { + db ethdb.KeyValueStore + client *ethclient.Client +} + +func newGethPreimageOracle(db ethdb.KeyValueStore, client *ethclient.Client) *gethPreimageOracle { + return &gethPreimageOracle{ + db: db, + client: client, + } +} + +const maxDbGetRetries = 5 + +// debugDbGet calls the debug_dbGet RPC method with retry logic. +// Retries up to maxDbGetRetries times with exponential backoff. +func debugDbGet(client *rpc.Client, key string) (hexutil.Bytes, error) { + var result hexutil.Bytes + var lastErr error + + for attempt := 0; attempt < maxDbGetRetries; attempt++ { + err := client.CallContext(context.Background(), &result, "debug_dbGet", key) + if err == nil { + return result, nil + } + + lastErr = err + + // Don't sleep after the last attempt + if attempt < maxDbGetRetries-1 { + backoff := time.Duration(1<= sample-size (%d)", sampleRange, sampleSize) + } + if numWorkers < 1 { + numWorkers = 1 + } var genesis *core.Genesis var err error @@ -82,37 +121,34 @@ func main() { return err } - // just do latest block for now latestBlock, err := client.BlockByNumber(c.Context, nil) if err != nil { return err } + latestBlockNum := latestBlock.NumberU64() - logger := log.NewLogger(os.Stdout, log.ReadCLIConfig(c)) - - aggregateBlockStats := simulatorstats.NewStats() - totalTxs := 0 - - headerCache := make(map[common.Hash]*types.Header) + logger := oplog.NewLogger(os.Stdout, oplog.ReadCLIConfig(c)) - allBlockStats := make([]*simulatorstats.Stats, sampleSize) + // Select which block numbers to sample + blockNumbers := selectBlockNumbers(latestBlockNum-100, sampleSize, sampleRange) - for i := 0; i < sampleSize; i++ { - logger.Info("Fetching block stats", "block", latestBlock.Number().String()) + logger.Info("Starting parallel block processing", "blocks", len(blockNumbers), "workers", numWorkers, "client", clientType) - blockStats, txStats, err := fetchBlockStats(logger, client, latestBlock, genesis, headerCache) - if err != nil { - return err - } + // Process blocks in parallel using worker pool + results, err := processBlocksParallel(c.Context, logger, client, genesis, blockNumbers, numWorkers, clientType) + if err != nil { + return err + } - latestBlock, err = client.BlockByHash(c.Context, latestBlock.ParentHash()) - if err != nil { - return err - } + // Aggregate results + aggregateBlockStats := simulatorstats.NewStats() + totalTxs := 0 + allBlockStats := make([]*simulatorstats.Stats, len(results)) - aggregateBlockStats = aggregateBlockStats.Add(blockStats) - allBlockStats[i] = blockStats - totalTxs += len(txStats) + for i, result := range results { + aggregateBlockStats = aggregateBlockStats.Add(result.blockStats) + allBlockStats[i] = result.blockStats + totalTxs += result.txCount } aggregateTxStats := aggregateBlockStats.Copy().Mul(1 / float64(totalTxs)) @@ -140,3 +176,147 @@ func main() { panic(err) } } + +// blockResult holds the result of processing a single block. +type blockResult struct { + index int + blockStats *simulatorstats.Stats + txCount int + err error +} + +// processBlocksParallel fetches and processes blocks in parallel using a worker pool. +func processBlocksParallel( + ctx context.Context, + logger log.Logger, + client *ethclient.Client, + genesis *core.Genesis, + blockNumbers []uint64, + numWorkers int, + clientType string, +) ([]blockResult, error) { + // Channels for work distribution and result collection + jobs := make(chan struct { + index int + blockNum uint64 + }, len(blockNumbers)) + results := make(chan blockResult, len(blockNumbers)) + + // Start workers + var wg sync.WaitGroup + for w := 0; w < numWorkers; w++ { + wg.Add(1) + go func() { + defer wg.Done() + // Each worker has its own header cache to avoid contention + headerCache := make(map[common.Hash]*types.Header) + + for job := range jobs { + block, err := client.BlockByNumber(ctx, big.NewInt(int64(job.blockNum))) + if err != nil { + results <- blockResult{index: job.index, err: fmt.Errorf("failed to fetch block %d: %w", job.blockNum, err)} + continue + } + + logger.Info("Processing block", "block", block.Number().String(), "index", job.index+1, "total", len(blockNumbers)) + + // Select fetch function based on client type + var blockStats *simulatorstats.Stats + var txStats []*simulatorstats.Stats + switch clientType { + case "geth": + blockStats, txStats, err = fetchBlockStatsGeth(logger, client, block, genesis, headerCache) + case "reth": + blockStats, txStats, err = fetchBlockStatsReth(logger, client, block, genesis, headerCache) + } + if err != nil { + results <- blockResult{index: job.index, err: fmt.Errorf("failed to process block %d: %w", job.blockNum, err)} + continue + } + + results <- blockResult{ + index: job.index, + blockStats: blockStats, + txCount: len(txStats), + } + } + }() + } + + // Send jobs to workers + for i, blockNum := range blockNumbers { + jobs <- struct { + index int + blockNum uint64 + }{index: i, blockNum: blockNum} + } + close(jobs) + + // Wait for all workers to finish and close results channel + go func() { + wg.Wait() + close(results) + }() + + // Collect results + collected := make([]blockResult, len(blockNumbers)) + for result := range results { + if result.err != nil { + return nil, result.err + } + collected[result.index] = result + } + + return collected, nil +} + +// selectBlockNumbers returns a slice of block numbers to sample. +// If sampleRange equals sampleSize, returns consecutive blocks ending at latestBlockNum. +// Otherwise, randomly selects sampleSize blocks from the range [latestBlockNum-sampleRange+1, latestBlockNum]. +func selectBlockNumbers(latestBlockNum uint64, sampleSize, sampleRange int) []uint64 { + // Calculate the starting block number (ensure we don't go below 1) + startBlock := uint64(1) + if latestBlockNum > uint64(sampleRange-1) { + startBlock = latestBlockNum - uint64(sampleRange-1) + } + + // If range equals size, return consecutive blocks (original behavior) + if sampleRange == sampleSize { + blocks := make([]uint64, sampleSize) + for i := 0; i < sampleSize; i++ { + blocks[i] = latestBlockNum - uint64(i) + } + return blocks + } + + // Randomly select sampleSize unique blocks from the range + availableBlocks := int(latestBlockNum - startBlock + 1) + if availableBlocks < sampleSize { + // Not enough blocks available, use all of them + blocks := make([]uint64, availableBlocks) + for i := 0; i < availableBlocks; i++ { + blocks[i] = startBlock + uint64(i) + } + return blocks + } + + // Use reservoir sampling approach: generate random indices + selectedIndices := make(map[int]struct{}, sampleSize) + for len(selectedIndices) < sampleSize { + idx := rand.Intn(availableBlocks) + selectedIndices[idx] = struct{}{} + } + + // Convert indices to block numbers + blocks := make([]uint64, 0, sampleSize) + for idx := range selectedIndices { + blocks = append(blocks, startBlock+uint64(idx)) + } + + // Sort blocks in descending order (newest first) for consistent behavior + sort.Slice(blocks, func(i, j int) bool { + return blocks[i] > blocks[j] + }) + + return blocks +} diff --git a/runner/payload/simulator/cmd/stats.go b/runner/payload/simulator/cmd/stats.go index c2dfc63..9349a50 100644 --- a/runner/payload/simulator/cmd/stats.go +++ b/runner/payload/simulator/cmd/stats.go @@ -27,7 +27,20 @@ import ( "github.com/ethereum/go-ethereum/triedb" ) -func fetchBlockStats(log log.Logger, client *ethclient.Client, block *types.Block, genesis *core.Genesis, headerCache map[common.Hash]*types.Header) (*simulatorstats.Stats, []*simulatorstats.Stats, error) { +func fetchBlockStatsGeth(log log.Logger, client *ethclient.Client, block *types.Block, genesis *core.Genesis, headerCache map[common.Hash]*types.Header) (*simulatorstats.Stats, []*simulatorstats.Stats, error) { + parentBlock, err := client.BlockByHash(context.Background(), block.ParentHash()) + if err != nil { + return nil, nil, err + } + + db := memorydb.New() + oracleKv := newGethPreimageOracle(db, client) + oracleDb := NewOracleBackedDB(db, oracleKv, eth.ChainIDFromBig(genesis.Config.ChainID)) + + return executeBlock(log, client, parentBlock, block, oracleDb, genesis, headerCache) +} + +func fetchBlockStatsReth(log log.Logger, client *ethclient.Client, block *types.Block, genesis *core.Genesis, headerCache map[common.Hash]*types.Header) (*simulatorstats.Stats, []*simulatorstats.Stats, error) { log.Info("Fetching execution witness") var result *eth.ExecutionWitness @@ -43,7 +56,21 @@ func fetchBlockStats(log log.Logger, client *ethclient.Client, block *types.Bloc return nil, nil, err } - return executeBlock(log, client, parentBlock, block, result, genesis, headerCache) + codes := make(map[common.Hash][]byte) + nodes := make(map[common.Hash][]byte) + for _, code := range result.Codes { + codes[crypto.Keccak256Hash(code)] = []byte(code) + } + + for _, node := range result.State { + nodes[crypto.Keccak256Hash(node)] = []byte(node) + } + + db := memorydb.New() + oracleKv := newPreimageOracle(db, codes, nodes) + oracleDb := NewOracleBackedDB(db, oracleKv, eth.ChainIDFromBig(genesis.Config.ChainID)) + + return executeBlock(log, client, parentBlock, block, oracleDb, genesis, headerCache) } type blockCtx struct { @@ -87,24 +114,16 @@ func (b *blockCtx) Config() *params.ChainConfig { return b.config } -func updateStats(db *state.StateDB, codePrestate map[common.Hash][]byte, s *simulatorstats.Stats) { +func updateStats(db *state.StateDB, s *simulatorstats.Stats) { s.AccountLoaded = float64(db.AccountLoaded) s.AccountDeleted = float64(db.AccountDeleted) s.AccountsUpdated = float64(db.AccountUpdated) s.StorageLoaded = float64(db.StorageLoaded) s.StorageDeleted = float64(db.StorageDeleted.Load()) s.StorageUpdated = float64(db.StorageUpdated.Load()) - - totalCodeSize := uint64(0) - for _, code := range codePrestate { - totalCodeSize += uint64(len(code)) - } - - s.CodeSizeLoaded = float64(totalCodeSize) - s.NumContractsLoaded = float64(len(codePrestate)) s.Opcodes = s.Opcodes.RemoveAllBut("EXP", "KECCAK256") } -func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, executedBlock *types.Block, witness *eth.ExecutionWitness, genesis *core.Genesis, headerCache map[common.Hash]*types.Header) (*simulatorstats.Stats, []*simulatorstats.Stats, error) { +func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, executedBlock *types.Block, oracleDb *OracleKeyValueStore, genesis *core.Genesis, headerCache map[common.Hash]*types.Header) (*simulatorstats.Stats, []*simulatorstats.Stats, error) { header := &types.Header{ ParentHash: parent.Hash(), Coinbase: executedBlock.Coinbase(), @@ -118,10 +137,7 @@ func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, RequestsHash: executedBlock.RequestsHash(), } - codes := make(map[common.Hash][]byte) - nodes := make(map[common.Hash][]byte) - - chainCfg, err := chainconfig.ChainConfigByChainID(eth.ChainIDFromBig(big.NewInt(8453))) + chainCfg, err := chainconfig.L2ChainConfigByChainID(eth.ChainIDFromBig(big.NewInt(8453))) if err != nil { return nil, nil, fmt.Errorf("failed to get chain config: %w", err) } @@ -130,18 +146,6 @@ func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, chainCtx := newBlockCtx(genesis, client, headerCache) - for _, code := range witness.Codes { - codes[crypto.Keccak256Hash(code)] = []byte(code) - } - - for _, node := range witness.State { - nodes[crypto.Keccak256Hash(node)] = []byte(node) - } - - db := memorydb.New() - oracleKv := newPreimageOracle(db, codes, nodes) - oracleDb := NewOracleBackedDB(db, oracleKv, eth.ChainIDFromBig(genesis.Config.ChainID)) - // copied from geth: initialState, err := state.New(parent.Root(), state.NewDatabase(triedb.NewDatabase(rawdb.NewDatabase(oracleDb), nil), nil)) if err != nil { @@ -182,12 +186,13 @@ func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, gasPool := new(core.GasPool) gasPool.AddGas(header.GasLimit) - updateStats(statedb, codes, blockStats) + updateStats(statedb, blockStats) log.Info("Finished initializing state db") hookedState := state.NewHookedState(statedb, blockTracer.Tracer()) for i, tx := range executedBlock.Transactions() { + log.Debug("Executing tx", "tx", tx.Hash().Hex()) if tx.Gas() > header.GasLimit { return nil, nil, fmt.Errorf("tx consumes %d gas, more than available in L1 block %d", tx.Gas(), header.GasLimit) } @@ -204,7 +209,7 @@ func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, } prevBlockStats := blockStats.Copy() - updateStats(statedb, codes, blockStats) + updateStats(statedb, blockStats) blockStats.Precompiles = blockTracer.precompileStats.Copy() txStats[i] = blockStats.Sub(prevBlockStats) } @@ -214,7 +219,7 @@ func executeBlock(log log.Logger, client *ethclient.Client, parent *types.Block, log.Info("Finished executing block transactions") - updateStats(statedb, codes, blockStats) + updateStats(statedb, blockStats) isCancun := genesis.Config.IsCancun(header.Number, header.Time) // Write state changes to db diff --git a/runner/payload/simulator/simulatorstats/types.go b/runner/payload/simulator/simulatorstats/types.go index 860d9ea..f89e5fd 100644 --- a/runner/payload/simulator/simulatorstats/types.go +++ b/runner/payload/simulator/simulatorstats/types.go @@ -142,8 +142,6 @@ func (s *StatsConfig) ToStats() *Stats { storageDeleted := 0.0 storageUpdated := 0.0 storageCreated := 0.0 - codeSizeLoaded := 0.0 - numContractsLoaded := 0.0 callsPerBlock := "fill" opcodes := make(OpcodeStats) precompiles := make(OpcodeStats) @@ -172,18 +170,12 @@ func (s *StatsConfig) ToStats() *Stats { if s.StorageCreated != nil { storageCreated = *s.StorageCreated } - if s.CodeSizeLoaded != nil { - codeSizeLoaded = *s.CodeSizeLoaded - } if s.Opcodes != nil { opcodes = *s.Opcodes } if s.Precompiles != nil { precompiles = *s.Precompiles } - if s.NumContractsLoaded != nil { - numContractsLoaded = *s.NumContractsLoaded - } if s.CallsPerBlock != nil { if *s.CallsPerBlock == "fill" { callsPerBlock = "fill" @@ -199,36 +191,32 @@ func (s *StatsConfig) ToStats() *Stats { } return &Stats{ - AccountLoaded: accountLoaded, - AccountDeleted: accountDeleted, - AccountsUpdated: accountsUpdated, - AccountsCreated: accountsCreated, - StorageLoaded: storageLoaded, - StorageDeleted: storageDeleted, - StorageUpdated: storageUpdated, - StorageCreated: storageCreated, - CodeSizeLoaded: codeSizeLoaded, - NumContractsLoaded: numContractsLoaded, - CallsPerBlock: callsPerBlock, - Opcodes: opcodes, - Precompiles: precompiles, + AccountLoaded: accountLoaded, + AccountDeleted: accountDeleted, + AccountsUpdated: accountsUpdated, + AccountsCreated: accountsCreated, + StorageLoaded: storageLoaded, + StorageDeleted: storageDeleted, + StorageUpdated: storageUpdated, + StorageCreated: storageCreated, + CallsPerBlock: callsPerBlock, + Opcodes: opcodes, + Precompiles: precompiles, } } type Stats struct { - AccountLoaded float64 - AccountDeleted float64 - AccountsUpdated float64 - AccountsCreated float64 - StorageLoaded float64 - StorageDeleted float64 - StorageUpdated float64 - StorageCreated float64 - CodeSizeLoaded float64 - NumContractsLoaded float64 - CallsPerBlock string - Opcodes OpcodeStats - Precompiles OpcodeStats + AccountLoaded float64 + AccountDeleted float64 + AccountsUpdated float64 + AccountsCreated float64 + StorageLoaded float64 + StorageDeleted float64 + StorageUpdated float64 + StorageCreated float64 + CallsPerBlock string + Opcodes OpcodeStats + Precompiles OpcodeStats } func (s *Stats) ToConfig() (*abi.SimulatorConfig, error) { @@ -267,103 +255,91 @@ func NewStats() *Stats { func (s *Stats) Sub(other *Stats) *Stats { return &Stats{ - AccountLoaded: s.AccountLoaded - other.AccountLoaded, - AccountDeleted: s.AccountDeleted - other.AccountDeleted, - AccountsUpdated: s.AccountsUpdated - other.AccountsUpdated, - AccountsCreated: s.AccountsCreated - other.AccountsCreated, - StorageLoaded: s.StorageLoaded - other.StorageLoaded, - StorageDeleted: s.StorageDeleted - other.StorageDeleted, - StorageUpdated: s.StorageUpdated - other.StorageUpdated, - StorageCreated: s.StorageCreated - other.StorageCreated, - Opcodes: s.Opcodes.Sub(other.Opcodes), - CodeSizeLoaded: s.CodeSizeLoaded - other.CodeSizeLoaded, - NumContractsLoaded: s.NumContractsLoaded - other.NumContractsLoaded, - Precompiles: s.Precompiles.Sub(other.Precompiles), + AccountLoaded: s.AccountLoaded - other.AccountLoaded, + AccountDeleted: s.AccountDeleted - other.AccountDeleted, + AccountsUpdated: s.AccountsUpdated - other.AccountsUpdated, + AccountsCreated: s.AccountsCreated - other.AccountsCreated, + StorageLoaded: s.StorageLoaded - other.StorageLoaded, + StorageDeleted: s.StorageDeleted - other.StorageDeleted, + StorageUpdated: s.StorageUpdated - other.StorageUpdated, + StorageCreated: s.StorageCreated - other.StorageCreated, + Opcodes: s.Opcodes.Sub(other.Opcodes), + Precompiles: s.Precompiles.Sub(other.Precompiles), } } func (s *Stats) Pow(n float64) *Stats { return &Stats{ - AccountLoaded: math.Pow(s.AccountLoaded, n), - AccountDeleted: math.Pow(s.AccountDeleted, n), - AccountsUpdated: math.Pow(s.AccountsUpdated, n), - AccountsCreated: math.Pow(s.AccountsCreated, n), - StorageLoaded: math.Pow(s.StorageLoaded, n), - StorageDeleted: math.Pow(s.StorageDeleted, n), - StorageUpdated: math.Pow(s.StorageUpdated, n), - StorageCreated: math.Pow(s.StorageCreated, n), - Opcodes: s.Opcodes.Pow(n), - CodeSizeLoaded: math.Pow(s.CodeSizeLoaded, n), - NumContractsLoaded: math.Pow(s.NumContractsLoaded, n), - Precompiles: s.Precompiles.Pow(n), + AccountLoaded: math.Pow(s.AccountLoaded, n), + AccountDeleted: math.Pow(s.AccountDeleted, n), + AccountsUpdated: math.Pow(s.AccountsUpdated, n), + AccountsCreated: math.Pow(s.AccountsCreated, n), + StorageLoaded: math.Pow(s.StorageLoaded, n), + StorageDeleted: math.Pow(s.StorageDeleted, n), + StorageUpdated: math.Pow(s.StorageUpdated, n), + StorageCreated: math.Pow(s.StorageCreated, n), + Opcodes: s.Opcodes.Pow(n), + Precompiles: s.Precompiles.Pow(n), } } func (s *Stats) Add(other *Stats) *Stats { return &Stats{ - AccountLoaded: s.AccountLoaded + other.AccountLoaded, - AccountDeleted: s.AccountDeleted + other.AccountDeleted, - AccountsUpdated: s.AccountsUpdated + other.AccountsUpdated, - AccountsCreated: s.AccountsCreated + other.AccountsCreated, - StorageLoaded: s.StorageLoaded + other.StorageLoaded, - StorageDeleted: s.StorageDeleted + other.StorageDeleted, - StorageUpdated: s.StorageUpdated + other.StorageUpdated, - StorageCreated: s.StorageCreated + other.StorageCreated, - Opcodes: s.Opcodes.Add(other.Opcodes), - CodeSizeLoaded: s.CodeSizeLoaded + other.CodeSizeLoaded, - NumContractsLoaded: s.NumContractsLoaded + other.NumContractsLoaded, - Precompiles: s.Precompiles.Add(other.Precompiles), + AccountLoaded: s.AccountLoaded + other.AccountLoaded, + AccountDeleted: s.AccountDeleted + other.AccountDeleted, + AccountsUpdated: s.AccountsUpdated + other.AccountsUpdated, + AccountsCreated: s.AccountsCreated + other.AccountsCreated, + StorageLoaded: s.StorageLoaded + other.StorageLoaded, + StorageDeleted: s.StorageDeleted + other.StorageDeleted, + StorageUpdated: s.StorageUpdated + other.StorageUpdated, + StorageCreated: s.StorageCreated + other.StorageCreated, + Opcodes: s.Opcodes.Add(other.Opcodes), + Precompiles: s.Precompiles.Add(other.Precompiles), } } func (s *Stats) Mul(n float64) *Stats { return &Stats{ - AccountLoaded: s.AccountLoaded * n, - AccountDeleted: s.AccountDeleted * n, - AccountsUpdated: s.AccountsUpdated * n, - AccountsCreated: s.AccountsCreated * n, - StorageLoaded: s.StorageLoaded * n, - StorageDeleted: s.StorageDeleted * n, - StorageUpdated: s.StorageUpdated * n, - StorageCreated: s.StorageCreated * n, - Opcodes: s.Opcodes.Mul(n), - CodeSizeLoaded: s.CodeSizeLoaded * n, - NumContractsLoaded: s.NumContractsLoaded * n, - Precompiles: s.Precompiles.Mul(n), + AccountLoaded: s.AccountLoaded * n, + AccountDeleted: s.AccountDeleted * n, + AccountsUpdated: s.AccountsUpdated * n, + AccountsCreated: s.AccountsCreated * n, + StorageLoaded: s.StorageLoaded * n, + StorageDeleted: s.StorageDeleted * n, + StorageUpdated: s.StorageUpdated * n, + StorageCreated: s.StorageCreated * n, + Opcodes: s.Opcodes.Mul(n), + Precompiles: s.Precompiles.Mul(n), } } func (s *Stats) Round() *Stats { return &Stats{ - AccountLoaded: math.Round(s.AccountLoaded), - AccountDeleted: math.Round(s.AccountDeleted), - AccountsUpdated: math.Round(s.AccountsUpdated), - AccountsCreated: math.Round(s.AccountsCreated), - StorageLoaded: math.Round(s.StorageLoaded), - StorageDeleted: math.Round(s.StorageDeleted), - StorageUpdated: math.Round(s.StorageUpdated), - StorageCreated: math.Round(s.StorageCreated), - Opcodes: s.Opcodes.Round(), - CodeSizeLoaded: math.Round(s.CodeSizeLoaded), - NumContractsLoaded: math.Round(s.NumContractsLoaded), - Precompiles: s.Precompiles.Round(), + AccountLoaded: math.Round(s.AccountLoaded), + AccountDeleted: math.Round(s.AccountDeleted), + AccountsUpdated: math.Round(s.AccountsUpdated), + AccountsCreated: math.Round(s.AccountsCreated), + StorageLoaded: math.Round(s.StorageLoaded), + StorageDeleted: math.Round(s.StorageDeleted), + StorageUpdated: math.Round(s.StorageUpdated), + StorageCreated: math.Round(s.StorageCreated), + Opcodes: s.Opcodes.Round(), + Precompiles: s.Precompiles.Round(), } } func (s *Stats) Copy() *Stats { return &Stats{ - AccountLoaded: s.AccountLoaded, - AccountDeleted: s.AccountDeleted, - AccountsUpdated: s.AccountsUpdated, - AccountsCreated: s.AccountsCreated, - StorageLoaded: s.StorageLoaded, - StorageDeleted: s.StorageDeleted, - StorageUpdated: s.StorageUpdated, - StorageCreated: s.StorageCreated, - CodeSizeLoaded: s.CodeSizeLoaded, - NumContractsLoaded: s.NumContractsLoaded, - Opcodes: s.Opcodes.Copy(), - Precompiles: s.Precompiles.Copy(), + AccountLoaded: s.AccountLoaded, + AccountDeleted: s.AccountDeleted, + AccountsUpdated: s.AccountsUpdated, + AccountsCreated: s.AccountsCreated, + StorageLoaded: s.StorageLoaded, + StorageDeleted: s.StorageDeleted, + StorageUpdated: s.StorageUpdated, + StorageCreated: s.StorageCreated, + Opcodes: s.Opcodes.Copy(), + Precompiles: s.Precompiles.Copy(), } } @@ -376,8 +352,6 @@ func (s *Stats) String() string { res += fmt.Sprintf("- Storage Deletes: %.2f\n", s.StorageDeleted) res += fmt.Sprintf("- Storage Updates: %.2f\n", s.StorageUpdated) res += fmt.Sprintf("- Storage Created: %.2f\n", s.StorageCreated) - res += fmt.Sprintf("- Code Size Loaded: %.2f\n", s.CodeSizeLoaded) - res += fmt.Sprintf("- Number of Contracts Loaded: %.2f\n", s.NumContractsLoaded) res += fmt.Sprintf("- Opcode Stats: %s\n", s.Opcodes.String()) res += fmt.Sprintf("- Precompile Stats: %s\n", s.Precompiles.String()) return res From a7430dc3193d0c946cdbc185554a3dac8b4459b8 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Tue, 28 Oct 2025 13:03:08 -0400 Subject: [PATCH 18/20] Move datadir management to separate module --- runner/datadir/manager.go | 176 ++++++++++++++++++-------------------- runner/service.go | 13 ++- 2 files changed, 90 insertions(+), 99 deletions(-) diff --git a/runner/datadir/manager.go b/runner/datadir/manager.go index 7a99075..03cb3d1 100644 --- a/runner/datadir/manager.go +++ b/runner/datadir/manager.go @@ -19,29 +19,30 @@ import ( // Manager handles the creation and management of test data directories type Manager struct { // tracks persistent test directories for reuse_existing snapshots - // key: nodeType-role (e.g., "reth-sequencer"), value: InternalClientOptions - persistentTestDirs map[string]*config.InternalClientOptions + // key: nodeType, value: map["sequencer"|"validator"] -> TestDirConfig + persistentTestDirs map[string]map[string]*TestDirConfig snapshotManager benchmark.SnapshotManager workingDir string log log.Logger } +// TestDirConfig contains the configuration for a test directory +type TestDirConfig struct { + SequencerOptions *config.InternalClientOptions + ValidatorOptions *config.InternalClientOptions +} + // NewManager creates a new DataDirManager func NewManager(workingDir string, snapshotManager benchmark.SnapshotManager, log log.Logger) *Manager { return &Manager{ - persistentTestDirs: make(map[string]*config.InternalClientOptions), + persistentTestDirs: make(map[string]map[string]*TestDirConfig), snapshotManager: snapshotManager, workingDir: workingDir, log: log, } } -// getPersistentDirKey returns the key for persistent directory storage -func (m *Manager) getPersistentDirKey(nodeType, role string) string { - return fmt.Sprintf("%s-%s", nodeType, role) -} - // fileExists checks if a file exists func (m *Manager) fileExists(path string) bool { _, err := os.Stat(path) @@ -51,56 +52,50 @@ func (m *Manager) fileExists(path string) bool { // SetupTestDirs sets up test directories for a benchmark run // For reuse_existing snapshots, it creates persistent directories that will be reused across tests // For other snapshot methods, directories will be created per-test in runTest -func (m *Manager) SetupTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) error { +func (m *Manager) SetupTestDirs(params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*TestDirConfig, error) { isReuseExisting := snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting if !isReuseExisting { - return nil + return nil, nil } + // For reuse_existing, create persistent directories nodeType := params.NodeType - // Setup sequencer directory - sequencerKey := m.getPersistentDirKey(nodeType, "sequencer") - if _, exists := m.persistentTestDirs[sequencerKey]; !exists { - testName := fmt.Sprintf("persistent-%s-sequencer", nodeType) - sequencerTestDir := path.Join(m.workingDir, testName) - - m.log.Info("Creating persistent sequencer test directory for reuse_existing", - "nodeType", nodeType, - "role", "sequencer", - "dir", sequencerTestDir) - - sequencerOptions, err := m.setupRoleDirectory(sequencerTestDir, params, genesis, snapshot, "sequencer", clientOptions) - if err != nil { - return errors.Wrap(err, "failed to setup sequencer directory") - } + if _, exists := m.persistentTestDirs[nodeType]; !exists { + m.persistentTestDirs[nodeType] = make(map[string]*TestDirConfig) + } - m.persistentTestDirs[sequencerKey] = sequencerOptions - m.log.Info("Sequencer persistent directory setup complete", "nodeType", nodeType) + // Check if we already have persistent directories for this node type + if existingConfig, exists := m.persistentTestDirs[nodeType]["config"]; exists { + m.log.Info("Reusing existing persistent test directories", "nodeType", nodeType) + return existingConfig, nil } - // Setup validator directory - validatorKey := m.getPersistentDirKey(nodeType, "validator") - if _, exists := m.persistentTestDirs[validatorKey]; !exists { - testName := fmt.Sprintf("persistent-%s-validator", nodeType) - validatorTestDir := path.Join(m.workingDir, testName) + // Create new persistent directories + testName := fmt.Sprintf("persistent-%s", nodeType) + sequencerTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-sequencer", testName)) + validatorTestDir := path.Join(m.workingDir, fmt.Sprintf("%s-validator", testName)) - m.log.Info("Creating persistent validator test directory for reuse_existing", - "nodeType", nodeType, - "role", "validator", - "dir", validatorTestDir) + m.log.Info("Creating persistent test directories for reuse_existing", + "nodeType", nodeType, + "sequencer", sequencerTestDir, + "validator", validatorTestDir) - validatorOptions, err := m.setupRoleDirectory(validatorTestDir, params, genesis, snapshot, "validator", clientOptions) - if err != nil { - return errors.Wrap(err, "failed to setup validator directory") - } + // Setup data directories + sequencerOptions, validatorOptions, err := m.setupDataDirs(sequencerTestDir, validatorTestDir, params, genesis, snapshot, clientOptions) + if err != nil { + return nil, errors.Wrap(err, "failed to setup data dirs") + } - m.persistentTestDirs[validatorKey] = validatorOptions - m.log.Info("Validator persistent directory setup complete", "nodeType", nodeType) + testDirConfig := &TestDirConfig{ + SequencerOptions: sequencerOptions, + ValidatorOptions: validatorOptions, } - return nil + m.persistentTestDirs[nodeType]["config"] = testDirConfig + + return testDirConfig, nil } // GetOrCreateTestDirs gets existing persistent directories or creates temporary ones @@ -109,17 +104,11 @@ func (m *Manager) GetOrCreateTestDirs(params types.RunParams, genesis *core.Gene if isReuseExisting { // Return pre-configured persistent directories - sequencerKey := m.getPersistentDirKey(params.NodeType, "sequencer") - validatorKey := m.getPersistentDirKey(params.NodeType, "validator") - - sequencerOptions, seqExists := m.persistentTestDirs[sequencerKey] - validatorOptions, valExists := m.persistentTestDirs[validatorKey] - - if seqExists && valExists { + if config, exists := m.persistentTestDirs[params.NodeType]["config"]; exists { m.log.Info("Using persistent test directories", "nodeType", params.NodeType) - return sequencerOptions, validatorOptions, false, nil // false = don't cleanup + return config.SequencerOptions, config.ValidatorOptions, false, nil // false = don't cleanup } - return nil, nil, false, fmt.Errorf("persistent directories not setup for node type %s (sequencer: %v, validator: %v)", params.NodeType, seqExists, valExists) + return nil, nil, false, fmt.Errorf("persistent directories not setup for node type %s", params.NodeType) } // For non-reuse_existing, create temporary directories @@ -135,61 +124,58 @@ func (m *Manager) GetOrCreateTestDirs(params types.RunParams, genesis *core.Gene return sequencerOptions, validatorOptions, true, nil // true = cleanup after test } -// setupRoleDirectory sets up a directory for a specific role (sequencer or validator) -// This assumes the initial snapshot has already been downloaded via EnsureInitialSnapshot -func (m *Manager) setupRoleDirectory(testDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, role string, clientOptions config.ClientOptions) (*config.InternalClientOptions, error) { - dataDirPath := path.Join(testDir, "data") +// setupDataDirs sets up the data directories for sequencer and validator +func (m *Manager) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*config.InternalClientOptions, *config.InternalClientOptions, error) { + var sequencerDataDirOverride, validatorDataDirOverride string + + if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { + sequencerDataDirOverride = path.Join(sequencerTestDir, "data") + validatorDataDirOverride = path.Join(validatorTestDir, "data") - // Check if this is the first run (directory doesn't exist yet) - isFirstRun := !m.fileExists(dataDirPath) + // Check if this is the first run (directories don't exist yet) + isFirstRun := !m.fileExists(sequencerDataDirOverride) && !m.fileExists(validatorDataDirOverride) - if isFirstRun && snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { - // Get the initial snapshot path that was already downloaded - initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) - if initialSnapshotPath == "" || !m.fileExists(initialSnapshotPath) { - return nil, fmt.Errorf("initial snapshot not found for node type %s - should have been downloaded in setupInitialSnapshots", params.NodeType) - } + if isFirstRun { + initialSnapshotPath := m.snapshotManager.GetInitialSnapshotPath(params.NodeType) + if initialSnapshotPath != "" && m.fileExists(initialSnapshotPath) { + m.log.Info("First run with reuse_existing: copying to validator, moving to sequencer", + "initialSnapshot", initialSnapshotPath, + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) - m.log.Info("First run with reuse_existing: copying initial snapshot to role directory", - "nodeType", params.NodeType, - "role", role, - "initialSnapshot", initialSnapshotPath, - "dataDirPath", dataDirPath) + // First: copy from initial snapshot to validator directory + err := m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, validatorDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to copy initial snapshot to validator directory") + } + m.log.Info("Copied initial snapshot to validator directory", "path", validatorDataDirOverride) - err := os.MkdirAll(testDir, 0755) - if err != nil { - return nil, errors.Wrap(err, "failed to create test directory") - } + err = os.MkdirAll(sequencerTestDir, 0755) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to create sequencer test directory") + } - // Copy the initial snapshot to the role's data directory - err = m.snapshotManager.CopyFromInitialSnapshot(initialSnapshotPath, dataDirPath) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to copy initial snapshot to %s directory", role)) + err = os.Rename(initialSnapshotPath, sequencerDataDirOverride) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to move initial snapshot to sequencer directory") + } + m.log.Info("Moved initial snapshot to sequencer directory", "from", initialSnapshotPath, "to", sequencerDataDirOverride) + } + } else { + m.log.Info("Reusing existing data directories from previous run", + "sequencerDataDir", sequencerDataDirOverride, + "validatorDataDir", validatorDataDirOverride) } - m.log.Info("Copied initial snapshot to role directory", "role", role, "to", dataDirPath) - } else if !isFirstRun { - m.log.Info("Reusing existing data directory from previous run", "role", role, "dataDirPath", dataDirPath) - } - - // Setup internal directories with the data dir override for reuse_existing - var dataDirOverride string - if snapshot != nil && snapshot.GetSnapshotMethod() == benchmark.SnapshotMethodReuseExisting { - dataDirOverride = dataDirPath } - return m.setupInternalDirectories(testDir, params, genesis, snapshot, role, dataDirOverride, clientOptions) -} - -// setupDataDirs sets up the data directories for sequencer and validator (for non-reuse_existing methods) -func (m *Manager) setupDataDirs(sequencerTestDir string, validatorTestDir string, params types.RunParams, genesis *core.Genesis, snapshot *benchmark.SnapshotDefinition, clientOptions config.ClientOptions) (*config.InternalClientOptions, *config.InternalClientOptions, error) { - sequencerOptions, err := m.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", "", clientOptions) + sequencerOptions, err := m.setupInternalDirectories(sequencerTestDir, params, genesis, snapshot, "sequencer", sequencerDataDirOverride, clientOptions) if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup sequencer internal directories") + return nil, nil, errors.Wrap(err, "failed to setup internal directories") } - validatorOptions, err := m.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", "", clientOptions) + validatorOptions, err := m.setupInternalDirectories(validatorTestDir, params, genesis, snapshot, "validator", validatorDataDirOverride, clientOptions) if err != nil { - return nil, nil, errors.Wrap(err, "failed to setup validator internal directories") + return nil, nil, errors.Wrap(err, "failed to setup internal directories") } return sequencerOptions, validatorOptions, nil diff --git a/runner/service.go b/runner/service.go index 7687259..13bbdd1 100644 --- a/runner/service.go +++ b/runner/service.go @@ -23,6 +23,7 @@ import ( "github.com/base/base-bench/runner/benchmark/portmanager" "github.com/base/base-bench/runner/config" "github.com/base/base-bench/runner/datadir" + "github.com/base/base-bench/runner/datadir" "github.com/base/base-bench/runner/metrics" "github.com/base/base-bench/runner/network" "github.com/base/base-bench/runner/network/types" @@ -45,6 +46,10 @@ type service struct { dataDirManager *datadir.Manager portState portmanager.PortManager metadataPath string + dataDirState benchmark.SnapshotManager + dataDirManager *datadir.Manager + portState portmanager.PortManager + metadataPath string config config.Config version string @@ -54,6 +59,7 @@ type service struct { func NewService(version string, cfg config.Config, log log.Logger) Service { metadataPath := path.Join(cfg.OutputDir(), "metadata.json") snapshotManager := benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")) + snapshotManager := benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")) s := &service{ metadataPath: metadataPath, @@ -281,14 +287,13 @@ func (s *service) setupPersistentTestDirs(testPlans []benchmark.TestPlan) error } // Setup persistent directories for each unique node type with reuse_existing - // This will create separate snapshots for sequencer and validator roles for nodeType, runInfo := range testRunsWithReuseExisting { - s.log.Info("Setting up persistent test directories for both roles", "nodeType", nodeType) - err := s.dataDirManager.SetupTestDirs(runInfo.params, runInfo.genesis, runInfo.snapshot, s.config.ClientOptions()) + s.log.Info("Setting up persistent test directories", "nodeType", nodeType) + _, err := s.dataDirManager.SetupTestDirs(runInfo.params, runInfo.genesis, runInfo.snapshot, s.config.ClientOptions()) if err != nil { return errors.Wrap(err, fmt.Sprintf("failed to setup persistent test directories for node type %s", nodeType)) } - s.log.Info("Persistent test directories setup completed for both sequencer and validator", "nodeType", nodeType) + s.log.Info("Persistent test directories setup completed", "nodeType", nodeType) } return nil From 5eb6846fc69e0b8c8febcc8fd39107cf060ea6fe Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Fri, 5 Dec 2025 11:53:11 -0500 Subject: [PATCH 19/20] fix: update merge issue --- runner/service.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/runner/service.go b/runner/service.go index 13bbdd1..c2922e0 100644 --- a/runner/service.go +++ b/runner/service.go @@ -23,7 +23,6 @@ import ( "github.com/base/base-bench/runner/benchmark/portmanager" "github.com/base/base-bench/runner/config" "github.com/base/base-bench/runner/datadir" - "github.com/base/base-bench/runner/datadir" "github.com/base/base-bench/runner/metrics" "github.com/base/base-bench/runner/network" "github.com/base/base-bench/runner/network/types" @@ -46,10 +45,6 @@ type service struct { dataDirManager *datadir.Manager portState portmanager.PortManager metadataPath string - dataDirState benchmark.SnapshotManager - dataDirManager *datadir.Manager - portState portmanager.PortManager - metadataPath string config config.Config version string @@ -59,7 +54,6 @@ type service struct { func NewService(version string, cfg config.Config, log log.Logger) Service { metadataPath := path.Join(cfg.OutputDir(), "metadata.json") snapshotManager := benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")) - snapshotManager := benchmark.NewSnapshotManager(path.Join(cfg.DataDir(), "snapshots")) s := &service{ metadataPath: metadataPath, From 0776495966fc41c9f75144ad2c6170ef6f6f9403 Mon Sep 17 00:00:00 2001 From: Tobi Akerele Date: Thu, 11 Dec 2025 11:38:35 -0500 Subject: [PATCH 20/20] Fix base fee --- runner/network/consensus/sequencer_consensus.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runner/network/consensus/sequencer_consensus.go b/runner/network/consensus/sequencer_consensus.go index 4a17c44..503746f 100644 --- a/runner/network/consensus/sequencer_consensus.go +++ b/runner/network/consensus/sequencer_consensus.go @@ -184,6 +184,9 @@ func (f *SequencerConsensusClient) generatePayloadAttributes(sequencerTxs [][]by root := crypto.Keccak256Hash([]byte("fake-beacon-block-root"), big.NewInt(int64(1)).Bytes()) + // MinBaseFee is required post-Jovian hardfork + minBaseFee := uint64(1) + payloadAttrs := ð.PayloadAttributes{ Timestamp: eth.Uint64Quantity(timestamp), PrevRandao: eth.Bytes32{}, @@ -194,6 +197,7 @@ func (f *SequencerConsensusClient) generatePayloadAttributes(sequencerTxs [][]by ParentBeaconBlockRoot: &root, NoTxPool: false, EIP1559Params: &b8, + MinBaseFee: &minBaseFee, } return payloadAttrs, &root, nil