From 7993f6c74bf8af54db40cc9934ef5370c7015476 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:00:28 +0100 Subject: [PATCH 001/147] build(deps-dev): Bump the npm-dependencies group (#116) Bumps the npm-dependencies group in /WebUI with 12 updates: | Package | From | To | | --- | --- | --- | | [@skeletonlabs/skeleton](https://github.com/skeletonlabs/skeleton) | `2.4.0` | `2.5.0` | | [@skeletonlabs/tw-plugin](https://github.com/skeletonlabs/skeleton) | `0.2.3` | `0.2.4` | | [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) | `1.27.3` | `1.27.5` | | [@tailwindcss/forms](https://github.com/tailwindlabs/tailwindcss-forms) | `0.5.6` | `0.5.7` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.8.10` | `20.9.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.9.1` | `6.10.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.9.1` | `6.10.0` | | [eslint-plugin-svelte](https://github.com/sveltejs/eslint-plugin-svelte) | `2.34.1` | `2.35.0` | | [prettier](https://github.com/prettier/prettier) | `3.0.3` | `3.1.0` | | [prettier-plugin-svelte](https://github.com/sveltejs/prettier-plugin-svelte) | `3.0.3` | `3.1.0` | | [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) | `4.2.2` | `4.2.3` | | [svelte-check](https://github.com/sveltejs/language-tools) | `3.5.2` | `3.6.0` | Updates `@skeletonlabs/skeleton` from 2.4.0 to 2.5.0 - [Release notes](https://github.com/skeletonlabs/skeleton/releases) - [Commits](https://github.com/skeletonlabs/skeleton/compare/@skeletonlabs/skeleton@2.4.0...@skeletonlabs/skeleton@2.5.0) Updates `@skeletonlabs/tw-plugin` from 0.2.3 to 0.2.4 - [Release notes](https://github.com/skeletonlabs/skeleton/releases) - [Commits](https://github.com/skeletonlabs/skeleton/compare/@skeletonlabs/tw-plugin@0.2.3...@skeletonlabs/tw-plugin@0.2.4) Updates `@sveltejs/kit` from 1.27.3 to 1.27.5 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/master/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@1.27.5/packages/kit) Updates `@tailwindcss/forms` from 0.5.6 to 0.5.7 - [Release notes](https://github.com/tailwindlabs/tailwindcss-forms/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss-forms/blob/master/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss-forms/compare/v0.5.6...v0.5.7) Updates `@types/node` from 20.8.10 to 20.9.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.9.1 to 6.10.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.10.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.9.1 to 6.10.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.10.0/packages/parser) Updates `eslint-plugin-svelte` from 2.34.1 to 2.35.0 - [Release notes](https://github.com/sveltejs/eslint-plugin-svelte/releases) - [Changelog](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/eslint-plugin-svelte/compare/v2.34.1...v2.35.0) Updates `prettier` from 3.0.3 to 3.1.0 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.3...3.1.0) Updates `prettier-plugin-svelte` from 3.0.3 to 3.1.0 - [Changelog](https://github.com/sveltejs/prettier-plugin-svelte/blob/master/CHANGELOG.md) - [Commits](https://github.com/sveltejs/prettier-plugin-svelte/commits) Updates `svelte` from 4.2.2 to 4.2.3 - [Release notes](https://github.com/sveltejs/svelte/releases) - [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG-pre-5.md) - [Commits](https://github.com/sveltejs/svelte/commits/svelte@4.2.3/packages/svelte) Updates `svelte-check` from 3.5.2 to 3.6.0 - [Release notes](https://github.com/sveltejs/language-tools/releases) - [Commits](https://github.com/sveltejs/language-tools/compare/svelte-check-3.5.2...svelte-check-3.6.0) --- updated-dependencies: - dependency-name: "@skeletonlabs/skeleton" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@skeletonlabs/tw-plugin" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@tailwindcss/forms" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: eslint-plugin-svelte dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: prettier-plugin-svelte dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: svelte-check dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- WebUI/package-lock.json | 233 +++++++++++++++++++++------------------- WebUI/package.json | 24 ++--- 2 files changed, 135 insertions(+), 122 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 0610f442..cafea764 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -12,26 +12,26 @@ }, "devDependencies": { "@playwright/test": "^1.39.0", - "@skeletonlabs/skeleton": "2.4.0", - "@skeletonlabs/tw-plugin": "0.2.3", + "@skeletonlabs/skeleton": "2.5.0", + "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.3", - "@tailwindcss/forms": "0.5.6", + "@sveltejs/kit": "^1.27.5", + "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.8.10", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@types/node": "20.9.0", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "autoprefixer": "10.4.16", "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.34.1", + "eslint-plugin-svelte": "^2.35.0", "flatbuffers": "^23.5.26", "npm-check-updates": "^16.14.6", "postcss": "8.4.31", - "prettier": "^3.0.3", - "prettier-plugin-svelte": "^3.0.3", - "svelte": "^4.2.2", - "svelte-check": "^3.5.2", + "prettier": "^3.1.0", + "prettier-plugin-svelte": "^3.1.0", + "svelte": "^4.2.3", + "svelte-check": "^3.6.0", "tailwindcss": "3.3.5", "tslib": "^2.6.2", "typescript": "^5.2.2", @@ -995,9 +995,9 @@ } }, "node_modules/@skeletonlabs/skeleton": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.4.0.tgz", - "integrity": "sha512-8IVspCMarg1h4yMV6GFSaVqh9jIeQXV3XPNUnVONjkUofHkcKuLYTR4jGlR1ICF5CmIl+z746q3+Cj8rLAtAag==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.0.tgz", + "integrity": "sha512-g9b59IkvByM9D/2RfwBXRP1dqTlaz85opqDHEWEDlJ/wPJ2SaUueBXDwuQfO5oLX8BBXQKIGnb/eUr03hnjgjg==", "dev": true, "dependencies": { "esm-env": "1.0.0" @@ -1007,9 +1007,9 @@ } }, "node_modules/@skeletonlabs/tw-plugin": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.3.tgz", - "integrity": "sha512-sOavIPm6NlE0h4dmTZ4NDMe8ryqb1wh2hd59V9oP1qf2H1O6cwfKkiBUyLQLedw+suCey/FJ3MHpScTBMejNxQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", + "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", "dev": true, "peerDependencies": { "tailwindcss": ">=3.0.0" @@ -1025,13 +1025,13 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.27.3", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.3.tgz", - "integrity": "sha512-pd7qwX6ww5noA0/FLk45B0aKUeOXWR+pfZsGTrv3dRmj3lTmnki9UTmTdWzHJGrje+BBkGUZHfgGrsSOQQBQpQ==", + "version": "1.27.5", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.5.tgz", + "integrity": "sha512-+L1WPs/ZYNjXoBFoFARypD4aZOjkT51vFpRCtQI45+Fmmfi4Y0dH/8VFlmYD6VlGe89ViIPg7lgf/JpGQ2tr7A==", "dev": true, "hasInstallScript": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.4.1", + "@sveltejs/vite-plugin-svelte": "^2.5.0", "@types/cookie": "^0.5.1", "cookie": "^0.5.0", "devalue": "^4.3.1", @@ -1052,14 +1052,14 @@ "node": "^16.14 || >=18" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0", + "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", "vite": "^4.0.0" } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz", - "integrity": "sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", + "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", "dev": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", @@ -1074,7 +1074,7 @@ "node": "^14.18.0 || >= 16" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0", + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", "vite": "^4.0.0" } }, @@ -1108,9 +1108,9 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.6.tgz", - "integrity": "sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", "dev": true, "dependencies": { "mini-svg-data-uri": "^1.2.3" @@ -1223,43 +1223,43 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/pug": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.7.tgz", - "integrity": "sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", + "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1285,15 +1285,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -1313,13 +1313,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1330,13 +1330,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1357,9 +1357,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1370,13 +1370,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1397,17 +1397,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" }, "engines": { @@ -1422,12 +1422,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2815,6 +2815,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-prettier": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", @@ -2828,14 +2840,15 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "2.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.34.1.tgz", - "integrity": "sha512-HnLzYevh9bLL0Rj2d4dmZY9EutN0BL5JsJRHqtJFIyaEmdxxd3ZuY5zNoSjIFhctFMSntsClbd6TwYjgaOY0Xw==", + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz", + "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "debug": "^4.3.1", + "eslint-compat-utils": "^0.1.2", "esutils": "^2.0.3", "known-css-properties": "^0.29.0", "postcss": "^8.4.5", @@ -5446,9 +5459,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5461,13 +5474,13 @@ } }, "node_modules/prettier-plugin-svelte": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.0.3.tgz", - "integrity": "sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.0.tgz", + "integrity": "sha512-96+AZxs2ESqIFA9j+o+DHqY+BsUglezfl553LQd6VOtTyJq5GPuBEb3ElxF2cerFzKlYKttlH/VcVmRNj5oc3A==", "dev": true, "peerDependencies": { "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0" + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "node_modules/pretty-format": { @@ -6510,9 +6523,9 @@ } }, "node_modules/svelte": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.2.tgz", - "integrity": "sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.3.tgz", + "integrity": "sha512-sqmG9KC6uUc7fb3ZuWoxXvqk6MI9Uu4ABA1M0fYDgTlFYu1k02xp96u6U9+yJZiVm84m9zge7rrA/BNZdFpOKw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -6534,9 +6547,9 @@ } }, "node_modules/svelte-check": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.2.tgz", - "integrity": "sha512-5a/YWbiH4c+AqAUP+0VneiV5bP8YOk9JL3jwvN+k2PEPLgpu85bjQc5eE67+eIZBBwUEJzmO3I92OqKcqbp3fw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.0.tgz", + "integrity": "sha512-8VfqhfuRJ1sKW+o8isH2kPi0RhjXH1nNsIbCFGyoUHG+ZxVxHYRKcb+S8eaL/1tyj3VGvWYx3Y5+oCUsJgnzcw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -6545,14 +6558,14 @@ "import-fresh": "^3.2.1", "picocolors": "^1.0.0", "sade": "^1.7.4", - "svelte-preprocess": "^5.0.4", + "svelte-preprocess": "^5.1.0", "typescript": "^5.0.3" }, "bin": { "svelte-check": "bin/svelte-check" }, "peerDependencies": { - "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" } }, "node_modules/svelte-eslint-parser": { @@ -6620,9 +6633,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", - "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", + "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6645,7 +6658,7 @@ "sass": "^1.26.8", "stylus": "^0.55.0", "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -7280,12 +7293,12 @@ } }, "node_modules/vitefu": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", - "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "vite": { diff --git a/WebUI/package.json b/WebUI/package.json index d84ccd0d..efebc9e9 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -16,26 +16,26 @@ }, "devDependencies": { "@playwright/test": "^1.39.0", - "@skeletonlabs/skeleton": "2.4.0", - "@skeletonlabs/tw-plugin": "0.2.3", + "@skeletonlabs/skeleton": "2.5.0", + "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.3", - "@tailwindcss/forms": "0.5.6", + "@sveltejs/kit": "^1.27.5", + "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.8.10", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@types/node": "20.9.0", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "autoprefixer": "10.4.16", "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.34.1", + "eslint-plugin-svelte": "^2.35.0", "flatbuffers": "^23.5.26", "npm-check-updates": "^16.14.6", "postcss": "8.4.31", - "prettier": "^3.0.3", - "prettier-plugin-svelte": "^3.0.3", - "svelte": "^4.2.2", - "svelte-check": "^3.5.2", + "prettier": "^3.1.0", + "prettier-plugin-svelte": "^3.1.0", + "svelte": "^4.2.3", + "svelte-check": "^3.6.0", "tailwindcss": "3.3.5", "tslib": "^2.6.2", "typescript": "^5.2.2", From fb8c416272839067f53c724beea95d4ba3b84982 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 00:58:39 +0100 Subject: [PATCH 002/147] build(deps-dev): Bump the npm-dependencies group in /WebUI with 9 updates (#117) * build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 9 updates: | Package | From | To | | --- | --- | --- | | [@playwright/test](https://github.com/microsoft/playwright) | `1.39.0` | `1.40.0` | | [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) | `1.27.5` | `1.27.6` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.9.0` | `20.9.2` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.10.0` | `6.11.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.10.0` | `6.11.0` | | [eslint](https://github.com/eslint/eslint) | `8.53.0` | `8.54.0` | | [npm-check-updates](https://github.com/raineorshine/npm-check-updates) | `16.14.6` | `16.14.11` | | [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) | `4.2.3` | `4.2.5` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `4.5.0` | `5.0.0` | Updates `@playwright/test` from 1.39.0 to 1.40.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.39.0...v1.40.0) Updates `@sveltejs/kit` from 1.27.5 to 1.27.6 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/master/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@1.27.6/packages/kit) Updates `@types/node` from 20.9.0 to 20.9.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.10.0 to 6.11.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.11.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.10.0 to 6.11.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.11.0/packages/parser) Updates `eslint` from 8.53.0 to 8.54.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.53.0...v8.54.0) Updates `npm-check-updates` from 16.14.6 to 16.14.11 - [Release notes](https://github.com/raineorshine/npm-check-updates/releases) - [Changelog](https://github.com/raineorshine/npm-check-updates/blob/main/CHANGELOG.md) - [Commits](https://github.com/raineorshine/npm-check-updates/compare/v16.14.6...v16.14.11) Updates `svelte` from 4.2.3 to 4.2.5 - [Release notes](https://github.com/sveltejs/svelte/releases) - [Changelog](https://github.com/sveltejs/svelte/blob/svelte@4.2.5/packages/svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/svelte/commits/svelte@4.2.5/packages/svelte) Updates `vite` from 4.5.0 to 5.0.0 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/create-vite@5.0.0/packages/vite) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: npm-check-updates dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] * Downgrade vite to 4.0.0 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: hhvrc --- WebUI/package-lock.json | 15306 +++++++++++++++++++------------------- WebUI/package.json | 18 +- 2 files changed, 7669 insertions(+), 7655 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index cafea764..3284ade6 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -1,7646 +1,7660 @@ -{ - "name": "webui", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "webui", - "version": "0.0.1", - "dependencies": { - "@floating-ui/dom": "1.5.3" - }, - "devDependencies": { - "@playwright/test": "^1.39.0", - "@skeletonlabs/skeleton": "2.5.0", - "@skeletonlabs/tw-plugin": "0.2.4", - "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.5", - "@tailwindcss/forms": "0.5.7", - "@tailwindcss/typography": "0.5.10", - "@types/node": "20.9.0", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", - "autoprefixer": "10.4.16", - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.35.0", - "flatbuffers": "^23.5.26", - "npm-check-updates": "^16.14.6", - "postcss": "8.4.31", - "prettier": "^3.1.0", - "prettier-plugin-svelte": "^3.1.0", - "svelte": "^4.2.3", - "svelte-check": "^3.6.0", - "tailwindcss": "3.3.5", - "tslib": "^2.6.2", - "typescript": "^5.2.2", - "vite": "^4.5.0", - "vite-plugin-tailwind-purgecss": "0.1.3", - "vitest": "^0.34.6" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", - "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", - "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", - "dev": true, - "dependencies": { - "playwright": "1.39.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", - "dev": true - }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@skeletonlabs/skeleton": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.0.tgz", - "integrity": "sha512-g9b59IkvByM9D/2RfwBXRP1dqTlaz85opqDHEWEDlJ/wPJ2SaUueBXDwuQfO5oLX8BBXQKIGnb/eUr03hnjgjg==", - "dev": true, - "dependencies": { - "esm-env": "1.0.0" - }, - "peerDependencies": { - "svelte": "^3.56.0 || ^4.0.0" - } - }, - "node_modules/@skeletonlabs/tw-plugin": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", - "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", - "dev": true, - "peerDependencies": { - "tailwindcss": ">=3.0.0" - } - }, - "node_modules/@sveltejs/adapter-static": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", - "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", - "dev": true, - "peerDependencies": { - "@sveltejs/kit": "^1.5.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "1.27.5", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.5.tgz", - "integrity": "sha512-+L1WPs/ZYNjXoBFoFARypD4aZOjkT51vFpRCtQI45+Fmmfi4Y0dH/8VFlmYD6VlGe89ViIPg7lgf/JpGQ2tr7A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.5.0", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^4.3.1", - "esm-env": "^1.0.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.0", - "mrmime": "^1.0.1", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "~5.26.2" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": "^16.14 || >=18" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", - "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", - "dev": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.3", - "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", - "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.2.0", - "svelte": "^3.54.0 || ^4.0.0", - "vite": "^4.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", - "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", - "dev": true, - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", - "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/pug": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", - "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001539", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", - "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", - "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.529", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", - "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz", - "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "debug": "^4.3.1", - "eslint-compat-utils": "^0.1.2", - "esutils": "^2.0.3", - "known-css-properties": "^0.29.0", - "postcss": "^8.4.5", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "semver": "^7.5.3", - "svelte-eslint-parser": ">=0.33.0 <1.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0", - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esm-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "23.5.26", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", - "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==", - "dev": true - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "dependencies": { - "jju": "^1.1.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.3.0" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates": { - "version": "16.14.6", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.6.tgz", - "integrity": "sha512-sJ6w4AmSDP7YzBXah94Ul2JhiIbjBDfx9XYgib15um2wtiQkOyjE7Lov3MNUSQ84Ry7T81mE4ynMbl/mGbK4HQ==", - "dev": true, - "dependencies": { - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/playwright": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", - "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", - "dev": true, - "dependencies": { - "playwright-core": "1.39.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", - "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz", - "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.0.tgz", - "integrity": "sha512-96+AZxs2ESqIFA9j+o+DHqY+BsUglezfl553LQd6VOtTyJq5GPuBEb3ElxF2cerFzKlYKttlH/VcVmRNj5oc3A==", - "dev": true, - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/purgecss": { - "version": "6.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", - "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", - "dev": true, - "dependencies": { - "commander": "^10.0.0", - "glob": "^8.0.3", - "postcss": "^8.4.4", - "postcss-selector-parser": "^6.0.7" - }, - "bin": { - "purgecss": "bin/purgecss.js" - } - }, - "node_modules/purgecss/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/purgecss/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/purgecss/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/purgecss/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "node_modules/sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "dependencies": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/sander/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sorcery": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", - "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0" - }, - "bin": { - "sorcery": "bin/sorcery" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", - "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.3.tgz", - "integrity": "sha512-sqmG9KC6uUc7fb3ZuWoxXvqk6MI9Uu4ABA1M0fYDgTlFYu1k02xp96u6U9+yJZiVm84m9zge7rrA/BNZdFpOKw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^3.2.1", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.0.tgz", - "integrity": "sha512-8VfqhfuRJ1sKW+o8isH2kPi0RhjXH1nNsIbCFGyoUHG+ZxVxHYRKcb+S8eaL/1tyj3VGvWYx3Y5+oCUsJgnzcw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^5.1.0", - "typescript": "^5.0.3" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "peerDependencies": { - "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz", - "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "postcss": "^8.4.28", - "postcss-scss": "^4.0.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", - "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/pug": "^2.0.6", - "detect-indent": "^6.1.0", - "magic-string": "^0.27.0", - "sorcery": "^0.11.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">= 14.10.0" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": "^0.55.0", - "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", - "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte-preprocess/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", - "dev": true - }, - "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-tailwind-purgecss": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.3.tgz", - "integrity": "sha512-VVz9fwKBEEFSbj/rKxtwtczvoSrIqbzbo6S+MT7gH0CsmKNwlx947VMoV8B085ocxGCuFlddOPRDszNXLi2nTQ==", - "dev": true, - "dependencies": { - "estree-walker": "^3.0.3", - "purgecss": "6.0.0-alpha.0" - }, - "peerDependencies": { - "vite": "^4.1.1" - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} +{ + "name": "webui", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "webui", + "version": "0.0.1", + "dependencies": { + "@floating-ui/dom": "1.5.3" + }, + "devDependencies": { + "@playwright/test": "^1.40.0", + "@skeletonlabs/skeleton": "2.5.0", + "@skeletonlabs/tw-plugin": "0.2.4", + "@sveltejs/adapter-static": "^2.0.3", + "@sveltejs/kit": "^1.27.6", + "@tailwindcss/forms": "0.5.7", + "@tailwindcss/typography": "0.5.10", + "@types/node": "20.9.2", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "autoprefixer": "10.4.16", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.35.0", + "flatbuffers": "^23.5.26", + "npm-check-updates": "^16.14.11", + "postcss": "8.4.31", + "prettier": "^3.1.0", + "prettier-plugin-svelte": "^3.1.0", + "svelte": "^4.2.5", + "svelte-check": "^3.6.0", + "tailwindcss": "3.3.5", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "vite": "^4.0.0", + "vite-plugin-tailwind-purgecss": "0.1.3", + "vitest": "^0.34.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", + "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz", + "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==", + "dev": true, + "dependencies": { + "playwright": "1.40.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", + "dev": true + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@skeletonlabs/skeleton": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.0.tgz", + "integrity": "sha512-g9b59IkvByM9D/2RfwBXRP1dqTlaz85opqDHEWEDlJ/wPJ2SaUueBXDwuQfO5oLX8BBXQKIGnb/eUr03hnjgjg==", + "dev": true, + "dependencies": { + "esm-env": "1.0.0" + }, + "peerDependencies": { + "svelte": "^3.56.0 || ^4.0.0" + } + }, + "node_modules/@skeletonlabs/tw-plugin": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", + "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", + "dev": true, + "peerDependencies": { + "tailwindcss": ">=3.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", + "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^1.5.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "1.27.6", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", + "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.5.0", + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0", + "devalue": "^4.3.1", + "esm-env": "^1.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "mrmime": "^1.0.1", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "~5.26.2" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": "^16.14 || >=18" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", + "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.3", + "svelte-hmr": "^0.15.3", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", + "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", + "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", + "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", + "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", + "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pug": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", + "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", + "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/type-utils": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", + "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitest/expect": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.6", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", + "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001539", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.529", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", + "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz", + "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "debug": "^4.3.1", + "eslint-compat-utils": "^0.1.2", + "esutils": "^2.0.3", + "known-css-properties": "^0.29.0", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "semver": "^7.5.3", + "svelte-eslint-parser": ">=0.33.0 <1.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0", + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatbuffers": { + "version": "23.5.26", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", + "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==", + "dev": true + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/fp-and-or": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "dev": true, + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", + "dev": true + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-check-updates": { + "version": "16.14.11", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.11.tgz", + "integrity": "sha512-0MMWGbGci22Pu77bR9jRsy5qgxdQSJVqNtSyyFeubDPtbcU36z4gjEDITu26PMabFWPNkAoVfKF31M3uKUvzFg==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "fast-memoize": "^2.5.2", + "find-up": "5.0.0", + "fp-and-or": "^0.1.4", + "get-stdin": "^8.0.0", + "globby": "^11.0.4", + "hosted-git-info": "^5.1.0", + "ini": "^4.1.1", + "js-yaml": "^4.1.0", + "json-parse-helpfulerror": "^1.0.3", + "jsonlines": "^0.1.1", + "lodash": "^4.17.21", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "p-map": "^4.0.0", + "pacote": "15.2.0", + "parse-github-url": "^1.0.2", + "progress": "^2.0.3", + "prompts-ncu": "^3.0.0", + "rc-config-loader": "^4.1.3", + "remote-git-tags": "^3.0.0", + "rimraf": "^5.0.5", + "semver": "^7.5.4", + "semver-utils": "^1.1.4", + "source-map-support": "^0.5.21", + "spawn-please": "^2.0.2", + "strip-ansi": "^7.1.0", + "strip-json-comments": "^5.0.1", + "untildify": "^4.0.0", + "update-notifier": "^6.0.2" + }, + "bin": { + "ncu": "build/src/bin/cli.js", + "npm-check-updates": "build/src/bin/cli.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/npm-check-updates/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm-check-updates/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-install-checks": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", + "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/playwright": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz", + "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==", + "dev": true, + "dependencies": { + "playwright-core": "1.40.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz", + "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz", + "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.0.tgz", + "integrity": "sha512-96+AZxs2ESqIFA9j+o+DHqY+BsUglezfl553LQd6VOtTyJq5GPuBEb3ElxF2cerFzKlYKttlH/VcVmRNj5oc3A==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts-ncu": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", + "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", + "dev": true, + "dependencies": { + "kleur": "^4.0.1", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/purgecss": { + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", + "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", + "dev": true, + "dependencies": { + "commander": "^10.0.0", + "glob": "^8.0.3", + "postcss": "^8.4.4", + "postcss-selector-parser": "^6.0.7" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/purgecss/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/purgecss/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/purgecss/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remote-git-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", + "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sirv": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-please": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", + "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.5.tgz", + "integrity": "sha512-P9YPKsGkNdw4OJbtpd1uzimQHPj7Ai2sPcOHmmD6VgkFhFDmcYevQi7vE4cQ1g8/Vs64aL2TwMoCNFAzv7TPaQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.0.tgz", + "integrity": "sha512-8VfqhfuRJ1sKW+o8isH2kPi0RhjXH1nNsIbCFGyoUHG+ZxVxHYRKcb+S8eaL/1tyj3VGvWYx3Y5+oCUsJgnzcw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.1.0", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz", + "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "postcss": "^8.4.28", + "postcss-scss": "^4.0.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/svelte-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", + "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", + "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", + "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "dev": true + }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-tailwind-purgecss": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.3.tgz", + "integrity": "sha512-VVz9fwKBEEFSbj/rKxtwtczvoSrIqbzbo6S+MT7gH0CsmKNwlx947VMoV8B085ocxGCuFlddOPRDszNXLi2nTQ==", + "dev": true, + "dependencies": { + "estree-walker": "^3.0.3", + "purgecss": "6.0.0-alpha.0" + }, + "peerDependencies": { + "vite": "^4.1.1" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/WebUI/package.json b/WebUI/package.json index efebc9e9..eb7c6a92 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -15,31 +15,31 @@ "test:unit": "vitest" }, "devDependencies": { - "@playwright/test": "^1.39.0", + "@playwright/test": "^1.40.0", "@skeletonlabs/skeleton": "2.5.0", "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.5", + "@sveltejs/kit": "^1.27.6", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.9.0", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/node": "20.9.2", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", "autoprefixer": "10.4.16", - "eslint": "^8.53.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-svelte": "^2.35.0", "flatbuffers": "^23.5.26", - "npm-check-updates": "^16.14.6", + "npm-check-updates": "^16.14.11", "postcss": "8.4.31", "prettier": "^3.1.0", "prettier-plugin-svelte": "^3.1.0", - "svelte": "^4.2.3", + "svelte": "^4.2.5", "svelte-check": "^3.6.0", "tailwindcss": "3.3.5", "tslib": "^2.6.2", "typescript": "^5.2.2", - "vite": "^4.5.0", + "vite": "^4.0.0", "vite-plugin-tailwind-purgecss": "0.1.3", "vitest": "^0.34.6" }, From 3eec2329cc20e5b9e5a7c620d722a6cb14c816d7 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 21 Nov 2023 01:00:05 +0100 Subject: [PATCH 003/147] Push color palette (#118) --- WebUI/openshock-theme.ts | 101 +++++++++++++++++++++++++++++++++++++++ WebUI/src/app.html | 2 +- WebUI/tailwind.config.ts | 8 +--- 3 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 WebUI/openshock-theme.ts diff --git a/WebUI/openshock-theme.ts b/WebUI/openshock-theme.ts new file mode 100644 index 00000000..770004ac --- /dev/null +++ b/WebUI/openshock-theme.ts @@ -0,0 +1,101 @@ +import type { CustomThemeConfig } from '@skeletonlabs/tw-plugin'; + +export const openshockTheme: CustomThemeConfig = { + name: 'openshock', + properties: { + // =~= Theme Properties =~= + '--theme-font-family-base': `system-ui`, + '--theme-font-family-heading': `system-ui`, + '--theme-font-color-base': '0 0 0', + '--theme-font-color-dark': '255 255 255', + '--theme-rounded-base': '9999px', + '--theme-rounded-container': '12px', + '--theme-border-base': '1px', + // =~= Theme On-X Colors =~= + '--on-primary': '0 0 0', + '--on-secondary': '255 255 255', + '--on-tertiary': '0 0 0', + '--on-success': '0 0 0', + '--on-warning': '0 0 0', + '--on-error': '255 255 255', + '--on-surface': '255 255 255', + // =~= Theme Colors =~= + // primary | #ff5c82 + '--color-primary-50': '255 231 236', // #ffe7ec + '--color-primary-100': '255 222 230', // #ffdee6 + '--color-primary-200': '255 214 224', // #ffd6e0 + '--color-primary-300': '255 190 205', // #ffbecd + '--color-primary-400': '255 141 168', // #ff8da8 + '--color-primary-500': '255 92 130', // #ff5c82 + '--color-primary-600': '230 83 117', // #e65375 + '--color-primary-700': '191 69 98', // #bf4562 + '--color-primary-800': '153 55 78', // #99374e + '--color-primary-900': '125 45 64', // #7d2d40 + // secondary | #463eda + '--color-secondary-50': '227 226 249', // #e3e2f9 + '--color-secondary-100': '218 216 248', // #dad8f8 + '--color-secondary-200': '209 207 246', // #d1cff6 + '--color-secondary-300': '181 178 240', // #b5b2f0 + '--color-secondary-400': '126 120 229', // #7e78e5 + '--color-secondary-500': '70 62 218', // #463eda + '--color-secondary-600': '63 56 196', // #3f38c4 + '--color-secondary-700': '53 47 164', // #352fa4 + '--color-secondary-800': '42 37 131', // #2a2583 + '--color-secondary-900': '34 30 107', // #221e6b + // tertiary | #33b8ff + '--color-tertiary-50': '224 244 255', // #e0f4ff + '--color-tertiary-100': '214 241 255', // #d6f1ff + '--color-tertiary-200': '204 237 255', // #ccedff + '--color-tertiary-300': '173 227 255', // #ade3ff + '--color-tertiary-400': '112 205 255', // #70cdff + '--color-tertiary-500': '51 184 255', // #33b8ff + '--color-tertiary-600': '46 166 230', // #2ea6e6 + '--color-tertiary-700': '38 138 191', // #268abf + '--color-tertiary-800': '31 110 153', // #1f6e99 + '--color-tertiary-900': '25 90 125', // #195a7d + // success | #03c200 + '--color-success-50': '217 246 217', // #d9f6d9 + '--color-success-100': '205 243 204', // #cdf3cc + '--color-success-200': '192 240 191', // #c0f0bf + '--color-success-300': '154 231 153', // #9ae799 + '--color-success-400': '79 212 77', // #4fd44d + '--color-success-500': '3 194 0', // #03c200 + '--color-success-600': '3 175 0', // #03af00 + '--color-success-700': '2 146 0', // #029200 + '--color-success-800': '2 116 0', // #027400 + '--color-success-900': '1 95 0', // #015f00 + // warning | #ff7300 + '--color-warning-50': '255 234 217', // #ffead9 + '--color-warning-100': '255 227 204', // #ffe3cc + '--color-warning-200': '255 220 191', // #ffdcbf + '--color-warning-300': '255 199 153', // #ffc799 + '--color-warning-400': '255 157 77', // #ff9d4d + '--color-warning-500': '255 115 0', // #ff7300 + '--color-warning-600': '230 104 0', // #e66800 + '--color-warning-700': '191 86 0', // #bf5600 + '--color-warning-800': '153 69 0', // #994500 + '--color-warning-900': '125 56 0', // #7d3800 + // error | #a30000 + '--color-error-50': '241 217 217', // #f1d9d9 + '--color-error-100': '237 204 204', // #edcccc + '--color-error-200': '232 191 191', // #e8bfbf + '--color-error-300': '218 153 153', // #da9999 + '--color-error-400': '191 77 77', // #bf4d4d + '--color-error-500': '163 0 0', // #a30000 + '--color-error-600': '147 0 0', // #930000 + '--color-error-700': '122 0 0', // #7a0000 + '--color-error-800': '98 0 0', // #620000 + '--color-error-900': '80 0 0', // #500000 + // surface | #202325 + '--color-surface-50': '222 222 222', // #dedede + '--color-surface-100': '210 211 211', // #d2d3d3 + '--color-surface-200': '199 200 201', // #c7c8c9 + '--color-surface-300': '166 167 168', // #a6a7a8 + '--color-surface-400': '99 101 102', // #636566 + '--color-surface-500': '32 35 37', // #202325 + '--color-surface-600': '29 32 33', // #1d2021 + '--color-surface-700': '24 26 28', // #181a1c + '--color-surface-800': '19 21 22', // #131516 + '--color-surface-900': '16 17 18', // #101112 + }, +}; diff --git a/WebUI/src/app.html b/WebUI/src/app.html index b76ca170..e4cbcd5c 100644 --- a/WebUI/src/app.html +++ b/WebUI/src/app.html @@ -8,7 +8,7 @@ OpenShock Captive Portal %sveltekit.head% - +
%sveltekit.body%
diff --git a/WebUI/tailwind.config.ts b/WebUI/tailwind.config.ts index 10dfb253..11ff74b7 100644 --- a/WebUI/tailwind.config.ts +++ b/WebUI/tailwind.config.ts @@ -3,6 +3,7 @@ import type { Config } from 'tailwindcss' import forms from '@tailwindcss/forms'; import typography from '@tailwindcss/typography'; import { skeleton } from '@skeletonlabs/tw-plugin' +import { openshockTheme } from './openshock-theme'; export default { darkMode: 'class', @@ -15,12 +16,7 @@ export default { typography, skeleton({ themes: { - preset: [ - { - name: 'skeleton', - enhancements: true, - }, - ], + custom: [openshockTheme], }, }), ], From 81838e7e5ebff94083735f2cff3719b9e364c26a Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 21 Nov 2023 16:10:29 +0100 Subject: [PATCH 004/147] Rework HTTP/JSON handling to be cleaner (#106) * Remove ArduinoJson dependency * Add Json helper class * More code cleanup * Improve useragent * Improve Json parsing and file structure * [WIP] Implement ratelimiting and improve interface * Group JsonAPI calls into common place * Fix assignLCG endpoint url * Add response code handling * Improve Json deserializer logging * Finish ratelimiter implementation * Forgot to remove debug stuff --- include/http/HTTPRequestManager.h | 52 ++++ include/http/JsonAPI.h | 21 ++ include/serialization/JsonAPI.h | 33 +++ include/{ => util}/CertificateUtils.h | 0 include/{Utils => util}/HexUtils.h | 0 include/util/JsonRoot.h | 99 +++++++ platformio.ini | 1 - src/Config.cpp | 2 +- src/GatewayClient.cpp | 2 +- src/GatewayConnectionManager.cpp | 129 +++------- src/SerialInputHandler.cpp | 85 ++++-- .../local/WiFiNetworkConnectCommand.cpp | 2 +- .../local/WiFiNetworkDisconnectCommand.cpp | 2 +- .../local/WiFiNetworkForgetCommand.cpp | 2 +- .../local/WiFiNetworkSaveCommand.cpp | 2 +- src/http/HTTPRequestManager.cpp | 242 ++++++++++++++++++ src/http/JsonAPI.cpp | 43 ++++ src/serialization/JsonAPI.cpp | 148 +++++++++++ src/serialization/WSLocal.cpp | 2 +- src/{ => util}/CertificateUtils.cpp | 2 +- src/wifi/WiFiNetwork.cpp | 2 +- 21 files changed, 753 insertions(+), 118 deletions(-) create mode 100644 include/http/HTTPRequestManager.h create mode 100644 include/http/JsonAPI.h create mode 100644 include/serialization/JsonAPI.h rename include/{ => util}/CertificateUtils.h (100%) rename include/{Utils => util}/HexUtils.h (100%) create mode 100644 include/util/JsonRoot.h create mode 100644 src/http/HTTPRequestManager.cpp create mode 100644 src/http/JsonAPI.cpp create mode 100644 src/serialization/JsonAPI.cpp rename src/{ => util}/CertificateUtils.cpp (97%) diff --git a/include/http/HTTPRequestManager.h b/include/http/HTTPRequestManager.h new file mode 100644 index 00000000..93751a3b --- /dev/null +++ b/include/http/HTTPRequestManager.h @@ -0,0 +1,52 @@ +#pragma once + +#include "util/JsonRoot.h" + +#include + +#include +#include +#include + +namespace OpenShock::HTTP { + enum class RequestResult : std::uint8_t { + InvalidURL, // Invalid URL + RequestFailed, // Failed to start request + RateLimited, // Rate limited (can be both local and global) + CodeRejected, // Request completed, but response code was not OK + ParseFailed, // Request completed, but JSON parsing failed + Success, // Request completed successfully + }; + + template + struct Response { + RequestResult result; + int code; + T data; + }; + + template + using JsonParser = std::function; + + Response GetString(const char* const url, const std::map& headers, std::vector acceptedCodes = {200}); + + template + Response GetJSON(const char* const url, const std::map& headers, JsonParser jsonParser, std::vector acceptedCodes = {200}) { + auto response = GetString(url, headers, acceptedCodes); + if (response.result != RequestResult::Success) { + return {response.result, response.code, {}}; + } + + OpenShock::JsonRoot json = OpenShock::JsonRoot::Parse(response.data); + if (!json.isValid()) { + return {RequestResult::ParseFailed, response.code, {}}; + } + + T data; + if (!jsonParser(response.code, json, data)) { + return {RequestResult::ParseFailed, response.code, {}}; + } + + return {response.result, response.code, data}; + } +} // namespace OpenShock::HTTP diff --git a/include/http/JsonAPI.h b/include/http/JsonAPI.h new file mode 100644 index 00000000..d58ec35d --- /dev/null +++ b/include/http/JsonAPI.h @@ -0,0 +1,21 @@ +#pragma once + +#include "http/HTTPRequestManager.h" +#include "serialization/JsonAPI.h" + +namespace OpenShock::HTTP::JsonAPI { + /// @brief Links the device to the account with the given account link code, returns the device token. Valid response codes: 200, 404 + /// @param deviceToken + /// @return + HTTP::Response LinkAccount(const char* accountLinkCode); + + /// @brief Gets the device info for the given device token. Valid response codes: 200, 401 + /// @param deviceToken + /// @return + HTTP::Response GetDeviceInfo(const String& deviceToken); + + /// @brief Requests a Live Control Gateway to connect to. Valid response codes: 200, 401 + /// @param deviceToken + /// @return + HTTP::Response AssignLcg(const String& deviceToken); +} // namespace OpenShock::HTTP::JsonAPI diff --git a/include/serialization/JsonAPI.h b/include/serialization/JsonAPI.h new file mode 100644 index 00000000..04d48282 --- /dev/null +++ b/include/serialization/JsonAPI.h @@ -0,0 +1,33 @@ +#pragma once + +#include "ShockerModelType.h" + +#include + +#include +#include +#include + +namespace OpenShock::Serialization::JsonAPI { + struct AccountLinkResponse { + std::string authToken; + }; + struct DeviceInfoResponse { + std::string deviceId; + std::string deviceName; + struct ShockerInfo { + std::string id; + std::uint16_t rfId; + OpenShock::ShockerModelType model; + }; + std::vector shockers; + }; + struct AssignLcgResponse { + std::string fqdn; + std::string country; + }; + + bool ParseAccountLinkJsonResponse(int code, const cJSON* root, AccountLinkResponse& out); + bool ParseDeviceInfoJsonResponse(int code, const cJSON* root, DeviceInfoResponse& out); + bool ParseAssignLcgJsonResponse(int code, const cJSON* root, AssignLcgResponse& out); +} // namespace OpenShock::Serialization::JsonAPI diff --git a/include/CertificateUtils.h b/include/util/CertificateUtils.h similarity index 100% rename from include/CertificateUtils.h rename to include/util/CertificateUtils.h diff --git a/include/Utils/HexUtils.h b/include/util/HexUtils.h similarity index 100% rename from include/Utils/HexUtils.h rename to include/util/HexUtils.h diff --git a/include/util/JsonRoot.h b/include/util/JsonRoot.h new file mode 100644 index 00000000..9e98bb37 --- /dev/null +++ b/include/util/JsonRoot.h @@ -0,0 +1,99 @@ +#pragma once + +#include + +#include + +#include +#include + +namespace OpenShock { + class JsonRoot { + JsonRoot(cJSON* root) : _root(root) { } + public: + static JsonRoot Parse(const char* data) { + return JsonRoot(cJSON_Parse(data)); + } + static JsonRoot Parse(const char* data, std::size_t length) { + return JsonRoot(cJSON_ParseWithLength(data, length)); + } + static JsonRoot Parse(const std::string& data) { + return JsonRoot(cJSON_Parse(data.c_str())); + } + static JsonRoot Parse(const String& data) { + return JsonRoot(cJSON_Parse(data.c_str())); + } + static JsonRoot CreateNull() { + return JsonRoot(cJSON_CreateNull()); + } + static JsonRoot CreateObject() { + return JsonRoot(cJSON_CreateObject()); + } + static JsonRoot CreateArray() { + return JsonRoot(cJSON_CreateArray()); + } + + JsonRoot() : _root(nullptr) { } + JsonRoot(JsonRoot&& other) : _root(other._root) { + other._root = nullptr; + } + JsonRoot(const JsonRoot& other) : _root(nullptr) { + if (other._root != nullptr) { + _root = cJSON_Duplicate(other._root, true); + } + } + ~JsonRoot() { + if (_root != nullptr) { + cJSON_Delete(_root); + } + } + + bool isValid() const { + return _root != nullptr; + } + bool isObject() const { + return isValid() && cJSON_IsObject(_root); + } + bool isArray() const { + return isValid() && cJSON_IsArray(_root); + } + + const char* GetErrorMessage() const { + const char* error = cJSON_GetErrorPtr(); + if (error == nullptr) { + return "Unknown error"; + } + + return error; + } + + JsonRoot& operator=(JsonRoot&& other) { + if (this != &other) { + if (_root) { + cJSON_Delete(_root); + } + _root = other._root; + other._root = nullptr; + } + return *this; + } + JsonRoot& operator=(const JsonRoot& other) { + if (this != &other) { + if (_root) { + cJSON_Delete(_root); + } + _root = cJSON_Duplicate(other._root, true); + } + return *this; + } + + cJSON* operator->() const { + return _root; + } + operator cJSON*() const { + return _root; + } + private: + cJSON* _root; + }; +} diff --git a/platformio.ini b/platformio.ini index d449af1e..a47d11bb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,6 @@ build_flags = build_unflags = -std=gnu++11 lib_deps = - bblanchon/ArduinoJson@^6.21.3 https://github.com/OpenShock/flatbuffers https://github.com/martinmoene/span-lite https://github.com/OpenShock/ESPAsyncWebServer diff --git a/src/Config.cpp b/src/Config.cpp index 618212ef..d34cbfea 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -2,7 +2,7 @@ #include "Constants.h" #include "Logging.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index 317b27c3..3b5c4e3d 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -1,6 +1,6 @@ #include "GatewayClient.h" -#include "CertificateUtils.h" +#include "util/CertificateUtils.h" #include "event_handlers/WebSocket.h" #include "Logging.h" #include "Time.h" diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 392f2e79..ff104850 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -3,15 +3,11 @@ #include "VisualStateManager.h" #include "Config.h" -#include "Constants.h" #include "GatewayClient.h" +#include "http/JsonAPI.h" #include "Logging.h" #include "Time.h" -#include -#include - -#include #include // @@ -51,6 +47,7 @@ void _evWiFiDisconnectedHandler(arduino_event_t* event) { } using namespace OpenShock; +namespace JsonAPI = OpenShock::Serialization::JsonAPI; bool GatewayConnectionManager::Init() { WiFi.onEvent(_evGotIPHandler, ARDUINO_EVENT_WIFI_STA_GOT_IP); @@ -68,42 +65,10 @@ bool GatewayConnectionManager::IsConnected() { return s_wsClient->state() == GatewayClient::State::Connected; } -void GetDeviceInfoFromJsonResponse(HTTPClient& client) { - ArduinoJson::DynamicJsonDocument doc(1024); // TODO: profile the normal message size and adjust this accordingly - deserializeJson(doc, client.getString()); - - auto data = doc["data"]; - String id = data["id"]; - String name = data["name"]; - - ESP_LOGD(TAG, "Device ID: %s", id.c_str()); - ESP_LOGD(TAG, "Device name: %s", name.c_str()); - - auto shockers = data["shockers"]; - for (int i = 0; i < shockers.size(); i++) { - auto shocker = shockers[i]; - String shockerId = shocker["id"]; - std::uint16_t shockerRfId = shocker["rfId"]; - std::uint8_t shockerModel = shocker["model"]; - - ESP_LOGD(TAG, "Found shocker %s with RF ID %u and model %u", shockerId.c_str(), shockerRfId, shockerModel); - } -} - bool GatewayConnectionManager::IsPaired() { return (s_flags & FLAG_AUTHENTICATED) != 0; } -// This method is here to heap usage -std::string GetAuthTokenFromJsonResponse(HTTPClient& client) { - ArduinoJson::DynamicJsonDocument doc(1024); // TODO: profile the normal message size and adjust this accordingly - deserializeJson(doc, client.getString()); - - String str = doc["data"]; - - return std::string(str.c_str(), str.length()); -} - AccountLinkResultCode GatewayConnectionManager::Pair(const char* pairCode) { if ((s_flags & FLAG_HAS_IP) == 0) { return AccountLinkResultCode::NoInternetConnection; @@ -112,26 +77,23 @@ AccountLinkResultCode GatewayConnectionManager::Pair(const char* pairCode) { ESP_LOGD(TAG, "Attempting to pair with pair code %s", pairCode); - HTTPClient client; - - char uri[256]; - sprintf(uri, OPENSHOCK_API_URL("/1/device/pair/%s"), pairCode); + auto response = HTTP::JsonAPI::LinkAccount(pairCode); - client.begin(uri); - - int responseCode = client.GET(); + if (response.result != HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); + return AccountLinkResultCode::InternalError; + } - if (responseCode == 404) { + if (response.code == 404) { return AccountLinkResultCode::InvalidCode; } - if (responseCode != 200) { - ESP_LOGE(TAG, "Error while getting auth token: [%d] %s", responseCode, client.getString().c_str()); + + if (response.code != 200) { + ESP_LOGE(TAG, "Unexpected response code: %d", response.code); return AccountLinkResultCode::InternalError; } - std::string authToken = GetAuthTokenFromJsonResponse(client); - - client.end(); + std::string& authToken = response.data.authToken; if (authToken.empty()) { ESP_LOGE(TAG, "Received empty auth token"); @@ -154,34 +116,36 @@ void GatewayConnectionManager::UnPair() { Config::ClearBackendAuthToken(); } -bool FetchDeviceInfo(const std::string& authToken) { +bool FetchDeviceInfo(const String& authToken) { // TODO: this function is very slow, should be optimized! if ((s_flags & FLAG_HAS_IP) == 0) { return false; } - HTTPClient client; - - client.begin(OPENSHOCK_API_URL("/1/device/self")); + auto response = HTTP::JsonAPI::GetDeviceInfo(authToken); - client.addHeader("DeviceToken", authToken.c_str()); - - int responseCode = client.GET(); + if (response.result != HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Error while fetching device info: %d %d", response.result, response.code); + return false; + } - if (responseCode == 401) { + if (response.code == 401) { ESP_LOGD(TAG, "Auth token is invalid, clearing it"); Config::ClearBackendAuthToken(); return false; } - if (responseCode != 200) { - ESP_LOGE(TAG, "Error while verifying auth token: [%d] %s", responseCode, client.getString().c_str()); + if (response.code != 200) { + ESP_LOGE(TAG, "Unexpected response code: %d", response.code); return false; } - GetDeviceInfoFromJsonResponse(client); - - client.end(); + ESP_LOGI(TAG, "Device ID: %s", response.data.deviceId.c_str()); + ESP_LOGI(TAG, "Device Name: %s", response.data.deviceName.c_str()); + ESP_LOGI(TAG, "Shockers:"); + for (auto& shocker : response.data.shockers) { + ESP_LOGI(TAG, " [%s] rf=%u model=%u", shocker.id.c_str(), shocker.rfId, shocker.model); + } s_flags |= FLAG_AUTHENTICATED; @@ -214,37 +178,28 @@ bool ConnectToLCG() { return false; } - std::string authToken = Config::GetBackendAuthToken(); - - HTTPClient client; + String authToken = Config::GetBackendAuthToken().c_str(); - client.begin(OPENSHOCK_API_URL("/1/device/assignLCG")); + auto response = HTTP::JsonAPI::AssignLcg(authToken); - client.addHeader("DeviceToken", authToken.c_str()); - - int responseCode = client.GET(); - - if (responseCode != 200) { - ESP_LOGE(TAG, "Error while fetching LCG endpoint: [%d] %s", responseCode, client.getString().c_str()); + if (response.result != HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Error while fetching LCG endpoint: %d %d", response.result, response.code); return false; } - ArduinoJson::DynamicJsonDocument doc(1024); // TODO: profile the normal message size and adjust this accordingly - deserializeJson(doc, client.getString()); - - auto data = doc["data"]; - const char* fqdn = data["fqdn"]; - const char* country = data["country"]; - - client.end(); + if (response.code == 401) { + ESP_LOGD(TAG, "Auth token is invalid, clearing it"); + Config::ClearBackendAuthToken(); + return false; + } - if (fqdn == nullptr || country == nullptr) { - ESP_LOGE(TAG, "Received invalid response from LCG endpoint"); + if (response.code != 200) { + ESP_LOGE(TAG, "Unexpected response code: %d", response.code); return false; } - ESP_LOGD(TAG, "Connecting to LCG endpoint %s in country %s", fqdn, country); - s_wsClient->connect(fqdn); + ESP_LOGD(TAG, "Connecting to LCG endpoint %s in country %s", response.data.fqdn.c_str(), response.data.country.c_str()); + s_wsClient->connect(response.data.fqdn.c_str()); return true; } @@ -256,7 +211,7 @@ void GatewayConnectionManager::Update() { return; } - std::string authToken = Config::GetBackendAuthToken(); + String authToken = Config::GetBackendAuthToken().c_str(); // Fetch device info if (!FetchDeviceInfo(authToken)) { @@ -266,7 +221,7 @@ void GatewayConnectionManager::Update() { s_flags |= FLAG_AUTHENTICATED; ESP_LOGD(TAG, "Successfully verified auth token"); - s_wsClient = std::make_unique(authToken); + s_wsClient = std::make_unique(authToken.c_str()); } if (s_wsClient->loop()) { diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 9291a51f..3afb59a0 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -4,8 +4,9 @@ #include "Config.h" #include "Logging.h" #include "wifi/WiFiManager.h" +#include "util/JsonRoot.h" -#include +#include #include #include @@ -166,46 +167,88 @@ void _handleAuthtokenCommand(char* arg, std::size_t argLength) { } void _handleNetworksCommand(char* arg, std::size_t argLength) { + cJSON* network = nullptr; + OpenShock::JsonRoot root; + if (arg == nullptr || argLength <= 0) { - // Get networks - StaticJsonDocument<1024> outDoc; - JsonArray outNetworks = outDoc.to(); + root = OpenShock::JsonRoot::CreateArray(); + if (!root.isValid()) { + Serial.println("$SYS$|Error|Failed to create JSON array"); + return; + } for (auto& creds : Config::GetWiFiCredentials()) { - JsonObject network = outNetworks.createNestedObject(); - network["ssid"] = creds.ssid; - network["password"] = creds.password; + network = cJSON_CreateObject(); + if (network == nullptr) { + Serial.println("$SYS$|Error|Failed to create JSON object"); + return; + } + + cJSON_AddStringToObject(network, "ssid", creds.ssid.c_str()); + cJSON_AddStringToObject(network, "password", creds.password.c_str()); + + cJSON_AddItemToArray(root, network); + } + + char* out = cJSON_PrintUnformatted(root); + if (out == nullptr) { + Serial.println("$SYS$|Error|Failed to print JSON"); + return; } Serial.print("$SYS$|Response|Networks|"); - serializeJson(outDoc, Serial); - Serial.println(); + Serial.println(out); + + cJSON_free(out); return; } - DynamicJsonDocument doc(1024); - deserializeJson(doc, arg, argLength); - - JsonArray networks = doc.as(); + root = OpenShock::JsonRoot::Parse(arg, argLength); + if (!root.isValid()) { + Serial.print("$SYS$|Error|Failed to parse JSON: "); + Serial.println(root.GetErrorMessage()); + return; + } + if (!root.isArray()) { + Serial.println("$SYS$|Error|Invalid argument (not an array)"); + return; + } std::uint8_t id = 1; std::vector creds; - for (JsonObject network : networks) { - std::string ssid = network["ssid"].as(); - std::string password = network["password"].as(); + cJSON_ArrayForEach(network, root) { + if (!cJSON_IsObject(network)) { + Serial.println("$SYS$|Error|Invalid argument (array entry is not an object)"); + return; + } + + const cJSON* ssid = cJSON_GetObjectItemCaseSensitive(network, "ssid"); + const cJSON* password = cJSON_GetObjectItemCaseSensitive(network, "password"); - if (ssid.empty() || password.empty()) { - Serial.println("$SYS$|Error|Invalid argument (missing ssid or password)"); + if (!cJSON_IsString(ssid) || !cJSON_IsString(password)) { + Serial.println("$SYS$|Error|Invalid argument (ssid or password is not a string)"); + return; + } + + const char* ssidStr = ssid->valuestring; + const char* passwordStr = password->valuestring; + + if (ssidStr == nullptr || passwordStr == nullptr) { + Serial.println("$SYS$|Error|Invalid argument (ssid or password is null)"); + return; + } + if (ssidStr[0] == '\0' || passwordStr[0] == '\0') { + Serial.println("$SYS$|Error|Invalid argument (ssid or password is empty)"); return; } Config::WiFiCredentials cred { .id = id++, - .ssid = ssid, + .ssid = ssidStr, .bssid = {0, 0, 0, 0, 0, 0}, - .password = password, + .password = passwordStr, }; - ESP_LOGI(TAG, "Adding network to config %s", ssid.c_str()); + ESP_LOGI(TAG, "Adding network to config %s", ssidStr); creds.push_back(std::move(cred)); } diff --git a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp index 947e82ed..71771a02 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp @@ -1,7 +1,7 @@ #include "event_handlers/impl/WSLocal.h" #include "Logging.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include "wifi/WiFiManager.h" #include diff --git a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp index b8d6a5e4..88592d5a 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp @@ -1,7 +1,7 @@ #include "event_handlers/impl/WSLocal.h" #include "Logging.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include "wifi/WiFiManager.h" #include diff --git a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp index c43ed572..5e600e0b 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp @@ -1,7 +1,7 @@ #include "event_handlers/impl/WSLocal.h" #include "Logging.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include "wifi/WiFiManager.h" #include diff --git a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp index fdf511dc..e166510d 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp @@ -1,7 +1,7 @@ #include "event_handlers/impl/WSLocal.h" #include "Logging.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include "wifi/WiFiManager.h" #include diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp new file mode 100644 index 00000000..704e5894 --- /dev/null +++ b/src/http/HTTPRequestManager.cpp @@ -0,0 +1,242 @@ +#include "http/HTTPRequestManager.h" + +#include "Time.h" + +#include + +#include +#include +#include +#include + +const char* const TAG = "HTTPRequestManager"; +const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (Espressif; " OPENSHOCK_FW_CHIP "; " OPENSHOCK_FW_BOARD ") " OPENSHOCK_FW_COMMIT; + +struct RateLimit { + RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() {} + + void addLimit(std::uint32_t durationMs, std::uint16_t count) { + // Insert sorted + m_limits.insert(std::upper_bound(m_limits.begin(), m_limits.end(), durationMs, [](std::int64_t durationMs, const Limit& limit) { + return durationMs > limit.durationMs; + }), {durationMs, count}); + } + void clearLimits() { + m_limits.clear(); + } + + bool tryRequest() { + std::int64_t now = OpenShock::millis(); + + if (m_blockUntilMs > now) { + ESP_LOGW(TAG, "Rate limited for %lld more milliseconds", m_blockUntilMs - now); + return false; + } + + // Remove all requests that are older than the biggest limit + while (!m_requests.empty() && m_requests.front() < now - m_limits.back().durationMs) { + m_requests.erase(m_requests.begin()); + } + + // Check if we've exceeded any limits + for (auto& limit : m_limits) { + if (m_requests.size() >= limit.count) { + m_blockUntilMs = now + limit.durationMs; + ESP_LOGW(TAG, "Rate limited for %lld milliseconds", limit.durationMs); + return false; + } + } + + // Add the request + m_requests.push_back(now); + + return true; + } + void clearRequests() { + m_requests.clear(); + } + + void blockUntil(std::int64_t blockUntilMs) { + m_blockUntilMs = blockUntilMs; + } + + std::uint32_t requestsSince(std::int64_t sinceMs) { + return std::count_if(m_requests.begin(), m_requests.end(), [sinceMs](std::int64_t requestMs) { + return requestMs >= sinceMs; + }); + } +private: + struct Limit { + std::int64_t durationMs; + std::uint16_t count; + }; + + std::int64_t m_blockUntilMs; + std::vector m_limits; + std::vector m_requests; +}; + +std::unordered_map> s_rateLimits; + +using namespace OpenShock; + +const char* _strfind(const char* haystack, const char* haystackEnd, const char* needle, std::size_t needleLen) { + const char* needleEnd = needle + needleLen; + const char* result = std::search(haystack, haystackEnd, needle, needleEnd); + if (result == haystackEnd) { + return nullptr; + } + + return result; +} + +bool _getDomain(const char* url, char (&domain)[256]) { + if (url == nullptr) { + memset(domain, 0, 256); + return false; + } + + const char* urlEnd = url + strlen(url); + + const char* ptr; + + // Get the beginning of the domain (after the protocol) eg. "https://api.example.com/path" -> "api.example.com/path" + ptr = _strfind(url, urlEnd, "://", 3); + if (ptr != nullptr) { + url = ptr + 3; + } + + // Get the end of the domain (before the first colon or slash) eg. "api.example.com/path" -> "api.example.com" or "api.example.com:8080/path" -> "api.example.com" + ptr = std::find_if(url, urlEnd, [](char c) { return c == ':' || c == '/'; }); + if (ptr != urlEnd) { + urlEnd = ptr; + } + + // Reverse trough url, get domain seperator, then store subdomain seperator in ptr + bool foundDomSep = false; + for (ptr = urlEnd - 1; ptr != url; ptr--) { + if (*ptr == '.') { + if (foundDomSep) { + url = ptr + 1; + break; + } + foundDomSep = true; + } + } + if (!foundDomSep) { + return false; + } + + // Copy the domain into the buffer, and set the null terminator + memcpy(domain, url, urlEnd - url); + domain[urlEnd - url] = '\0'; + + return true; +} + +std::shared_ptr _rateLimitFactory(const char (&domain)[256]) { + auto rateLimit = std::make_shared(); + + // Add default limits + rateLimit->addLimit(1000, 5); // 5 per second + rateLimit->addLimit(10 * 1000, 10); // 10 per 10 seconds + + // per-domain limits + if (strcmp(domain, OPENSHOCK_API_DOMAIN) == 0) { + rateLimit->addLimit(60 * 1000, 12); // 12 per minute + rateLimit->addLimit(60 * 60 * 1000, 120); // 120 per hour + } + + return rateLimit; +} + +std::shared_ptr _getRateLimiter(const char* url) { + char domain[256]; + if (!_getDomain(url, domain)) { + return nullptr; + } + + ESP_LOGI(TAG, "Getting rate limiter for domain: %s", domain); + + auto it = s_rateLimits.find(domain); + if (it == s_rateLimits.end()) { + s_rateLimits.emplace(domain, _rateLimitFactory(domain)); + it = s_rateLimits.find(domain); + } + + return it->second; +} + +void _setupClient(HTTPClient& client) { + client.setUserAgent(OPENSHOCK_FW_USERAGENT); +} +HTTP::Response _doGet(HTTPClient& client, const char* url, const std::map& headers, std::shared_ptr rateLimiter) { + if (!client.begin(url)) { + ESP_LOGE(TAG, "Failed to begin HTTP request"); + return {HTTP::RequestResult::RequestFailed, 0, ""}; + } + + for (auto& header : headers) { + client.addHeader(header.first, header.second); + } + + int responseCode = client.GET(); + + if (responseCode == HTTP_CODE_TOO_MANY_REQUESTS) { + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After + + // Get "Retry-After" header + String retryAfterStr = client.header("Retry-After"); + + // Try to parse it as an integer (delay-seconds) + long retryAfter = 0; + if (retryAfterStr.length() > 0 && std::all_of(retryAfterStr.begin(), retryAfterStr.end(), isdigit)) { + retryAfter = retryAfterStr.toInt(); + } + + // If header missing/unparseable, default to 15 seconds + if (retryAfter <= 0) { + retryAfter = 15; + } + + // Get the block-until time + std::int64_t blockUntilMs = OpenShock::millis() + retryAfter * 1000; + + // Apply the block-until time + rateLimiter->blockUntil(blockUntilMs); + + return {HTTP::RequestResult::RateLimited, responseCode, ""}; + } + + if (responseCode == 418) { + ESP_LOGW(TAG, "The server refused to brew coffee because it is, permanently, a teapot."); + } + + return {HTTP::RequestResult::Success, responseCode, client.getString()}; +} + +HTTP::Response HTTP::GetString(const char* url, const std::map& headers, std::vector acceptedCodes) { + std::shared_ptr rateLimiter = _getRateLimiter(url); + if (rateLimiter == nullptr) { + return {RequestResult::InvalidURL, 0, ""}; + } + + if (!rateLimiter->tryRequest()) { + return {RequestResult::RateLimited, 0, ""}; + } + + HTTPClient client; + _setupClient(client); + + auto response = _doGet(client, url, headers, rateLimiter); + if (response.result != RequestResult::Success) { + return response; + } + + if (std::find(acceptedCodes.begin(), acceptedCodes.end(), response.code) == acceptedCodes.end()) { + ESP_LOGE(TAG, "Received unexpected response code %d", response.code); + return {RequestResult::CodeRejected, response.code, ""}; + } + + return response; +} diff --git a/src/http/JsonAPI.cpp b/src/http/JsonAPI.cpp new file mode 100644 index 00000000..c8e6b9a9 --- /dev/null +++ b/src/http/JsonAPI.cpp @@ -0,0 +1,43 @@ +#include "http/JsonAPI.h" + +#include "Constants.h" + +using namespace OpenShock; + +HTTP::Response HTTP::JsonAPI::LinkAccount(const char* accountLinkCode) { + char uri[256]; + sprintf(uri, OPENSHOCK_API_URL("/1/device/pair/%s"), accountLinkCode); + + return HTTP::GetJSON( + uri, + { + {"Accept", "application/json"} + }, + Serialization::JsonAPI::ParseAccountLinkJsonResponse, + {200, 404} + ); +} + +HTTP::Response HTTP::JsonAPI::GetDeviceInfo(const String& deviceToken) { + return HTTP::GetJSON( + OPENSHOCK_API_URL("/1/device/self"), + { + { "Accept", "application/json"}, + {"DeviceToken", deviceToken} + }, + Serialization::JsonAPI::ParseDeviceInfoJsonResponse, + {200, 401} + ); +} + +HTTP::Response HTTP::JsonAPI::AssignLcg(const String& deviceToken) { + return HTTP::GetJSON( + OPENSHOCK_API_URL("/1/device/assignLCG"), + { + { "Accept", "application/json"}, + {"DeviceToken", deviceToken} + }, + Serialization::JsonAPI::ParseAssignLcgJsonResponse, + {200, 401} + ); +} diff --git a/src/serialization/JsonAPI.cpp b/src/serialization/JsonAPI.cpp new file mode 100644 index 00000000..b486d749 --- /dev/null +++ b/src/serialization/JsonAPI.cpp @@ -0,0 +1,148 @@ +#include "serialization/JsonAPI.h" + +#include "Logging.h" + +const char* const TAG = "JsonAPI"; + +#define ESP_LOGJSONE(err, root) ESP_LOGE(TAG, "Invalid JSON response (" err "): %s", cJSON_PrintUnformatted(root)) + +using namespace OpenShock::Serialization; + +bool JsonAPI::ParseAccountLinkJsonResponse(int code, const cJSON* root, JsonAPI::AccountLinkResponse& out) { + if (!cJSON_IsObject(root)) { + ESP_LOGJSONE("not an object", root); + return false; + } + + const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); + if (!cJSON_IsString(data)) { + ESP_LOGJSONE("value at 'data' is not a string", root); + return false; + } + + out = {}; + + out.authToken = data->valuestring; + + return true; +} +bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI::DeviceInfoResponse& out) { + if (!cJSON_IsObject(root)) { + ESP_LOGJSONE("not an object", root); + return false; + } + + const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); + if (!cJSON_IsObject(data)) { + ESP_LOGJSONE("value at 'data' is not an object", root); + return false; + } + + const cJSON* deviceId = cJSON_GetObjectItemCaseSensitive(data, "id"); + if (!cJSON_IsString(deviceId)) { + ESP_LOGJSONE("value at 'data.id' is not a string", root); + return false; + } + + const cJSON* deviceName = cJSON_GetObjectItemCaseSensitive(data, "name"); + if (!cJSON_IsString(deviceName)) { + ESP_LOGJSONE("value at 'data.name' is not a string", root); + return false; + } + + const cJSON* deviceShockers = cJSON_GetObjectItemCaseSensitive(data, "shockers"); + if (!cJSON_IsArray(deviceShockers)) { + ESP_LOGJSONE("value at 'data.shockers' is not an array", root); + return false; + } + + out = {}; + + out.deviceId = deviceId->valuestring; + out.deviceName = deviceName->valuestring; + + if (out.deviceId.empty() || out.deviceName.empty()) { + ESP_LOGJSONE("value at 'data.id' or 'data.name' is empty", root); + return false; + } + + cJSON* shocker = nullptr; + cJSON_ArrayForEach(shocker, deviceShockers) { + const cJSON* shockerId = cJSON_GetObjectItemCaseSensitive(shocker, "id"); + if (!cJSON_IsString(shockerId)) { + ESP_LOGJSONE("value at 'shocker.id' is not a string", shocker); + return false; + } + const char* shockerIdStr = shockerId->valuestring; + + if (shockerIdStr == nullptr || shockerIdStr[0] == '\0') { + ESP_LOGJSONE("value at 'shocker.id' is empty", shocker); + return false; + } + + const cJSON* shockerRfId = cJSON_GetObjectItemCaseSensitive(shocker, "rfId"); + if (!cJSON_IsNumber(shockerRfId)) { + ESP_LOGJSONE("value at 'shocker.rfId' is not a number", shocker); + return false; + } + int shockerRfIdInt = shockerRfId->valueint; + if (shockerRfIdInt < 0 || shockerRfIdInt > UINT16_MAX) { + ESP_LOGJSONE("value at 'shocker.rfId' is not a valid uint16_t", shocker); + return false; + } + std::uint16_t shockerRfIdU16 = (std::uint16_t)shockerRfIdInt; + + const cJSON* shockerModel = cJSON_GetObjectItemCaseSensitive(shocker, "model"); + if (!cJSON_IsString(shockerModel)) { + ESP_LOGJSONE("value at 'shocker.model' is not a string", shocker); + return false; + } + const char* shockerModelStr = shockerModel->valuestring; + + if (shockerModelStr == nullptr || shockerModelStr[0] == '\0') { + ESP_LOGJSONE("value at 'shocker.model' is empty", shocker); + return false; + } + + OpenShock::ShockerModelType shockerModelType; + if (strcmp(shockerModelStr, "CaiXianlin") == 0 || strcmp(shockerModelStr, "CaiXianLin") == 0 || strcmp(shockerModelStr, "XLC") == 0 || strcmp(shockerModelStr, "CXL") == 0) { + shockerModelType = OpenShock::ShockerModelType::CaiXianlin; + } else if (strcmp(shockerModelStr, "PetTrainer") == 0 || strcmp(shockerModelStr, "PT") == 0) { + shockerModelType = OpenShock::ShockerModelType::PetTrainer; + } else { + ESP_LOGJSONE("value at 'shocker.model' is not a valid shocker model", shocker); + return false; + } + + out.shockers.push_back({.id = shockerIdStr, .rfId = shockerRfIdU16, .model = shockerModelType}); + } + + return true; +} +bool JsonAPI::ParseAssignLcgJsonResponse(int code, const cJSON* root, JsonAPI::AssignLcgResponse& out) { + if (!cJSON_IsObject(root)) { + ESP_LOGJSONE("not an object", root); + return false; + } + + const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); + if (!cJSON_IsObject(data)) { + ESP_LOGJSONE("value at 'data' is not an object", root); + return false; + } + + const cJSON* fqdn = cJSON_GetObjectItemCaseSensitive(data, "fqdn"); + const cJSON* country = cJSON_GetObjectItemCaseSensitive(data, "country"); + + if (!cJSON_IsString(fqdn) || !cJSON_IsString(country)) { + ESP_LOGJSONE("value at 'data.fqdn' or 'data.country' is not a string", root); + return false; + } + + out = {}; + + out.fqdn = fqdn->valuestring; + out.country = country->valuestring; + + return true; +} diff --git a/src/serialization/WSLocal.cpp b/src/serialization/WSLocal.cpp index 31025d38..eac30b83 100644 --- a/src/serialization/WSLocal.cpp +++ b/src/serialization/WSLocal.cpp @@ -1,6 +1,6 @@ #include "serialization/WSLocal.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include "wifi/WiFiNetwork.h" #include "serialization/_fbs/DeviceToLocalMessage_generated.h" diff --git a/src/CertificateUtils.cpp b/src/util/CertificateUtils.cpp similarity index 97% rename from src/CertificateUtils.cpp rename to src/util/CertificateUtils.cpp index ab41a3a5..bca70882 100644 --- a/src/CertificateUtils.cpp +++ b/src/util/CertificateUtils.cpp @@ -1,4 +1,4 @@ -#include "CertificateUtils.h" +#include "util/CertificateUtils.h" #include "Logging.h" diff --git a/src/wifi/WiFiNetwork.cpp b/src/wifi/WiFiNetwork.cpp index aa8e038e..1577000a 100644 --- a/src/wifi/WiFiNetwork.cpp +++ b/src/wifi/WiFiNetwork.cpp @@ -1,6 +1,6 @@ #include "wifi/WiFiNetwork.h" -#include "Utils/HexUtils.h" +#include "util/HexUtils.h" #include From a97bd869f540606e853ecec81a8b927df38721b0 Mon Sep 17 00:00:00 2001 From: Luca Date: Thu, 23 Nov 2023 04:42:53 +0100 Subject: [PATCH 005/147] D1 Mini default pin should be 15 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index a47d11bb..270ec875 100644 --- a/platformio.ini +++ b/platformio.ini @@ -47,7 +47,7 @@ board = Wemos-D1-Mini-ESP32 custom_openshock.chip = ESP32-D0WDQ6 build_flags = -DOPENSHOCK_LED_GPIO=2 - -DOPENSHOCK_TX_PIN=12 + -DOPENSHOCK_TX_PIN=15 ; https://docs.platformio.org/en/latest/boards/espressif32/lolin_s2_mini.html [env:Wemos-Lolin-S2-Mini] From 4dbefe97927f734630451b4e115198732a03201d Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 24 Nov 2023 12:52:14 +0100 Subject: [PATCH 006/147] Increase stability by handling heavy tasks better (#122) --- include/util/TaskUtils.h | 27 +++++++++++++++++++++++++++ src/radio/RFTransmitter.cpp | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 include/util/TaskUtils.h diff --git a/include/util/TaskUtils.h b/include/util/TaskUtils.h new file mode 100644 index 00000000..381c787a --- /dev/null +++ b/include/util/TaskUtils.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +namespace OpenShock::TaskUtils { + /// @brief Create a task on the core that does expensive work, this should not run on the core that handles WiFi + /// @param pvTaskCode + /// @param pcName + /// @param usStackDepth + /// @param pvParameters + /// @param uxPriority + /// @param pvCreatedTask + /// @return + inline esp_err_t TaskCreateExpensive(TaskFunction_t pvTaskCode, const char* const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pvCreatedTask) { +#if portNUM_PROCESSORS == 2 + // Run on core 1 (0 handles WiFi and should be minimally used) + return xTaskCreatePinnedToCore(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, 1); +#else +#if portNUM_PROCESSORS > 2 +#warning "This chip has more than 2 cores. Please update this code to use the correct core." +#endif + // Run on any core + return xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask); +#endif + } +} // namespace OpenShock diff --git a/src/radio/RFTransmitter.cpp b/src/radio/RFTransmitter.cpp index 720c7a7d..6347e61d 100644 --- a/src/radio/RFTransmitter.cpp +++ b/src/radio/RFTransmitter.cpp @@ -4,10 +4,10 @@ #include "Logging.h" #include "radio/rmt/MainEncoder.h" #include "Time.h" +#include "util/TaskUtils.h" #include #include -#include #include @@ -45,7 +45,7 @@ RFTransmitter::RFTransmitter(std::uint8_t gpioPin, int queueSize) : m_txPin(gpio char name[32]; snprintf(name, sizeof(name), "RFTransmitter-%u", m_txPin); - if (xTaskCreate(TransmitTask, name, 4096, this, 1, &m_taskHandle) != pdPASS) { + if (TaskUtils::TaskCreateExpensive(TransmitTask, name, 4096, this, 1, &m_taskHandle) != pdPASS) { ESP_LOGE(TAG, "[pin-%u] Failed to create task", m_txPin); destroy(); return; From b6e1b15b9ec8fdc5154bdff9f9d6a8ba4e7a9f35 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Fri, 24 Nov 2023 19:33:38 -0800 Subject: [PATCH 007/147] RGB Support plus OpenShock Core V1 board definition (#121) * Basic WS2812B Implementation, set by -DOPENSHOCK_LED_WS2812B * Add OpenShock Core V1 definition, allow GPIO+RGB LEDs simultaneously, RGB Tweaks * Add N8R2 chip variant files * Use proper N8R2 board definition partitions * Actually fix partitions, resolve conversations (but there's issues?) * Forgot pdMS_TO_TICKS is a compile-time macro * Attempt defer RGBRMT to Core 0, redo pdMS_TO_TICKs, truly fix partitions * Send black on RGB init, Core V1: standard partitions for now + no PSRAM * Use bitCount for rmt_data_t array, remove initial black send. --- chips/ESP32-S3/N8/merge-image.py | 16 +++ chips/ESP32-S3/N8/partitions.csv | 6 + include/RGBPatternManager.h | 43 +++++++ include/VisualStateManager.h | 3 +- platformio.ini | 14 ++- src/EStopManager.cpp | 18 +-- src/RGBPatternManager.cpp | 134 ++++++++++++++++++++ src/VisualStateManager.cpp | 205 ++++++++++++++++++++++++++----- 8 files changed, 400 insertions(+), 39 deletions(-) create mode 100644 chips/ESP32-S3/N8/merge-image.py create mode 100644 chips/ESP32-S3/N8/partitions.csv create mode 100644 include/RGBPatternManager.h create mode 100644 src/RGBPatternManager.cpp diff --git a/chips/ESP32-S3/N8/merge-image.py b/chips/ESP32-S3/N8/merge-image.py new file mode 100644 index 00000000..190b5fb0 --- /dev/null +++ b/chips/ESP32-S3/N8/merge-image.py @@ -0,0 +1,16 @@ +#!/bin/python3 + +import esptool + +# fmt: off +# Note: Bootloader for esp32-s3 starts at 0x0000, unlike several other ESP32 variants that start at 0x1000. +esptool.main([ + '--chip', 'esp32s3', + 'merge_bin', '-o', 'merged.bin', + '--flash_size', '8MB', + '0x0', './bootloader.bin', + '0x8000', './partitions.bin', + '0x10000', './firmware.bin', + '0x310000', './filesystem.bin' +]) +# fmt: on diff --git a/chips/ESP32-S3/N8/partitions.csv b/chips/ESP32-S3/N8/partitions.csv new file mode 100644 index 00000000..61254fca --- /dev/null +++ b/chips/ESP32-S3/N8/partitions.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x300000, +spiffs, data, spiffs, 0x310000,0xE0000, +coredump, data, coredump,0x3F0000,0x10000, \ No newline at end of file diff --git a/include/RGBPatternManager.h b/include/RGBPatternManager.h new file mode 100644 index 00000000..7f98c11e --- /dev/null +++ b/include/RGBPatternManager.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include + +#include +#include +#include + +#include + +namespace OpenShock { + class RGBPatternManager { + public: + RGBPatternManager(std::uint8_t gpioPin); + ~RGBPatternManager(); + + struct RGBState { + std::uint8_t red; + std::uint8_t green; + std::uint8_t blue; + std::uint32_t duration; + }; + + void SetPattern(nonstd::span pattern); + void SetBrightness(std::uint8_t brightness); + void ClearPattern(); + + private: + void ClearPatternInternal(); + void SendRGB(const RGBState state); + static void RunPattern(void* arg); + + std::uint8_t m_rgbPin; + std::uint8_t m_rgbBrightness; // 0-255 + rmt_obj_t* m_rmtHandle; + RGBState* m_pattern; + std::size_t m_patternLength; + TaskHandle_t m_taskHandle; + SemaphoreHandle_t m_taskSemaphore; + }; +} // namespace OpenShock diff --git a/include/VisualStateManager.h b/include/VisualStateManager.h index 9148dff6..c6174fdd 100644 --- a/include/VisualStateManager.h +++ b/include/VisualStateManager.h @@ -1,5 +1,6 @@ #pragma once +#include "EStopManager.h" #include namespace OpenShock::VisualStateManager { @@ -7,6 +8,6 @@ namespace OpenShock::VisualStateManager { void SetCriticalError(); void SetScanningStarted(); - void SetEmergencyStop(bool isStopped); + void SetEmergencyStop(OpenShock::EStopManager::EStopStatus status); void SetWebSocketConnected(bool isConnected); } // namespace OpenShock::VisualStateManager diff --git a/platformio.ini b/platformio.ini index 270ec875..d53697e0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,7 +21,7 @@ lib_deps = https://github.com/martinmoene/span-lite https://github.com/OpenShock/ESPAsyncWebServer https://github.com/Links2004/arduinoWebSockets -board_build.partitions = huge_app.csv ; Overridden per board +board_build.partitions = huge_app.csv ; Overridden per board by custom_openshock selections board_build.filesystem = littlefs board_build.embed_files = certificates/x509_crt_bundle extra_scripts = @@ -87,5 +87,17 @@ custom_openshock.chip_variant = N8R8 build_flags = -DOPENSHOCK_LED_GPIO=21 +; https://github.com/nullstalgia/OpenShock-Hardware/tree/main/Core +; 8MB Flash, assume no PSRAM. +[env:OpenShock-Core-V1] +board = esp32-s3-devkitc-1 ; builtin +custom_openshock.chip = ESP32-S3 +custom_openshock.chip_variant = N8 +build_flags = + -DOPENSHOCK_LED_WS2812B=48 + -DOPENSHOCK_LED_GPIO=35 + -DOPENSHOCK_TX_PIN=15 + -DOPENSHOCK_ESTOP_PIN=13 + ; TODO: ; https://docs.platformio.org/en/latest/boards/espressif32/upesy_wroom.html;upesy-esp32-wroom-devkit diff --git a/src/EStopManager.cpp b/src/EStopManager.cpp index 39da390e..49d85252 100644 --- a/src/EStopManager.cpp +++ b/src/EStopManager.cpp @@ -1,7 +1,7 @@ #include "EStopManager.h" -#include "Time.h" #include "Logging.h" +#include "Time.h" #include "VisualStateManager.h" #include @@ -10,11 +10,11 @@ const char* const TAG = "EStopManager"; using namespace OpenShock; -static EStopManager::EStopStatus s_estopStatus = EStopManager::EStopStatus::ALL_CLEAR; -static std::uint32_t s_estopHoldToClearTime = 5000; -static std::int64_t s_lastEStopButtonStateChange = 0; -static std::int64_t s_estoppedAt = 0; -static bool s_lastEStopButtonState = HIGH; +static EStopManager::EStopStatus s_estopStatus = EStopManager::EStopStatus::ALL_CLEAR; +static std::uint32_t s_estopHoldToClearTime = 5000; +static std::int64_t s_lastEStopButtonStateChange = 0; +static std::int64_t s_estoppedAt = 0; +static bool s_lastEStopButtonState = HIGH; static std::uint8_t s_estopPin; @@ -61,13 +61,14 @@ EStopManager::EStopStatus EStopManager::Update() { s_estopStatus = EStopManager::EStopStatus::ESTOPPED_AND_HELD; s_estoppedAt = s_lastEStopButtonStateChange; ESP_LOGI(TAG, "Emergency Stopped!!!"); - OpenShock::VisualStateManager::SetEmergencyStop(true); + OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); } break; case EStopManager::EStopStatus::ESTOPPED_AND_HELD: if (buttonState == HIGH) { // User has released the button, now we can trust them holding to clear it. s_estopStatus = EStopManager::EStopStatus::ESTOPPED; + OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); } break; case EStopManager::EStopStatus::ESTOPPED: @@ -75,7 +76,7 @@ EStopManager::EStopStatus EStopManager::Update() { if (buttonState == LOW && s_lastEStopButtonState == LOW && s_lastEStopButtonStateChange + s_estopHoldToClearTime <= OpenShock::millis()) { s_estopStatus = EStopManager::EStopStatus::ESTOPPED_CLEARED; ESP_LOGI(TAG, "Clearing EStop on button release!"); - OpenShock::VisualStateManager::SetEmergencyStop(false); + OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); } break; case EStopManager::EStopStatus::ESTOPPED_CLEARED: @@ -83,6 +84,7 @@ EStopManager::EStopStatus EStopManager::Update() { if (buttonState == HIGH) { s_estopStatus = EStopManager::EStopStatus::ALL_CLEAR; ESP_LOGI(TAG, "All clear!"); + OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); } break; diff --git a/src/RGBPatternManager.cpp b/src/RGBPatternManager.cpp new file mode 100644 index 00000000..6440b391 --- /dev/null +++ b/src/RGBPatternManager.cpp @@ -0,0 +1,134 @@ +#include "RGBPatternManager.h" + +#include "Logging.h" +#include "util/TaskUtils.h" + +#include + +const char* const TAG = "RGBPatternManager"; + +using namespace OpenShock; + +// Currently this assumes a single WS2812B LED +// TODO: Support multiple LEDs ? +// TODO: Support other LED types ? + +RGBPatternManager::RGBPatternManager(std::uint8_t rgbPin) : m_rgbPin(rgbPin), m_rgbBrightness(255), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskSemaphore(xSemaphoreCreateBinary()) { + if ((m_rmtHandle = rmtInit(m_rgbPin, RMT_TX_MODE, RMT_MEM_64)) == NULL) { + ESP_LOGE(TAG, "[pin-%u] Failed to create rgb rmt object", m_rgbPin); + } + + float realTick = rmtSetTick(m_rmtHandle, 100); + ESP_LOGD(TAG, "[pin-%u] real tick set to: %fns", m_rgbPin, realTick); + + SetBrightness(20); + + xSemaphoreGive(m_taskSemaphore); +} + +RGBPatternManager::~RGBPatternManager() { + ClearPattern(); + + vSemaphoreDelete(m_taskSemaphore); +} + +void RGBPatternManager::SetPattern(nonstd::span pattern) { + ClearPatternInternal(); + + // Set new values + m_patternLength = pattern.size(); + m_pattern = new RGBState[m_patternLength]; + std::copy(pattern.begin(), pattern.end(), m_pattern); + + // Start the task + BaseType_t result = TaskUtils::TaskCreateExpensive(RunPattern, TAG, 4096, this, 1, &m_taskHandle); + if (result != pdPASS) { + ESP_LOGE(TAG, "[pin-%u] Failed to create task: %d", m_rgbPin, result); + + m_taskHandle = nullptr; + + if (m_pattern != nullptr) { + delete[] m_pattern; + m_pattern = nullptr; + } + m_patternLength = 0; + } + + // Give the semaphore back + xSemaphoreGive(m_taskSemaphore); +} + +void RGBPatternManager::ClearPattern() { + ClearPatternInternal(); + xSemaphoreGive(m_taskSemaphore); +} + +void RGBPatternManager::ClearPatternInternal() { + xSemaphoreTake(m_taskSemaphore, portMAX_DELAY); + + if (m_taskHandle != nullptr) { + vTaskDelete(m_taskHandle); + m_taskHandle = nullptr; + } + + if (m_pattern != nullptr) { + delete[] m_pattern; + m_pattern = nullptr; + } + m_patternLength = 0; +} + +// Range: 0-255 +void RGBPatternManager::SetBrightness(std::uint8_t brightness) { + m_rgbBrightness = brightness; +} + +void RGBPatternManager::SendRGB(const RGBState state) { + const std::uint16_t bitCount = (8 * 3) * (1); // 8 bits per color * 3 colors * 1 LED + + rmt_data_t led_data[bitCount]; + + std::uint8_t r = (std::uint8_t)((std::uint16_t)state.red * m_rgbBrightness / 255); + std::uint8_t g = (std::uint8_t)((std::uint16_t)state.green * m_rgbBrightness / 255); + std::uint8_t b = (std::uint8_t)((std::uint16_t)state.blue * m_rgbBrightness / 255); + + std::uint8_t led, col, bit; + std::uint8_t i = 0; + // WS2812B takes commands in GRB order + // https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf - Page 5 + std::uint8_t colors[3] = {g, r, b}; + for (led = 0; led < 1; led++) { + for (col = 0; col < 3; col++) { + for (bit = 0; bit < 8; bit++) { + if ((colors[col] & (1 << (7 - bit)))) { + led_data[i].level0 = 1; + led_data[i].duration0 = 8; + led_data[i].level1 = 0; + led_data[i].duration1 = 4; + } else { + led_data[i].level0 = 1; + led_data[i].duration0 = 4; + led_data[i].level1 = 0; + led_data[i].duration1 = 8; + } + i++; + } + } + } + // Send the data + rmtWriteBlocking(m_rmtHandle, led_data, bitCount); +} + +void RGBPatternManager::RunPattern(void* arg) { + RGBPatternManager* thisPtr = reinterpret_cast(arg); + + RGBPatternManager::RGBState* pattern = thisPtr->m_pattern; + std::size_t patternLength = thisPtr->m_patternLength; + + while (true) { + for (std::size_t i = 0; i < patternLength; ++i) { + thisPtr->SendRGB(pattern[i]); + vTaskDelay(pdMS_TO_TICKS(pattern[i].duration)); + } + } +} diff --git a/src/VisualStateManager.cpp b/src/VisualStateManager.cpp index 6f859c67..1038b28a 100644 --- a/src/VisualStateManager.cpp +++ b/src/VisualStateManager.cpp @@ -1,19 +1,16 @@ #include "VisualStateManager.h" #ifdef OPENSHOCK_LED_GPIO -#ifdef OPENSHOCK_LED_IMPLEMENTATION -#error "Only one LED type can be defined at a time" -#else -#define OPENSHOCK_LED_IMPLEMENTATION #include "PinPatternManager.h" #include +#ifndef OPENSHOCK_LED_IMPLEMENTATION +#define OPENSHOCK_LED_IMPLEMENTATION #endif // OPENSHOCK_LED_IMPLEMENTATION #endif // OPENSHOCK_LED_GPIO #ifdef OPENSHOCK_LED_WS2812B -#ifdef OPENSHOCK_LED_IMPLEMENTATION -#error "Only one LED type can be defined at a time" -#else +#include "RGBPatternManager.h" +#ifndef OPENSHOCK_LED_IMPLEMENTATION #define OPENSHOCK_LED_IMPLEMENTATION #endif // OPENSHOCK_LED_IMPLEMENTATION #endif // OPENSHOCK_LED_WS2812B @@ -30,14 +27,19 @@ const char* const TAG = "VisualStateManager"; -constexpr std::uint64_t kCriticalErrorFlag = 1 << 0; -constexpr std::uint64_t kEmergencyStoppedFlag = 1 << 1; -constexpr std::uint64_t kWebSocketConnectedFlag = 1 << 2; -constexpr std::uint64_t kWiFiConnectedWithoutWSFlag = 1 << 3; -constexpr std::uint64_t kWiFiScanningFlag = 1 << 4; +constexpr std::uint64_t kCriticalErrorFlag = 1 << 0; +constexpr std::uint64_t kEmergencyStoppedFlag = 1 << 1; +constexpr std::uint64_t kEmergencyStopClearedFlag = 1 << 2; +constexpr std::uint64_t kWebSocketConnectedFlag = 1 << 3; +constexpr std::uint64_t kWiFiConnectedFlag = 1 << 4; +constexpr std::uint64_t kWiFiScanningFlag = 1 << 5; static std::uint64_t s_stateFlags = 0; +// Bitmask of when the system is in a "all clear" state. + +constexpr std::uint64_t kStatusOKMask = kWebSocketConnectedFlag | kWiFiConnectedFlag; + using namespace OpenShock; #ifdef OPENSHOCK_LED_GPIO @@ -52,7 +54,14 @@ constexpr PinPatternManager::State kEmergencyStoppedPattern[] = { {false, 500} }; +constexpr PinPatternManager::State kEmergencyStopClearedPattern[] = { + { true, 150}, + {false, 150} +}; + constexpr PinPatternManager::State kWiFiDisconnectedPattern[] = { + { true, 100}, + {false, 100}, { true, 100}, {false, 100}, { true, 100}, @@ -60,8 +69,6 @@ constexpr PinPatternManager::State kWiFiDisconnectedPattern[] = { }; constexpr PinPatternManager::State kWiFiConnectedWithoutWSPattern[] = { - { true, 100}, - {false, 100}, { true, 100}, {false, 100}, { true, 100}, @@ -97,9 +104,21 @@ constexpr PinPatternManager::State kWebSocketConnectedPattern[] = { {false, 10'000} }; +constexpr PinPatternManager::State kSolidOnPattern[] = { + {true, 100'000} +}; + +constexpr PinPatternManager::State kSolidOffPattern[] = { + {false, 100'000} +}; + PinPatternManager s_builtInLedManager(OPENSHOCK_LED_GPIO); -void _updateVisualState() { +void _updateVisualStateGPIO(nonstd::span override) { + s_builtInLedManager.SetPattern(override); +} + +void _updateVisualStateGPIO() { if (s_stateFlags & kCriticalErrorFlag) { s_builtInLedManager.SetPattern(kCriticalErrorPattern); return; @@ -110,12 +129,17 @@ void _updateVisualState() { return; } + if (s_stateFlags & kEmergencyStopClearedFlag) { + s_builtInLedManager.SetPattern(kEmergencyStopClearedPattern); + return; + } + if (s_stateFlags & kWebSocketConnectedFlag) { s_builtInLedManager.SetPattern(kWebSocketConnectedPattern); return; } - if (s_stateFlags & kWiFiConnectedWithoutWSFlag) { + if (s_stateFlags & kWiFiConnectedFlag) { s_builtInLedManager.SetPattern(kWiFiConnectedWithoutWSPattern); return; } @@ -132,24 +156,130 @@ void _updateVisualState() { #ifdef OPENSHOCK_LED_WS2812B -void _updateVisualState() { - ESP_LOGE(TAG, "_updateVisualState: (but WS2812B is not implemented yet)"); +constexpr RGBPatternManager::RGBState kCriticalErrorRGBPattern[] = { + {255, 0, 0, 100}, // Red ON for 0.1 seconds + { 0, 0, 0, 100} // OFF for 0.1 seconds +}; + +constexpr RGBPatternManager::RGBState kEmergencyStoppedRGBPattern[] = { + {255, 0, 0, 500}, + { 0, 0, 0, 500} +}; + +constexpr RGBPatternManager::RGBState kEmergencyStopClearedRGBPattern[] = { + {0, 255, 0, 150}, + {0, 0, 0, 150} +}; + +constexpr RGBPatternManager::RGBState kWiFiDisconnectedRGBPattern[] = { + {0, 0, 255, 100}, + {0, 0, 0, 100}, + {0, 0, 255, 100}, + {0, 0, 0, 100}, + {0, 0, 255, 100}, + {0, 0, 0, 700} +}; + +constexpr RGBPatternManager::RGBState kWiFiConnectedWithoutWSRGBPattern[] = { + {255, 165, 0, 100}, + { 0, 0, 0, 100}, + {255, 165, 0, 100}, + { 0, 0, 0, 700} +}; + +constexpr RGBPatternManager::RGBState kPingNoResponseRGBPattern[] = { + {0, 50, 255, 100}, + {0, 0, 0, 100}, + {0, 50, 255, 100}, + {0, 0, 0, 100}, + {0, 50, 255, 100}, + {0, 0, 0, 100}, + {0, 50, 255, 100}, + {0, 0, 0, 700} +}; + +constexpr RGBPatternManager::RGBState kWebSocketCantConnectRGBPattern[] = { + {255, 0, 0, 100}, + { 0, 0, 0, 100}, + {255, 0, 0, 100}, + { 0, 0, 0, 100}, + {255, 0, 0, 100}, + { 0, 0, 0, 100}, + {255, 0, 0, 100}, + { 0, 0, 0, 100}, + {255, 0, 0, 100}, + { 0, 0, 0, 700} +}; + +constexpr RGBPatternManager::RGBState kWebSocketConnectedRGBPattern[] = { + {0, 255, 0, 100}, + {0, 0, 0, 10'000}, +}; + +RGBPatternManager s_RGBLedManager(OPENSHOCK_LED_WS2812B); + +void _updateVisualStateRGB() { + if (s_stateFlags & kCriticalErrorFlag) { + s_RGBLedManager.SetPattern(kCriticalErrorRGBPattern); + return; + } + + if (s_stateFlags & kEmergencyStoppedFlag) { + s_RGBLedManager.SetPattern(kEmergencyStoppedRGBPattern); + return; + } + + if (s_stateFlags & kEmergencyStopClearedFlag) { + s_RGBLedManager.SetPattern(kEmergencyStopClearedRGBPattern); + return; + } + + if (s_stateFlags & kWebSocketConnectedFlag) { + s_RGBLedManager.SetPattern(kWebSocketConnectedRGBPattern); + return; + } + + if (s_stateFlags & kWiFiConnectedFlag) { + s_RGBLedManager.SetPattern(kWiFiConnectedWithoutWSRGBPattern); + return; + } + + if (s_stateFlags & kWiFiScanningFlag) { + s_RGBLedManager.SetPattern(kPingNoResponseRGBPattern); + return; + } + + s_RGBLedManager.SetPattern(kWiFiDisconnectedRGBPattern); } #endif // OPENSHOCK_LED_WS2812B -#ifndef OPENSHOCK_LED_IMPLEMENTATION - void _updateVisualState() { +#ifdef OPENSHOCK_LED_IMPLEMENTATION +#if defined(OPENSHOCK_LED_GPIO) && defined(OPENSHOCK_LED_WS2812B) + if (s_stateFlags == kStatusOKMask) { + _updateVisualStateGPIO(kSolidOnPattern); + } else { + _updateVisualStateGPIO(kSolidOffPattern); + } + _updateVisualStateRGB(); +#elif defined(OPENSHOCK_LED_GPIO) + _updateVisualStateGPIO(); +#elif defined(OPENSHOCK_LED_WS2812B) + _updateVisualStateRGB(); +#else +#error "No LED implementation selected but OPENSHOCK_LED_IMPLEMENTATION is defined" +#endif +#else ESP_LOGE(TAG, "_updateVisualState: (but no LED implementation is selected)"); + vTaskDelay(10); +#endif } -#endif // OPENSHOCK_LED_NONE - void _handleWiFiConnected(arduino_event_t* event) { std::uint64_t oldState = s_stateFlags; - s_stateFlags |= kWiFiConnectedWithoutWSFlag; + s_stateFlags |= kWiFiConnectedFlag; if (oldState != s_stateFlags) { _updateVisualState(); @@ -158,7 +288,7 @@ void _handleWiFiConnected(arduino_event_t* event) { void _handleWiFiDisconnected(arduino_event_t* event) { std::uint64_t oldState = s_stateFlags; - s_stateFlags &= ~kWiFiConnectedWithoutWSFlag; + s_stateFlags &= ~kWiFiConnectedFlag; if (oldState != s_stateFlags) { _updateVisualState(); @@ -204,13 +334,30 @@ void VisualStateManager::SetScanningStarted() { } } -void VisualStateManager::SetEmergencyStop(bool isStopped) { +void VisualStateManager::SetEmergencyStop(OpenShock::EStopManager::EStopStatus status) { std::uint64_t oldState = s_stateFlags; - if (isStopped) { - s_stateFlags |= kEmergencyStoppedFlag; - } else { - s_stateFlags &= ~kEmergencyStoppedFlag; + switch (status) { + // When there is no EStop currently active. + case OpenShock::EStopManager::EStopStatus::ALL_CLEAR: + s_stateFlags &= ~kEmergencyStoppedFlag; + s_stateFlags &= ~kEmergencyStopClearedFlag; + break; + // EStop has been triggered! + case OpenShock::EStopManager::EStopStatus::ESTOPPED_AND_HELD: + // EStop still active, and user has released the button from the initial trigger. + case OpenShock::EStopManager::EStopStatus::ESTOPPED: + s_stateFlags |= kEmergencyStoppedFlag; + s_stateFlags &= ~kEmergencyStopClearedFlag; + break; + // User has held and cleared the EStop, now we're waiting for them to release the button. + case OpenShock::EStopManager::EStopStatus::ESTOPPED_CLEARED: + s_stateFlags &= ~kEmergencyStoppedFlag; + s_stateFlags |= kEmergencyStopClearedFlag; + break; + default: + ESP_LOGE(TAG, "Unhandled EStop status: %d", status); + break; } if (oldState != s_stateFlags) { From 0e06a44b7607dc9728eb09c8ae5fa15bc1fcee4f Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Sun, 26 Nov 2023 00:48:25 -0800 Subject: [PATCH 008/147] Check if link code is proper length + use numeric input (#124) --- WebUI/src/routes/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WebUI/src/routes/+page.svelte b/WebUI/src/routes/+page.svelte index a00c5251..f76f1658 100644 --- a/WebUI/src/routes/+page.svelte +++ b/WebUI/src/routes/+page.svelte @@ -42,8 +42,8 @@

Account Linking

- - + +
From b693f2aad43e8b1695dc9b601db9c4292ec033e4 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Sun, 26 Nov 2023 10:15:52 +0100 Subject: [PATCH 009/147] Remove loop() behaviour from code (#123) * Remove EStopManager from loop() * Remove WiFiScanManager from loop() * Some more rework of EStopManager * Remove CaptivePortalInstance loop() behaviour --- include/CaptivePortalInstance.h | 7 +- include/EStopManager.h | 3 +- include/util/TaskUtils.h | 26 ++-- include/wifi/WiFiScanManager.h | 4 +- src/CaptivePortal.cpp | 2 - src/CaptivePortalInstance.cpp | 43 +++++-- src/EStopManager.cpp | 65 +++++----- src/main.cpp | 4 +- src/wifi/WiFiScanManager.cpp | 216 ++++++++++++++++++++++---------- 9 files changed, 231 insertions(+), 139 deletions(-) diff --git a/include/CaptivePortalInstance.h b/include/CaptivePortalInstance.h index d0794126..1d0e03a5 100644 --- a/include/CaptivePortalInstance.h +++ b/include/CaptivePortalInstance.h @@ -5,6 +5,9 @@ #include #include +#include +#include + #include namespace OpenShock { @@ -18,9 +21,8 @@ namespace OpenShock { bool broadcastMessageTXT(const char* data, std::size_t len) { return m_socketServer.broadcastTXT(data, len); } bool broadcastMessageBIN(const std::uint8_t* data, std::size_t len) { return m_socketServer.broadcastBIN(data, len); } - void loop() { m_socketServer.loop(); } - private: + static void task(void* arg); void handleWebSocketClientConnected(std::uint8_t socketId); void handleWebSocketClientDisconnected(std::uint8_t socketId); void handleWebSocketClientError(std::uint8_t socketId, std::uint16_t code, const char* message); @@ -29,5 +31,6 @@ namespace OpenShock { AsyncWebServer m_webServer; WebSocketsServer m_socketServer; WebSocketDeFragger m_socketDeFragger; + TaskHandle_t m_taskHandle; }; } // namespace OpenShock diff --git a/include/EStopManager.h b/include/EStopManager.h index 167a7f4c..fd89b4ed 100644 --- a/include/EStopManager.h +++ b/include/EStopManager.h @@ -10,8 +10,7 @@ namespace OpenShock::EStopManager { ESTOPPED_CLEARED // The EStop has been cleared by the user, but we're waiting for the user to release the button (to avoid incidental estops) }; - void Init(); - EStopStatus Update(); + void Init(std::uint16_t updateIntervalMs); bool IsEStopped(); std::int64_t WhenEStopped(); } // namespace OpenShock::EStopManager diff --git a/include/util/TaskUtils.h b/include/util/TaskUtils.h index 381c787a..ca00675d 100644 --- a/include/util/TaskUtils.h +++ b/include/util/TaskUtils.h @@ -4,24 +4,22 @@ #include namespace OpenShock::TaskUtils { + /// @brief Create a task on the specified core, or the default core if the specified core is invalid + inline esp_err_t TaskCreateUniversal(TaskFunction_t pvTaskCode, const char* const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pvCreatedTask, const BaseType_t xCoreID) { +#ifndef CONFIG_FREERTOS_UNICORE + if (xCoreID >= 0 && xCoreID < portNUM_PROCESSORS) { + return xTaskCreatePinnedToCore(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, xCoreID); + } +#endif + return xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask); + } + /// @brief Create a task on the core that does expensive work, this should not run on the core that handles WiFi - /// @param pvTaskCode - /// @param pcName - /// @param usStackDepth - /// @param pvParameters - /// @param uxPriority - /// @param pvCreatedTask - /// @return inline esp_err_t TaskCreateExpensive(TaskFunction_t pvTaskCode, const char* const pcName, const uint32_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pvCreatedTask) { -#if portNUM_PROCESSORS == 2 - // Run on core 1 (0 handles WiFi and should be minimally used) - return xTaskCreatePinnedToCore(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, 1); -#else #if portNUM_PROCESSORS > 2 #warning "This chip has more than 2 cores. Please update this code to use the correct core." #endif - // Run on any core - return xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask); -#endif + // Run on core 1 (0 handles WiFi and should be minimally used) + return TaskCreateUniversal(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, 1); } } // namespace OpenShock diff --git a/include/wifi/WiFiScanManager.h b/include/wifi/WiFiScanManager.h index ff165444..908342b8 100644 --- a/include/wifi/WiFiScanManager.h +++ b/include/wifi/WiFiScanManager.h @@ -13,7 +13,7 @@ namespace OpenShock::WiFiScanManager { bool IsScanning(); bool StartScan(); - void AbortScan(); + bool AbortScan(); typedef std::function StatusChangedHandler; typedef std::function NetworkDiscoveryHandler; @@ -23,6 +23,4 @@ namespace OpenShock::WiFiScanManager { std::uint64_t RegisterNetworkDiscoveryHandler(const NetworkDiscoveryHandler& handler); void UnregisterNetworkDiscoveredHandler(std::uint64_t id); - - void Update(); } // namespace OpenShock::WiFiScanManager diff --git a/src/CaptivePortal.cpp b/src/CaptivePortal.cpp index 7422e6c1..54331f9d 100644 --- a/src/CaptivePortal.cpp +++ b/src/CaptivePortal.cpp @@ -119,8 +119,6 @@ void CaptivePortal::Update() { _stopCaptive(); return; } - - s_instance->loop(); } bool CaptivePortal::SendMessageTXT(std::uint8_t socketId, const char* data, std::size_t len) { diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 14229fd8..b474b0f4 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -5,7 +5,7 @@ #include "GatewayConnectionManager.h" #include "Logging.h" #include "serialization/WSLocal.h" - +#include "util/TaskUtils.h" #include "wifi/WiFiManager.h" #include "serialization/_fbs/DeviceToLocalMessage_generated.h" @@ -15,11 +15,12 @@ static const char* TAG = "CaptivePortalInstance"; -constexpr std::uint16_t HTTP_PORT = 80; -constexpr std::uint16_t WEBSOCKET_PORT = 81; -constexpr std::uint32_t WEBSOCKET_PING_INTERVAL = 10'000; -constexpr std::uint32_t WEBSOCKET_PING_TIMEOUT = 1000; -constexpr std::uint8_t WEBSOCKET_PING_RETRIES = 3; +constexpr std::uint16_t HTTP_PORT = 80; +constexpr std::uint16_t WEBSOCKET_PORT = 81; +constexpr std::uint32_t WEBSOCKET_PING_INTERVAL = 10'000; +constexpr std::uint32_t WEBSOCKET_PING_TIMEOUT = 1000; +constexpr std::uint8_t WEBSOCKET_PING_RETRIES = 3; +constexpr std::uint32_t WEBSOCKET_UPDATE_INTERVAL = 10; // 10ms / 100Hz using namespace OpenShock; @@ -64,14 +65,23 @@ bool TryGetFsHash(char (&buffer)[65]) { } CaptivePortalInstance::CaptivePortalInstance() - : m_webServer(HTTP_PORT), m_socketServer(WEBSOCKET_PORT, "/ws", "json"), m_socketDeFragger(std::bind(&CaptivePortalInstance::handleWebSocketEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) { + : m_webServer(HTTP_PORT) + , m_socketServer(WEBSOCKET_PORT, "/ws", "json") + , m_socketDeFragger(std::bind(&CaptivePortalInstance::handleWebSocketEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) + , m_taskHandle(nullptr) { m_socketServer.onEvent(std::bind(&WebSocketDeFragger::handler, &m_socketDeFragger, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); m_socketServer.begin(); m_socketServer.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_PING_RETRIES); // Check if the www folder exists and is populated + bool indexExists = LittleFS.exists("/www/index.html.gz"); + + // Get the hash of the filesystem char fsHash[65]; - if (LittleFS.exists("/www/index.html.gz") && TryGetFsHash(fsHash)) { + bool gotFsHash = TryGetFsHash(fsHash); + + bool fsOk = indexExists && gotFsHash; + if (fsOk) { ESP_LOGI(TAG, "Serving files from LittleFS"); ESP_LOGI(TAG, "Filesystem hash: %s", fsHash); @@ -91,13 +101,30 @@ CaptivePortalInstance::CaptivePortalInstance() } m_webServer.begin(); + + if (fsOk) { + if (TaskUtils::TaskCreateExpensive(CaptivePortalInstance::task, TAG, 8192, this, 1, &m_taskHandle) != pdPASS) { + ESP_LOGE(TAG, "Failed to create task"); + } + } } CaptivePortalInstance::~CaptivePortalInstance() { + vTaskDelete(m_taskHandle); + m_webServer.end(); m_socketServer.close(); } +void CaptivePortalInstance::task(void* arg) { + CaptivePortalInstance* instance = reinterpret_cast(arg); + + while (true) { + instance->m_socketServer.loop(); + vTaskDelay(pdMS_TO_TICKS(WEBSOCKET_UPDATE_INTERVAL)); + } +} + void CaptivePortalInstance::handleWebSocketClientConnected(std::uint8_t socketId) { ESP_LOGD(TAG, "WebSocket client #%u connected from %s", socketId, m_socketServer.remoteIP(socketId).toString().c_str()); diff --git a/src/EStopManager.cpp b/src/EStopManager.cpp index 49d85252..2e573375 100644 --- a/src/EStopManager.cpp +++ b/src/EStopManager.cpp @@ -14,44 +14,14 @@ static EStopManager::EStopStatus s_estopStatus = EStopManager::EStopStatus::AL static std::uint32_t s_estopHoldToClearTime = 5000; static std::int64_t s_lastEStopButtonStateChange = 0; static std::int64_t s_estoppedAt = 0; -static bool s_lastEStopButtonState = HIGH; +static int s_lastEStopButtonState = HIGH; static std::uint8_t s_estopPin; -// TODO?: Allow active HIGH EStops? -void EStopManager::Init() { -#ifdef OPENSHOCK_ESTOP_PIN - s_estopPin = OPENSHOCK_ESTOP_PIN; - pinMode(s_estopPin, INPUT_PULLUP); - ESP_LOGI(TAG, "Initializing on pin %u", s_estopPin); -#else - ESP_LOGI(TAG, "EStopManager disabled, no pin defined"); -#endif -} - -bool EStopManager::IsEStopped() { -#ifdef OPENSHOCK_ESTOP_PIN - return (s_estopStatus != EStopManager::EStopStatus::ALL_CLEAR); -#else - return false; -#endif -} - -std::int64_t EStopManager::WhenEStopped() { -#ifdef OPENSHOCK_ESTOP_PIN - if (IsEStopped()) { - return s_estoppedAt; - } else { - return 0; - } -#else - return 0; -#endif -} +void _estopManagerTask(TimerHandle_t xTimer) { + configASSERT(xTimer); -EStopManager::EStopStatus EStopManager::Update() { -#ifdef OPENSHOCK_ESTOP_PIN - bool buttonState = digitalRead(s_estopPin); + int buttonState = digitalRead(s_estopPin); if (buttonState != s_lastEStopButtonState) { s_lastEStopButtonStateChange = OpenShock::millis(); } @@ -93,9 +63,32 @@ EStopManager::EStopStatus EStopManager::Update() { } s_lastEStopButtonState = buttonState; +} + +// TODO?: Allow active HIGH EStops? +void EStopManager::Init(std::uint16_t updateIntervalMs) { +#ifdef OPENSHOCK_ESTOP_PIN + s_estopPin = OPENSHOCK_ESTOP_PIN; + pinMode(s_estopPin, INPUT_PULLUP); + ESP_LOGI(TAG, "Initializing on pin %u", s_estopPin); - return s_estopStatus; + // Start the repeating task, 10Hz may seem slow, but it's plenty fast for an EStop + if (xTimerCreate(TAG, pdMS_TO_TICKS(updateIntervalMs), pdTRUE, nullptr, _estopManagerTask) == nullptr) { + ESP_LOGE(TAG, "Failed to create timer"); + } #else - return EStopManager::EStopStatus::ALL_CLEAR; + ESP_LOGI(TAG, "EStopManager disabled, no pin defined"); #endif } + +bool EStopManager::IsEStopped() { + return (s_estopStatus != EStopManager::EStopStatus::ALL_CLEAR); +} + +std::int64_t EStopManager::WhenEStopped() { + if (IsEStopped()) { + return s_estoppedAt; + } + + return 0; +} diff --git a/src/main.cpp b/src/main.cpp index 5a7c0a56..bed426f6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,7 +31,7 @@ void setup() { OpenShock::SerialInputHandler::PrintWelcomeHeader(); OpenShock::SerialInputHandler::PrintVersionInfo(); - OpenShock::EStopManager::Init(); + OpenShock::EStopManager::Init(100); // 100ms update interval OpenShock::Config::Init(); @@ -52,7 +52,5 @@ void loop() { OpenShock::SerialInputHandler::Update(); OpenShock::CaptivePortal::Update(); OpenShock::GatewayConnectionManager::Update(); - OpenShock::WiFiScanManager::Update(); OpenShock::WiFiManager::Update(); - OpenShock::EStopManager::Update(); } diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index dbf3502a..e8562c5d 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -10,77 +10,139 @@ const char* const TAG = "WiFiScanManager"; constexpr const std::uint8_t OPENSHOCK_WIFI_SCAN_MAX_CHANNEL = 13; constexpr const std::uint32_t OPENSHOCK_WIFI_SCAN_MAX_MS_PER_CHANNEL = 300; // Adjusting this value will affect the scan rate, but may also affect the scan results +constexpr const std::uint32_t OPENSHOCK_WIFI_SCAN_TIMEOUT_MS = 10 * 1000; + +enum WiFiScanTaskNotificationFlags { + CHANNEL_DONE = 1 << 0, + ERROR = 1 << 1, + WIFI_DISABLED = 1 << 2, + CLEAR_FLAGS = CHANNEL_DONE | ERROR +}; using namespace OpenShock; -static bool s_initialized = false; -static bool s_scanInProgress = false; -static bool s_channelScanDone = false; -static bool s_scanAborted = false; +static TaskHandle_t s_scanTaskHandle = nullptr; +static SemaphoreHandle_t s_scanTaskMutex = xSemaphoreCreateBinary(); static std::uint8_t s_currentChannel = 0; static std::map s_statusChangedHandlers; static std::map s_networkDiscoveredHandlers; -void _setScanInProgress(bool inProgress) { - if (s_scanInProgress != inProgress) { - s_scanInProgress = inProgress; - if (inProgress) { - for (auto& it : s_statusChangedHandlers) { - it.second(WiFiScanStatus::Started); - it.second(WiFiScanStatus::InProgress); - } - WiFi.scanDelete(); - } else { - WiFiScanStatus status; - if (s_scanAborted) { - status = WiFiScanStatus::Aborted; - s_scanAborted = false; - } else { - status = WiFiScanStatus::Completed; - } - for (auto& it : s_statusChangedHandlers) { - it.second(status); - } - } +bool _notifyTask(WiFiScanTaskNotificationFlags flags) { + if (xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY) != pdTRUE) { + ESP_LOGE(TAG, "Failed to take scan task mutex"); + return false; } - if (!inProgress) { - s_currentChannel = 0; - s_channelScanDone = false; + bool success = false; + + if (s_scanTaskHandle != nullptr) { + success = xTaskNotify(s_scanTaskHandle, flags, eSetBits) == pdPASS; + } + + xSemaphoreGive(s_scanTaskMutex); + + return success; +} + +void _notifyStatusChangedHandlers(OpenShock::WiFiScanStatus status) { + for (auto& it : s_statusChangedHandlers) { + it.second(status); } } void _handleScanError(std::int16_t retval) { - s_channelScanDone = true; + _notifyTask(WiFiScanTaskNotificationFlags::ERROR); if (retval == WIFI_SCAN_FAILED) { ESP_LOGE(TAG, "Failed to start scan on channel %u", s_currentChannel); - for (auto& it : s_statusChangedHandlers) { - it.second(WiFiScanStatus::Error); - } + return; + } + + if (retval == WIFI_SCAN_RUNNING) { + ESP_LOGE(TAG, "Scan is running on channel %u", s_currentChannel); return; } ESP_LOGE(TAG, "Scan returned an unknown error"); } -void _iterateChannel() { - if (s_currentChannel-- <= 1) { - s_currentChannel = 0; - _setScanInProgress(false); - return; +std::int16_t _scanChannel(std::uint8_t channel) { + std::int16_t retval = WiFi.scanNetworks(true, true, false, OPENSHOCK_WIFI_SCAN_MAX_MS_PER_CHANNEL, channel); + if (retval == WIFI_SCAN_RUNNING || retval >= 0) { + return retval; } - s_channelScanDone = false; + _handleScanError(retval); - std::int16_t retval = WiFi.scanNetworks(true, true, false, OPENSHOCK_WIFI_SCAN_MAX_MS_PER_CHANNEL, s_currentChannel); + return retval; +} - if (retval == WIFI_SCAN_RUNNING) { - _setScanInProgress(true); - return; +WiFiScanStatus _scanningTaskImpl() { + WiFi.enableSTA(true); + WiFi.scanDelete(); + + std::uint8_t channel = OPENSHOCK_WIFI_SCAN_MAX_CHANNEL; + + std::int16_t retval = _scanChannel(channel); + if (retval != WIFI_SCAN_RUNNING) { + // TODO: Handle this + return WiFiScanStatus::Error; } - _handleScanError(retval); + _notifyStatusChangedHandlers(WiFiScanStatus::Started); + _notifyStatusChangedHandlers(WiFiScanStatus::InProgress); + + while (true) { + std::uint32_t notificationFlags = 0; + + // Wait for the scan to complete + if (xTaskNotifyWait(0, WiFiScanTaskNotificationFlags::CLEAR_FLAGS, ¬ificationFlags, pdMS_TO_TICKS(OPENSHOCK_WIFI_SCAN_TIMEOUT_MS)) != pdTRUE) { + ESP_LOGE(TAG, "Scan timed out"); + return WiFiScanStatus::Error; // TODO: Add a "timed out" status + } + + if (notificationFlags != WiFiScanTaskNotificationFlags::CHANNEL_DONE) { + if (notificationFlags & WiFiScanTaskNotificationFlags::WIFI_DISABLED) { + ESP_LOGE(TAG, "Scan task exiting due to being notified that WiFi was disabled"); + return WiFiScanStatus::Aborted; + } + + if (notificationFlags & WiFiScanTaskNotificationFlags::ERROR) { + ESP_LOGE(TAG, "Scan task exiting due to being notified of an error"); + return WiFiScanStatus::Error; + } + + return WiFiScanStatus::Error; + } + + + // Select the next channel, or break if we're done + if (--channel <= 0) { + break; + } + + // Start the scan on the next channel + retval = _scanChannel(channel); + if (retval != WIFI_SCAN_RUNNING) { + // TODO: Handle this + return WiFiScanStatus::Error; + } + } + + return WiFiScanStatus::Completed; +} + +void _scanningTask(void* arg) { + WiFiScanStatus status = _scanningTaskImpl(); + _notifyStatusChangedHandlers(status); + + // Clear the task handle + xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY); + s_scanTaskHandle = nullptr; + xSemaphoreGive(s_scanTaskMutex); + + // Commit suicide + vTaskDelete(nullptr); } void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { @@ -102,50 +164,74 @@ void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { } } - s_channelScanDone = true; + // Notify the scan task that we're done + _notifyTask(WiFiScanTaskNotificationFlags::CHANNEL_DONE); } void _evSTAStopped(arduino_event_id_t event, arduino_event_info_t info) { - _setScanInProgress(false); + _notifyTask(WiFiScanTaskNotificationFlags::WIFI_DISABLED); } bool WiFiScanManager::Init() { - if (s_initialized) { - ESP_LOGW(TAG, "WiFiScanManager::Init() called twice"); + // Initialize the scan semaphore + if (xSemaphoreGive(s_scanTaskMutex) != pdTRUE) { + ESP_LOGE(TAG, "Initialize function called more than once"); return false; } WiFi.onEvent(_evScanCompleted, ARDUINO_EVENT_WIFI_SCAN_DONE); WiFi.onEvent(_evSTAStopped, ARDUINO_EVENT_WIFI_STA_STOP); - s_initialized = true; - return true; } bool WiFiScanManager::IsScanning() { - return s_scanInProgress; + return s_scanTaskHandle != nullptr; } bool WiFiScanManager::StartScan() { - if (s_scanInProgress) { - ESP_LOGW(TAG, "Cannot start scan: scan is already in progress"); + xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY); + + // Check if a scan is already in progress + if (s_scanTaskHandle != nullptr && eTaskGetState(s_scanTaskHandle) != eDeleted) { + ESP_LOGW(TAG, "Cannot start scan: scan task is already running"); + + xSemaphoreGive(s_scanTaskMutex); return false; } - WiFi.enableSTA(true); - s_currentChannel = OPENSHOCK_WIFI_SCAN_MAX_CHANNEL; - _iterateChannel(); + // Start the scan task + if (xTaskCreate(_scanningTask, "WiFiScanManager", 4096, nullptr, 1, &s_scanTaskHandle) != pdPASS) { + ESP_LOGE(TAG, "Failed to create scan task"); + + xSemaphoreGive(s_scanTaskMutex); + return false; + } + xSemaphoreGive(s_scanTaskMutex); return true; } -void WiFiScanManager::AbortScan() { - if (!s_scanInProgress) { - ESP_LOGW(TAG, "Cannot cancel scan: no scan is in progress"); - return; +bool WiFiScanManager::AbortScan() { + xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY); + + // Check if a scan is in progress + if (s_scanTaskHandle == nullptr || eTaskGetState(s_scanTaskHandle) == eDeleted) { + ESP_LOGW(TAG, "Cannot abort scan: no scan is in progress"); + + xSemaphoreGive(s_scanTaskMutex); + return false; } - s_scanAborted = true; - s_currentChannel = 0; + // Kill the task + vTaskDelete(s_scanTaskHandle); + s_scanTaskHandle = nullptr; + + // Inform the change handlers that the scan was aborted + for (auto& it : s_statusChangedHandlers) { + it.second(WiFiScanStatus::Aborted); + } + + xSemaphoreGive(s_scanTaskMutex); + return true; } std::uint64_t WiFiScanManager::RegisterStatusChangedHandler(const WiFiScanManager::StatusChangedHandler& handler) { @@ -175,11 +261,3 @@ void WiFiScanManager::UnregisterNetworkDiscoveredHandler(std::uint64_t handle) { s_networkDiscoveredHandlers.erase(it); } } - -void WiFiScanManager::Update() { - if (!s_initialized) return; - - if (s_scanInProgress && s_channelScanDone) { - _iterateChannel(); - } -} From cef8b64b023fdb8e5cd32b67d268ff5a41533f9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:16:41 +0100 Subject: [PATCH 010/147] build(deps-dev): Bump the npm-dependencies group in /WebUI with 11 updates (#127) * build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 11 updates: | Package | From | To | | --- | --- | --- | | [@skeletonlabs/skeleton](https://github.com/skeletonlabs/skeleton) | `2.5.0` | `2.5.1` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.9.2` | `20.10.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.11.0` | `6.12.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.11.0` | `6.12.0` | | [eslint-plugin-svelte](https://github.com/sveltejs/eslint-plugin-svelte) | `2.35.0` | `2.35.1` | | [prettier-plugin-svelte](https://github.com/sveltejs/prettier-plugin-svelte) | `3.1.0` | `3.1.2` | | [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) | `4.2.5` | `4.2.7` | | [svelte-check](https://github.com/sveltejs/language-tools) | `3.6.0` | `3.6.2` | | [typescript](https://github.com/Microsoft/TypeScript) | `5.2.2` | `5.3.2` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `4.5.0` | `5.0.2` | | [vite-plugin-tailwind-purgecss](https://github.com/AdrianGonz97/vite-plugin-tailwind-purgecss) | `0.1.3` | `0.1.4` | Updates `@skeletonlabs/skeleton` from 2.5.0 to 2.5.1 - [Release notes](https://github.com/skeletonlabs/skeleton/releases) - [Commits](https://github.com/skeletonlabs/skeleton/compare/@skeletonlabs/skeleton@2.5.0...@skeletonlabs/skeleton@2.5.1) Updates `@types/node` from 20.9.2 to 20.10.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.11.0 to 6.12.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.12.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.11.0 to 6.12.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.12.0/packages/parser) Updates `eslint-plugin-svelte` from 2.35.0 to 2.35.1 - [Release notes](https://github.com/sveltejs/eslint-plugin-svelte/releases) - [Changelog](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/eslint-plugin-svelte/compare/v2.35.0...v2.35.1) Updates `prettier-plugin-svelte` from 3.1.0 to 3.1.2 - [Changelog](https://github.com/sveltejs/prettier-plugin-svelte/blob/master/CHANGELOG.md) - [Commits](https://github.com/sveltejs/prettier-plugin-svelte/compare/v3.1.0...v3.1.2) Updates `svelte` from 4.2.5 to 4.2.7 - [Release notes](https://github.com/sveltejs/svelte/releases) - [Changelog](https://github.com/sveltejs/svelte/blob/svelte@4.2.7/packages/svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/svelte/commits/svelte@4.2.7/packages/svelte) Updates `svelte-check` from 3.6.0 to 3.6.2 - [Release notes](https://github.com/sveltejs/language-tools/releases) - [Commits](https://github.com/sveltejs/language-tools/compare/svelte-check-3.6.0...svelte-check-3.6.2) Updates `typescript` from 5.2.2 to 5.3.2 - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.2.2...v5.3.2) Updates `vite` from 4.5.0 to 5.0.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.2/packages/vite) Updates `vite-plugin-tailwind-purgecss` from 0.1.3 to 0.1.4 - [Release notes](https://github.com/AdrianGonz97/vite-plugin-tailwind-purgecss/releases) - [Changelog](https://github.com/AdrianGonz97/vite-plugin-tailwind-purgecss/blob/master/CHANGELOG.md) - [Commits](https://github.com/AdrianGonz97/vite-plugin-tailwind-purgecss/compare/v0.1.3...v0.1.4) --- updated-dependencies: - dependency-name: "@skeletonlabs/skeleton" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: eslint-plugin-svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: prettier-plugin-svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: svelte-check dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-dependencies - dependency-name: vite-plugin-tailwind-purgecss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] * Fix package json --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: hhvrc --- WebUI/.prettierrc | 5 +- WebUI/package-lock.json | 15320 +++++++++++++++++++------------------- WebUI/package.json | 100 +- 3 files changed, 7714 insertions(+), 7711 deletions(-) diff --git a/WebUI/.prettierrc b/WebUI/.prettierrc index fedd4864..b4f0a3d9 100644 --- a/WebUI/.prettierrc +++ b/WebUI/.prettierrc @@ -7,5 +7,8 @@ "printWidth": 256, "plugins": ["prettier-plugin-svelte"], "pluginSearchDirs": ["."], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] + "overrides": [ + { "files": "*.svelte", "options": { "parser": "svelte" } }, + { "files": "package*.json", "options": { "tabWidth": 2, "useTabs": true } } + ] } diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 3284ade6..2b85d643 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -1,7660 +1,7660 @@ -{ - "name": "webui", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "webui", - "version": "0.0.1", - "dependencies": { - "@floating-ui/dom": "1.5.3" - }, - "devDependencies": { - "@playwright/test": "^1.40.0", - "@skeletonlabs/skeleton": "2.5.0", - "@skeletonlabs/tw-plugin": "0.2.4", - "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.6", - "@tailwindcss/forms": "0.5.7", - "@tailwindcss/typography": "0.5.10", - "@types/node": "20.9.2", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", - "autoprefixer": "10.4.16", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.35.0", - "flatbuffers": "^23.5.26", - "npm-check-updates": "^16.14.11", - "postcss": "8.4.31", - "prettier": "^3.1.0", - "prettier-plugin-svelte": "^3.1.0", - "svelte": "^4.2.5", - "svelte-check": "^3.6.0", - "tailwindcss": "3.3.5", - "tslib": "^2.6.2", - "typescript": "^5.2.2", - "vite": "^4.0.0", - "vite-plugin-tailwind-purgecss": "0.1.3", - "vitest": "^0.34.6" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", - "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz", - "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==", - "dev": true, - "dependencies": { - "playwright": "1.40.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", - "dev": true - }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@skeletonlabs/skeleton": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.0.tgz", - "integrity": "sha512-g9b59IkvByM9D/2RfwBXRP1dqTlaz85opqDHEWEDlJ/wPJ2SaUueBXDwuQfO5oLX8BBXQKIGnb/eUr03hnjgjg==", - "dev": true, - "dependencies": { - "esm-env": "1.0.0" - }, - "peerDependencies": { - "svelte": "^3.56.0 || ^4.0.0" - } - }, - "node_modules/@skeletonlabs/tw-plugin": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", - "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", - "dev": true, - "peerDependencies": { - "tailwindcss": ">=3.0.0" - } - }, - "node_modules/@sveltejs/adapter-static": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", - "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", - "dev": true, - "peerDependencies": { - "@sveltejs/kit": "^1.5.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "1.27.6", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", - "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.5.0", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^4.3.1", - "esm-env": "^1.0.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.0", - "mrmime": "^1.0.1", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "~5.26.2" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": "^16.14 || >=18" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", - "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", - "dev": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.3", - "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", - "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.2.0", - "svelte": "^3.54.0 || ^4.0.0", - "vite": "^4.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", - "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", - "dev": true, - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", - "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/pug": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", - "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", - "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/type-utils": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", - "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", - "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.11.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001539", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", - "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", - "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.529", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", - "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz", - "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "debug": "^4.3.1", - "eslint-compat-utils": "^0.1.2", - "esutils": "^2.0.3", - "known-css-properties": "^0.29.0", - "postcss": "^8.4.5", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "semver": "^7.5.3", - "svelte-eslint-parser": ">=0.33.0 <1.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0", - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esm-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "23.5.26", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", - "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==", - "dev": true - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "dependencies": { - "jju": "^1.1.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.3.0" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates": { - "version": "16.14.11", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.11.tgz", - "integrity": "sha512-0MMWGbGci22Pu77bR9jRsy5qgxdQSJVqNtSyyFeubDPtbcU36z4gjEDITu26PMabFWPNkAoVfKF31M3uKUvzFg==", - "dev": true, - "dependencies": { - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/playwright": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz", - "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==", - "dev": true, - "dependencies": { - "playwright-core": "1.40.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz", - "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz", - "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.0.tgz", - "integrity": "sha512-96+AZxs2ESqIFA9j+o+DHqY+BsUglezfl553LQd6VOtTyJq5GPuBEb3ElxF2cerFzKlYKttlH/VcVmRNj5oc3A==", - "dev": true, - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/purgecss": { - "version": "6.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", - "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", - "dev": true, - "dependencies": { - "commander": "^10.0.0", - "glob": "^8.0.3", - "postcss": "^8.4.4", - "postcss-selector-parser": "^6.0.7" - }, - "bin": { - "purgecss": "bin/purgecss.js" - } - }, - "node_modules/purgecss/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/purgecss/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/purgecss/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/purgecss/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "node_modules/sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "dependencies": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/sander/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sorcery": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", - "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0" - }, - "bin": { - "sorcery": "bin/sorcery" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", - "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.5.tgz", - "integrity": "sha512-P9YPKsGkNdw4OJbtpd1uzimQHPj7Ai2sPcOHmmD6VgkFhFDmcYevQi7vE4cQ1g8/Vs64aL2TwMoCNFAzv7TPaQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^3.2.1", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.0.tgz", - "integrity": "sha512-8VfqhfuRJ1sKW+o8isH2kPi0RhjXH1nNsIbCFGyoUHG+ZxVxHYRKcb+S8eaL/1tyj3VGvWYx3Y5+oCUsJgnzcw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^5.1.0", - "typescript": "^5.0.3" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "peerDependencies": { - "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz", - "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "postcss": "^8.4.28", - "postcss-scss": "^4.0.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", - "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/pug": "^2.0.6", - "detect-indent": "^6.1.0", - "magic-string": "^0.27.0", - "sorcery": "^0.11.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">= 14.10.0" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": "^0.55.0", - "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", - "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte-preprocess/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", - "dev": true - }, - "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-tailwind-purgecss": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.3.tgz", - "integrity": "sha512-VVz9fwKBEEFSbj/rKxtwtczvoSrIqbzbo6S+MT7gH0CsmKNwlx947VMoV8B085ocxGCuFlddOPRDszNXLi2nTQ==", - "dev": true, - "dependencies": { - "estree-walker": "^3.0.3", - "purgecss": "6.0.0-alpha.0" - }, - "peerDependencies": { - "vite": "^4.1.1" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} +{ + "name": "webui", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "webui", + "version": "0.0.1", + "dependencies": { + "@floating-ui/dom": "1.5.3" + }, + "devDependencies": { + "@playwright/test": "1.40.0", + "@skeletonlabs/skeleton": "2.5.1", + "@skeletonlabs/tw-plugin": "0.2.4", + "@sveltejs/adapter-static": "2.0.3", + "@sveltejs/kit": "1.27.6", + "@tailwindcss/forms": "0.5.7", + "@tailwindcss/typography": "0.5.10", + "@types/node": "20.10.0", + "@typescript-eslint/eslint-plugin": "6.12.0", + "@typescript-eslint/parser": "6.12.0", + "autoprefixer": "10.4.16", + "eslint": "8.54.0", + "eslint-config-prettier": "9.0.0", + "eslint-plugin-svelte": "2.35.1", + "flatbuffers": "23.5.26", + "npm-check-updates": "16.14.11", + "postcss": "8.4.31", + "prettier": "3.1.0", + "prettier-plugin-svelte": "3.1.2", + "svelte": "4.2.7", + "svelte-check": "3.6.2", + "tailwindcss": "3.3.5", + "tslib": "2.6.2", + "typescript": "5.3.2", + "vite": "^4.0.0", + "vite-plugin-tailwind-purgecss": "0.1.4", + "vitest": "0.34.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", + "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz", + "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==", + "dev": true, + "dependencies": { + "playwright": "1.40.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", + "dev": true + }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@skeletonlabs/skeleton": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.1.tgz", + "integrity": "sha512-llzzKr6PQV1MUsJybdo3Z0SaVwm00KDf8DKhlVTt3X3fbCjIbS9rK6sLzJKZO01L/cQYtAzdVXv9CxALtIuy0w==", + "dev": true, + "dependencies": { + "esm-env": "1.0.0" + }, + "peerDependencies": { + "svelte": "^3.56.0 || ^4.0.0" + } + }, + "node_modules/@skeletonlabs/tw-plugin": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", + "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", + "dev": true, + "peerDependencies": { + "tailwindcss": ">=3.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", + "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^1.5.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "1.27.6", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", + "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.5.0", + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0", + "devalue": "^4.3.1", + "esm-env": "^1.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "mrmime": "^1.0.1", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "~5.26.2" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": "^16.14 || >=18" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", + "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.3", + "svelte-hmr": "^0.15.3", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", + "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", + "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", + "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", + "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pug": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", + "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", + "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/type-utils": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", + "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", + "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.12.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitest/expect": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.6", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", + "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001539", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.529", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", + "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.35.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz", + "integrity": "sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "debug": "^4.3.1", + "eslint-compat-utils": "^0.1.2", + "esutils": "^2.0.3", + "known-css-properties": "^0.29.0", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "semver": "^7.5.3", + "svelte-eslint-parser": ">=0.33.0 <1.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0", + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatbuffers": { + "version": "23.5.26", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", + "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==", + "dev": true + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/fp-and-or": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "dev": true, + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", + "dev": true + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-check-updates": { + "version": "16.14.11", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.11.tgz", + "integrity": "sha512-0MMWGbGci22Pu77bR9jRsy5qgxdQSJVqNtSyyFeubDPtbcU36z4gjEDITu26PMabFWPNkAoVfKF31M3uKUvzFg==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "fast-memoize": "^2.5.2", + "find-up": "5.0.0", + "fp-and-or": "^0.1.4", + "get-stdin": "^8.0.0", + "globby": "^11.0.4", + "hosted-git-info": "^5.1.0", + "ini": "^4.1.1", + "js-yaml": "^4.1.0", + "json-parse-helpfulerror": "^1.0.3", + "jsonlines": "^0.1.1", + "lodash": "^4.17.21", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "p-map": "^4.0.0", + "pacote": "15.2.0", + "parse-github-url": "^1.0.2", + "progress": "^2.0.3", + "prompts-ncu": "^3.0.0", + "rc-config-loader": "^4.1.3", + "remote-git-tags": "^3.0.0", + "rimraf": "^5.0.5", + "semver": "^7.5.4", + "semver-utils": "^1.1.4", + "source-map-support": "^0.5.21", + "spawn-please": "^2.0.2", + "strip-ansi": "^7.1.0", + "strip-json-comments": "^5.0.1", + "untildify": "^4.0.0", + "update-notifier": "^6.0.2" + }, + "bin": { + "ncu": "build/src/bin/cli.js", + "npm-check-updates": "build/src/bin/cli.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/npm-check-updates/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm-check-updates/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-install-checks": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", + "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/playwright": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz", + "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==", + "dev": true, + "dependencies": { + "playwright-core": "1.40.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz", + "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz", + "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.2.tgz", + "integrity": "sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts-ncu": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", + "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", + "dev": true, + "dependencies": { + "kleur": "^4.0.1", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/purgecss": { + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", + "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", + "dev": true, + "dependencies": { + "commander": "^10.0.0", + "glob": "^8.0.3", + "postcss": "^8.4.4", + "postcss-selector-parser": "^6.0.7" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/purgecss/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/purgecss/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/purgecss/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remote-git-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", + "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sirv": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-please": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", + "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.7.tgz", + "integrity": "sha512-UExR1KS7raTdycsUrKLtStayu4hpdV3VZQgM0akX8XbXgLBlosdE/Sf3crOgyh9xIjqSYB3UEBuUlIQKRQX2hg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.2.tgz", + "integrity": "sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.1.0", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz", + "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "postcss": "^8.4.28", + "postcss-scss": "^4.0.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/svelte-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", + "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", + "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", + "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "dev": true + }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-tailwind-purgecss": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.4.tgz", + "integrity": "sha512-iL43Amym6/TWKHcHwCjQl2LLLKhil7WQH7oMtDSOCzINFuKS3STaQrI5SDCl+waqheezv9WmI2gNuIWY+o5hsA==", + "dev": true, + "dependencies": { + "estree-walker": "^3.0.3", + "purgecss": "6.0.0-alpha.0" + }, + "peerDependencies": { + "vite": "^4.1.1" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/WebUI/package.json b/WebUI/package.json index eb7c6a92..303b84df 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -1,50 +1,50 @@ -{ - "name": "webui", - "version": "0.0.1", - "private": true, - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "test": "npm run test:integration && npm run test:unit", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write .", - "test:integration": "playwright test", - "test:unit": "vitest" - }, - "devDependencies": { - "@playwright/test": "^1.40.0", - "@skeletonlabs/skeleton": "2.5.0", - "@skeletonlabs/tw-plugin": "0.2.4", - "@sveltejs/adapter-static": "^2.0.3", - "@sveltejs/kit": "^1.27.6", - "@tailwindcss/forms": "0.5.7", - "@tailwindcss/typography": "0.5.10", - "@types/node": "20.9.2", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", - "autoprefixer": "10.4.16", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.35.0", - "flatbuffers": "^23.5.26", - "npm-check-updates": "^16.14.11", - "postcss": "8.4.31", - "prettier": "^3.1.0", - "prettier-plugin-svelte": "^3.1.0", - "svelte": "^4.2.5", - "svelte-check": "^3.6.0", - "tailwindcss": "3.3.5", - "tslib": "^2.6.2", - "typescript": "^5.2.2", - "vite": "^4.0.0", - "vite-plugin-tailwind-purgecss": "0.1.3", - "vitest": "^0.34.6" - }, - "type": "module", - "dependencies": { - "@floating-ui/dom": "1.5.3" - } -} +{ + "name": "webui", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "test": "npm run test:integration && npm run test:unit", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --plugin-search-dir . --check . && eslint .", + "format": "prettier --plugin-search-dir . --write .", + "test:integration": "playwright test", + "test:unit": "vitest" + }, + "devDependencies": { + "@playwright/test": "1.40.0", + "@skeletonlabs/skeleton": "2.5.1", + "@skeletonlabs/tw-plugin": "0.2.4", + "@sveltejs/adapter-static": "2.0.3", + "@sveltejs/kit": "1.27.6", + "@tailwindcss/forms": "0.5.7", + "@tailwindcss/typography": "0.5.10", + "@types/node": "20.10.0", + "@typescript-eslint/eslint-plugin": "6.12.0", + "@typescript-eslint/parser": "6.12.0", + "autoprefixer": "10.4.16", + "eslint": "8.54.0", + "eslint-config-prettier": "9.0.0", + "eslint-plugin-svelte": "2.35.1", + "flatbuffers": "23.5.26", + "npm-check-updates": "16.14.11", + "postcss": "8.4.31", + "prettier": "3.1.0", + "prettier-plugin-svelte": "3.1.2", + "svelte": "4.2.7", + "svelte-check": "3.6.2", + "tailwindcss": "3.3.5", + "tslib": "2.6.2", + "typescript": "5.3.2", + "vite": "^4.0.0", + "vite-plugin-tailwind-purgecss": "0.1.4", + "vitest": "0.34.6" + }, + "type": "module", + "dependencies": { + "@floating-ui/dom": "1.5.3" + } +} From 1f621b8baa15ea251f7e7a05359464c32ad7bf1e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Mon, 27 Nov 2023 16:02:08 +0100 Subject: [PATCH 011/147] Create codeql.yml (#129) --- .github/workflows/codeql.yml | 95 ++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..6df26ac4 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,95 @@ +name: 'CodeQL' + +on: + push: + branches: ['develop', 'master'] + pull_request: + branches: ['develop'] + schedule: + - cron: '0 6 * * 1' + +env: + NODE_VERSION: 16 + PYTHON_VERSION: 3.12 + OPENSHOCK_API_DOMAIN: api.shocklink.net + # OPENSHOCK_FW_VERSION: + # - If this is branch "master" or "develop", we use "0.0.0-master" or "0.0.0-develop" respectively. + # - All other scenarios we use "0.0.0-unknown", as we cannot guarantee SemVer compliance by accepting any branch name. So this is the safe option. + OPENSHOCK_FW_VERSION: ${{ (contains(fromJSON('["master","develop"]'), github.ref_name) && format('0.0.0-{0}', github.ref_name)) || '0.0.0-unknown' }} + OPENSHOCK_FW_COMMIT: ${{ github.sha }} + +jobs: + get-targets: + uses: ./.github/workflows/get-targets.yml + + analyze-js-py: + name: Analyze JS/PY + runs-on: 'ubuntu-latest' + timeout-minutes: 360 + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ['javascript-typescript', 'python'] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # Build stuff here + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: '/language:${{matrix.language}}' + + analyze-cpp: + name: Analyze C/C++ + runs-on: 'ubuntu-latest' + needs: [get-targets] + timeout-minutes: 360 + permissions: + actions: read + contents: read + security-events: write + + env: + language: 'c-cpp' + + strategy: + fail-fast: false + matrix: + board: ${{ fromJson(needs.get-targets.outputs.board-array) }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ env.language }} + + - uses: ./.github/actions/build-firmware + with: + python-version: ${{ env.PYTHON_VERSION }} + board: ${{ matrix.board }} + skip-checkout: true + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: '/language:${{ env.language }}' From 41199469fadb601984606c2e48736c854adeb8db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 23:17:50 +0000 Subject: [PATCH 012/147] build(deps): Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6df26ac4..902f6c1d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL From c20766527eba093e4040bdd738f88affe5874f92 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Mon, 27 Nov 2023 23:15:38 -0800 Subject: [PATCH 013/147] Add optional (on by default) shocker Keep-Alive (#125) * Add optional (on by default) shocker Keep-Alive! * Move Keep-Alive manager into it's own task * Allow Idle Task to alongside Keep-Alive Task, plus iterator logic fix * Revert RFTransmitter Changes * CommandHandler Keep-Alive * Keep-Alive working in Command Handler Co-Authored-By: hhvrc * Switch to using a queue kill message to avoid panic when deleting a mid-listening queue * Gateway Keep-Alive wording :) * Some cleanup * Mini CommandHandler cleanup * Add keep-alive toggling to Serial commands * Fix USB Serial on OpenShock Core * Revert keep-alive duration used during testing --------- Co-authored-by: hhvrc --- .env | 2 +- .../serialization/configuration/rfconfig.ts | 11 +- include/CommandHandler.h | 3 + include/Config.h | 2 + include/radio/RFTransmitter.h | 2 +- .../serialization/_fbs/ConfigFile_generated.h | 14 +- platformio.ini | 1 + schemas/ConfigFile.fbs | 1 + src/CommandHandler.cpp | 204 +++++++++++++++++- src/Config.cpp | 11 +- src/EStopManager.cpp | 13 +- src/GatewayClient.cpp | 4 +- src/SerialInputHandler.cpp | 60 +++++- src/radio/RFTransmitter.cpp | 24 ++- 14 files changed, 325 insertions(+), 27 deletions(-) diff --git a/.env b/.env index 96573fb6..1d789eee 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ OPENSHOCK_API_DOMAIN=api.shocklink.net OPENSHOCK_FW_VERSION=0.0.0-unknown OPENSHOCK_FW_HOSTNAME=OpenShock -OPENSHOCK_FW_AP_PREFIX=OpenShock- +OPENSHOCK_FW_AP_PREFIX=OpenShock- \ No newline at end of file diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts index ea360ea5..c0ff31a2 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts @@ -15,12 +15,17 @@ txPin():number { return this.bb!.readUint8(this.bb_pos); } +keepaliveEnabled():boolean { + return !!this.bb!.readInt8(this.bb_pos + 1); +} + static sizeOf():number { - return 1; + return 2; } -static createRFConfig(builder:flatbuffers.Builder, tx_pin: number):flatbuffers.Offset { - builder.prep(1, 1); +static createRFConfig(builder:flatbuffers.Builder, tx_pin: number, keepalive_enabled: boolean):flatbuffers.Offset { + builder.prep(1, 2); + builder.writeInt8(Number(Boolean(keepalive_enabled))); builder.writeInt8(tx_pin); return builder.offset(); } diff --git a/include/CommandHandler.h b/include/CommandHandler.h index 7ba2867a..294a0ac1 100644 --- a/include/CommandHandler.h +++ b/include/CommandHandler.h @@ -15,5 +15,8 @@ namespace OpenShock::CommandHandler { SetRfPinResultCode SetRfTxPin(std::uint8_t txPin); std::uint8_t GetRfTxPin(); + bool SetKeepAliveEnabled(bool enabled); + bool SetKeepAlivePaused(bool paused); + bool HandleCommand(ShockerModelType shockerModel, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs); } // namespace OpenShock::CommandHandler diff --git a/include/Config.h b/include/Config.h index bf03bc6c..40349629 100644 --- a/include/Config.h +++ b/include/Config.h @@ -10,6 +10,7 @@ namespace OpenShock::Config { // This is a copy of the flatbuffers schema defined in schemas/ConfigFile.fbs struct RFConfig { std::uint8_t txPin; + bool keepAliveEnabled; }; struct WiFiCredentials { std::uint8_t id; @@ -51,6 +52,7 @@ namespace OpenShock::Config { bool SetBackendConfig(const BackendConfig& config); bool SetRFConfigTxPin(std::uint8_t txPin); + bool SetRFConfigKeepAliveEnabled(bool enabled); std::uint8_t AddWiFiCredentials(const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password); bool TryGetWiFiCredentialsByID(std::uint8_t id, WiFiCredentials& out); diff --git a/include/radio/RFTransmitter.h b/include/radio/RFTransmitter.h index 819a1e2e..50850177 100644 --- a/include/radio/RFTransmitter.h +++ b/include/radio/RFTransmitter.h @@ -22,7 +22,7 @@ namespace OpenShock { inline bool ok() const { return m_rmtHandle != nullptr && m_queueHandle != nullptr && m_taskHandle != nullptr; } - bool SendCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs); + bool SendCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs, bool overwriteExisting = true); void ClearPendingCommands(); private: diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index e5148ba4..3f693163 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -63,6 +63,7 @@ struct BSSID::Traits { FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) RFConfig FLATBUFFERS_FINAL_CLASS { private: uint8_t tx_pin_; + uint8_t keepalive_enabled_; public: struct Traits; @@ -70,16 +71,21 @@ FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) RFConfig FLATBUFFERS_FINAL_CLASS { return "OpenShock.Serialization.Configuration.RFConfig"; } RFConfig() - : tx_pin_(0) { + : tx_pin_(0), + keepalive_enabled_(0) { } - RFConfig(uint8_t _tx_pin) - : tx_pin_(::flatbuffers::EndianScalar(_tx_pin)) { + RFConfig(uint8_t _tx_pin, bool _keepalive_enabled) + : tx_pin_(::flatbuffers::EndianScalar(_tx_pin)), + keepalive_enabled_(::flatbuffers::EndianScalar(static_cast(_keepalive_enabled))) { } uint8_t tx_pin() const { return ::flatbuffers::EndianScalar(tx_pin_); } + bool keepalive_enabled() const { + return ::flatbuffers::EndianScalar(keepalive_enabled_) != 0; + } }; -FLATBUFFERS_STRUCT_END(RFConfig, 1); +FLATBUFFERS_STRUCT_END(RFConfig, 2); struct RFConfig::Traits { using type = RFConfig; diff --git a/platformio.ini b/platformio.ini index d53697e0..4dd98518 100644 --- a/platformio.ini +++ b/platformio.ini @@ -98,6 +98,7 @@ build_flags = -DOPENSHOCK_LED_GPIO=35 -DOPENSHOCK_TX_PIN=15 -DOPENSHOCK_ESTOP_PIN=13 + -DARDUINO_USB_CDC_ON_BOOT=1 ; TODO: ; https://docs.platformio.org/en/latest/boards/espressif32/upesy_wroom.html;upesy-esp32-wroom-devkit diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index 7fe1f346..c13159c1 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -6,6 +6,7 @@ struct BSSID { struct RFConfig { tx_pin:uint8; + keepalive_enabled:bool; } table WiFiCredentials { diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index ecff4559..1c0b4cf2 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -5,30 +5,182 @@ #include "Constants.h" #include "Logging.h" #include "radio/RFTransmitter.h" +#include "Time.h" +#include "util/TaskUtils.h" + +#include +#include +#include #include +#include const char* const TAG = "CommandHandler"; +const std::int64_t KEEP_ALIVE_INTERVAL = 60'000; +const std::uint16_t KEEP_ALIVE_DURATION = 300; + using namespace OpenShock; +template +constexpr T saturate(T value, T min, T max) { + return std::min(std::max(value, min), max); +} +std::uint32_t calculateEepyTime(std::int64_t timeToKeepAlive) { + std::int64_t now = OpenShock::millis(); + return static_cast(saturate(timeToKeepAlive - now, 0LL, KEEP_ALIVE_INTERVAL)); +} + +struct KnownShocker { + ShockerModelType model; + std::uint16_t shockerId; + std::int64_t lastActivityTimestamp; + bool killTask; +}; + +static SemaphoreHandle_t s_rfTransmitterSemaphore = nullptr; static std::unique_ptr s_rfTransmitter = nullptr; +static SemaphoreHandle_t s_keepAliveSemaphore = nullptr; +static QueueHandle_t s_keepAliveQueue = nullptr; +static TaskHandle_t s_keepAliveTaskHandle = nullptr; + +void _keepAliveTask(void* arg) { + std::int64_t timeToKeepAlive = KEEP_ALIVE_INTERVAL; + + // Map of shocker IDs to time of next keep alive + std::unordered_map activityMap; + + while (true) { + // Calculate eepyTime based on the timeToKeepAlive + std::uint32_t eepyTime = calculateEepyTime(timeToKeepAlive); + + KnownShocker cmd; + while (xQueueReceive(s_keepAliveQueue, &cmd, pdMS_TO_TICKS(eepyTime)) == pdTRUE) { + if (cmd.killTask) { + ESP_LOGW(TAG, "Received kill command, exiting keep alive task"); + vTaskDelete(nullptr); + break; // This should never be reached + } + + activityMap[cmd.shockerId] = cmd; + + eepyTime = calculateEepyTime(std::min(timeToKeepAlive, cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL)); + } + + // Update the time to now + std::int64_t now = OpenShock::millis(); + + // Keep track of the minimum activity time, so we know when to wake up + timeToKeepAlive = now + KEEP_ALIVE_INTERVAL; + + // For every entry that has a keep alive time less than now, send a keep alive + for (auto it = activityMap.begin(); it != activityMap.end(); ++it) { + auto& cmd = it->second; + + if (cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL < now) { + ESP_LOGV(TAG, "Sending keep alive for shocker %u", cmd.shockerId); + + if (s_rfTransmitter == nullptr) { + ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring keep alive"); + break; + } + + if (!s_rfTransmitter->SendCommand(cmd.model, cmd.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) { + ESP_LOGW(TAG, "Failed to send keep alive for shocker %u", cmd.shockerId); + } + + cmd.lastActivityTimestamp = now; + } + + timeToKeepAlive = std::min(timeToKeepAlive, cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL); + } + } +} + +bool _internalSetKeepAliveEnabled(bool enabled) { + bool wasEnabled = s_keepAliveQueue != nullptr && s_keepAliveTaskHandle != nullptr; + + if (enabled == wasEnabled) { + ESP_LOGV(TAG, "Keep alive task is already %s", enabled ? "enabled" : "disabled"); + return true; + } + + xSemaphoreTake(s_keepAliveSemaphore, portMAX_DELAY); + + if (enabled) { + ESP_LOGV(TAG, "Enabling keep alive task"); + + s_keepAliveQueue = xQueueCreate(32, sizeof(KnownShocker)); + if (s_keepAliveQueue == nullptr) { + ESP_LOGE(TAG, "Failed to create keep-alive task"); + + xSemaphoreGive(s_keepAliveSemaphore); + return false; + } + + if (TaskUtils::TaskCreateExpensive(_keepAliveTask, "KeepAliveTask", 4096, nullptr, 1, &s_keepAliveTaskHandle) != pdPASS) { + ESP_LOGE(TAG, "Failed to create keep-alive task"); + + vQueueDelete(s_keepAliveQueue); + s_keepAliveQueue = nullptr; + + xSemaphoreGive(s_keepAliveSemaphore); + return false; + } + } else { + ESP_LOGV(TAG, "Disabling keep alive task"); + if (s_keepAliveTaskHandle != nullptr && s_keepAliveQueue != nullptr) { + // Wait for the task to stop + KnownShocker cmd {.killTask = true}; + while (eTaskGetState(s_keepAliveTaskHandle) != eDeleted) { + vTaskDelay(pdMS_TO_TICKS(10)); + + // Send nullptr to stop the task gracefully + xQueueSend(s_keepAliveQueue, &cmd, pdMS_TO_TICKS(10)); + } + vQueueDelete(s_keepAliveQueue); + s_keepAliveQueue = nullptr; + } else { + ESP_LOGW(TAG, "Keep alive task is already disabled? Something might be wrong."); + } + } + + xSemaphoreGive(s_keepAliveSemaphore); + + return true; +} + bool CommandHandler::Init() { - std::uint8_t txPin = Config::GetRFConfig().txPin; + if (s_rfTransmitterSemaphore != nullptr) { + ESP_LOGW(TAG, "RF Transmitter is already initialized"); + return true; + } + + auto& rfConfig = Config::GetRFConfig(); + + std::uint8_t txPin = rfConfig.txPin; if (!OpenShock::IsValidOutputPin(txPin)) { ESP_LOGW(TAG, "Clearing invalid RF TX pin"); Config::SetRFConfigTxPin(Constants::GPIO_INVALID); return false; } + s_rfTransmitterSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive(s_rfTransmitterSemaphore); s_rfTransmitter = std::make_unique(txPin, 32); if (!s_rfTransmitter->ok()) { - ESP_LOGE(TAG, "Failed to initialize RF transmitter"); + ESP_LOGE(TAG, "Failed to initialize RF Transmitter"); s_rfTransmitter = nullptr; return false; } + s_keepAliveSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive(s_keepAliveSemaphore); + if (rfConfig.keepAliveEnabled) { + _internalSetKeepAliveEnabled(true); + } + return true; } @@ -41,6 +193,8 @@ SetRfPinResultCode CommandHandler::SetRfTxPin(std::uint8_t txPin) { return SetRfPinResultCode::InvalidPin; } + xSemaphoreTake(s_rfTransmitterSemaphore, portMAX_DELAY); + if (s_rfTransmitter != nullptr) { ESP_LOGV(TAG, "Destroying existing RF transmitter"); s_rfTransmitter = nullptr; @@ -50,26 +204,56 @@ SetRfPinResultCode CommandHandler::SetRfTxPin(std::uint8_t txPin) { auto rfxmit = std::make_unique(txPin, 32); if (!rfxmit->ok()) { ESP_LOGE(TAG, "Failed to initialize RF transmitter"); + + xSemaphoreGive(s_rfTransmitterSemaphore); return SetRfPinResultCode::InternalError; } if (!Config::SetRFConfigTxPin(txPin)) { ESP_LOGE(TAG, "Failed to set RF TX pin in config"); + + xSemaphoreGive(s_rfTransmitterSemaphore); return SetRfPinResultCode::InternalError; } s_rfTransmitter = std::move(rfxmit); + xSemaphoreGive(s_rfTransmitterSemaphore); return SetRfPinResultCode::Success; } +bool CommandHandler::SetKeepAliveEnabled(bool enabled) { + if (!_internalSetKeepAliveEnabled(enabled)) { + return false; + } + + if (!Config::SetRFConfigKeepAliveEnabled(enabled)) { + ESP_LOGE(TAG, "Failed to set keep alive enabled in config"); + return false; + } + + return true; +} + +bool CommandHandler::SetKeepAlivePaused(bool paused) { + if (!_internalSetKeepAliveEnabled(!paused)) { + return false; + } + + return true; +} + std::uint8_t CommandHandler::GetRfTxPin() { return Config::GetRFConfig().txPin; } bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs) { + xSemaphoreTake(s_rfTransmitterSemaphore, portMAX_DELAY); + if (s_rfTransmitter == nullptr) { ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring command"); + + xSemaphoreGive(s_rfTransmitterSemaphore); return false; } @@ -86,5 +270,19 @@ bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shocker ESP_LOGV(TAG, "Command received: %u %u %u %u", model, shockerId, type, intensity); } - return s_rfTransmitter->SendCommand(model, shockerId, type, intensity, durationMs); + bool ok = s_rfTransmitter->SendCommand(model, shockerId, type, intensity, durationMs); + + xSemaphoreGive(s_rfTransmitterSemaphore); + xSemaphoreTake(s_keepAliveSemaphore, portMAX_DELAY); + + if (ok && s_keepAliveQueue != nullptr) { + KnownShocker cmd {.model = model, .shockerId = shockerId, .lastActivityTimestamp = OpenShock::millis() + durationMs}; + if (xQueueSend(s_keepAliveQueue, &cmd, pdMS_TO_TICKS(10)) != pdTRUE) { + ESP_LOGE(TAG, "Failed to send keep-alive command to queue"); + } + } + + xSemaphoreGive(s_keepAliveSemaphore); + + return ok; } diff --git a/src/Config.cpp b/src/Config.cpp index d34cbfea..58f3703b 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -26,7 +26,8 @@ bool ReadFbsConfig(const Serialization::Configuration::RFConfig* fbsConfig) { } _mainConfig.rf = { - .txPin = fbsConfig->tx_pin(), + .txPin = fbsConfig->tx_pin(), + .keepAliveEnabled = fbsConfig->keepalive_enabled(), }; return true; @@ -207,7 +208,7 @@ bool _trySaveConfig() { // Serialize flatbuffers::FlatBufferBuilder builder(1024); - auto rfConfig = Serialization::Configuration::RFConfig(_rf.txPin); + auto rfConfig = Serialization::Configuration::RFConfig(_rf.txPin, _rf.keepAliveEnabled); std::vector> wifiCredentials; for (const auto& cred : _wifi.credentials) { @@ -251,6 +252,7 @@ void Config::Init() { #else .txPin = Constants::GPIO_INVALID, #endif + .keepAliveEnabled = true, }, .wifi = { .apSsid = "", @@ -333,6 +335,11 @@ bool Config::SetRFConfigTxPin(std::uint8_t txPin) { return _trySaveConfig(); } +bool Config::SetRFConfigKeepAliveEnabled(bool enabled) { + _mainConfig.rf.keepAliveEnabled = enabled; + return _trySaveConfig(); +} + std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password) { std::uint8_t id = 0; diff --git a/src/EStopManager.cpp b/src/EStopManager.cpp index 2e573375..6edb8331 100644 --- a/src/EStopManager.cpp +++ b/src/EStopManager.cpp @@ -1,5 +1,7 @@ #include "EStopManager.h" +#include "CommandHandler.h" +#include "Config.h" #include "Logging.h" #include "Time.h" #include "VisualStateManager.h" @@ -32,6 +34,7 @@ void _estopManagerTask(TimerHandle_t xTimer) { s_estoppedAt = s_lastEStopButtonStateChange; ESP_LOGI(TAG, "Emergency Stopped!!!"); OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); + OpenShock::CommandHandler::SetKeepAlivePaused(true); } break; case EStopManager::EStopStatus::ESTOPPED_AND_HELD: @@ -55,6 +58,7 @@ void _estopManagerTask(TimerHandle_t xTimer) { s_estopStatus = EStopManager::EStopStatus::ALL_CLEAR; ESP_LOGI(TAG, "All clear!"); OpenShock::VisualStateManager::SetEmergencyStop(s_estopStatus); + OpenShock::CommandHandler::SetKeepAlivePaused(false); } break; @@ -73,9 +77,14 @@ void EStopManager::Init(std::uint16_t updateIntervalMs) { ESP_LOGI(TAG, "Initializing on pin %u", s_estopPin); // Start the repeating task, 10Hz may seem slow, but it's plenty fast for an EStop - if (xTimerCreate(TAG, pdMS_TO_TICKS(updateIntervalMs), pdTRUE, nullptr, _estopManagerTask) == nullptr) { - ESP_LOGE(TAG, "Failed to create timer"); + TimerHandle_t timer = xTimerCreate(TAG, pdMS_TO_TICKS(updateIntervalMs), pdTRUE, nullptr, _estopManagerTask); + if (timer == nullptr) { + ESP_LOGE(TAG, "Failed to create timer!!! Triggering EStop."); + s_estopStatus = EStopManager::EStopStatus::ESTOPPED; + } else { + xTimerStart(timer, 0); } + #else ESP_LOGI(TAG, "EStopManager disabled, no pin defined"); #endif diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index 3b5c4e3d..0392a27a 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -1,9 +1,9 @@ #include "GatewayClient.h" -#include "util/CertificateUtils.h" #include "event_handlers/WebSocket.h" #include "Logging.h" #include "Time.h" +#include "util/CertificateUtils.h" #include "serialization/_fbs/DeviceToServerMessage_generated.h" @@ -84,7 +84,7 @@ bool GatewayClient::loop() { } void GatewayClient::_sendKeepAlive() { - ESP_LOGV(TAG, "Sending keep alive message"); + ESP_LOGV(TAG, "Sending Gateway keep-alive message"); // Casting to uint64 here is safe since millis is guaranteed to return a positive value OpenShock::Serialization::KeepAlive keepAlive((std::uint64_t)OpenShock::millis()); diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 3afb59a0..e43886ee 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -3,8 +3,8 @@ #include "CommandHandler.h" #include "Config.h" #include "Logging.h" -#include "wifi/WiFiManager.h" #include "util/JsonRoot.h" +#include "wifi/WiFiManager.h" #include #include @@ -21,6 +21,7 @@ const char* const kCommandRestart = "restart"; const char* const kCommandRmtpin = "rmtpin"; const char* const kCommandAuthToken = "authtoken"; const char* const kCommandNetworks = "networks"; +const char* const kCommandKeepAlive = "keepalive"; const char* const kCommandFactoryReset = "factoryreset"; void _handleHelpCommand(char* arg, std::size_t argLength) { @@ -35,6 +36,8 @@ void _handleHelpCommand(char* arg, std::size_t argLength) { Serial.println("authtoken set auth token"); Serial.println("networks get all saved networks"); Serial.println("networks set all saved networks"); + Serial.println("keepalive get shocker keep-alive status"); + Serial.println("keepalive enable/disable shocker keep-alive"); Serial.println("factoryreset reset device to factory defaults and reboot"); return; } @@ -77,6 +80,19 @@ void _handleHelpCommand(char* arg, std::size_t argLength) { return; } + if (strcmp(arg, kCommandKeepAlive) == 0) { + Serial.println("keepalive"); + Serial.println(" Get the shocker keep-alive status."); + Serial.println(); + Serial.println("keepalive []"); + Serial.println(" Enable/disable shocker keep-alive."); + Serial.println(" Arguments:"); + Serial.println(" must be a boolean."); + Serial.println(" Example:"); + Serial.println(" keepalive true"); + return; + } + if (strcmp(arg, kCommandRestart) == 0) { Serial.println(kCommandRestart); Serial.println(" Restart the board"); @@ -114,6 +130,27 @@ void _handleHelpCommand(char* arg, std::size_t argLength) { Serial.println("Command not found"); } +// Checks if the given argument is a boolean +// Returns 0 if false, 1 if true, 255 if invalid +// Valid inputs: true, false, 1, 0, yes, no, y, n +// Case-insensitive +std::uint8_t _argToBool(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength <= 0) { + return 255; + } + + // Convert to lowercase + std::transform(arg, arg + argLength, arg, ::tolower); + + if (strcmp(arg, "true") == 0 || strcmp(arg, "1") == 0 || strcmp(arg, "yes") == 0 || strcmp(arg, "y") == 0) { + return 1; + } else if (strcmp(arg, "false") == 0 || strcmp(arg, "0") == 0 || strcmp(arg, "no") == 0 || strcmp(arg, "n") == 0) { + return 0; + } else { + return 255; + } +} + void _handleVersionCommand(char* arg, std::size_t argLength) { Serial.print("\n"); SerialInputHandler::PrintVersionInfo(); @@ -263,6 +300,26 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { OpenShock::WiFiManager::RefreshNetworkCredentials(); } +void _handleKeepAliveCommand(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength <= 0) { + // Get keep alive status + Serial.print("$SYS$|Response|KeepAlive|"); + Serial.println(Config::GetRFConfig().keepAliveEnabled ? "true" : "false"); + return; + } + + std::uint8_t enabled = _argToBool(arg, argLength); + + if (enabled == 255) { + Serial.println("$SYS$|Error|Invalid argument (not a boolean)"); + return; + } else { + OpenShock::CommandHandler::SetKeepAliveEnabled(enabled); + } + + Serial.println("$SYS$|Success|Saved config"); +} + static std::unordered_map s_commandHandlers = { { kCommandHelp, _handleHelpCommand}, { kCommandVersion, _handleVersionCommand}, @@ -270,6 +327,7 @@ static std::unordered_map s_commandHa { kCommandRmtpin, _handleRmtpinCommand}, { kCommandAuthToken, _handleAuthtokenCommand}, { kCommandNetworks, _handleNetworksCommand}, + { kCommandKeepAlive, _handleKeepAliveCommand}, {kCommandFactoryReset, _handleFactoryResetCommand}, }; diff --git a/src/radio/RFTransmitter.cpp b/src/radio/RFTransmitter.cpp index 6347e61d..555632f2 100644 --- a/src/radio/RFTransmitter.cpp +++ b/src/radio/RFTransmitter.cpp @@ -16,6 +16,7 @@ struct command_t { std::vector sequence; std::shared_ptr> zeroSequence; std::uint16_t shockerId; + bool overwrite; }; const char* const TAG = "RFTransmitter"; @@ -56,7 +57,7 @@ RFTransmitter::~RFTransmitter() { destroy(); } -bool RFTransmitter::SendCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs) { +bool RFTransmitter::SendCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs, bool overwriteExisting) { if (m_queueHandle == nullptr) { ESP_LOGE(TAG, "[pin-%u] Queue is null", m_txPin); return false; @@ -65,7 +66,7 @@ bool RFTransmitter::SendCommand(ShockerModelType model, std::uint16_t shockerId, // Intensity must be between 0 and 99 intensity = std::min(intensity, (std::uint8_t)99); - command_t* cmd = new command_t {.until = OpenShock::millis() + durationMs, .sequence = Rmt::GetSequence(model, shockerId, type, intensity), .zeroSequence = Rmt::GetZeroSequence(model, shockerId), .shockerId = shockerId}; + command_t* cmd = new command_t {.until = OpenShock::millis() + durationMs, .sequence = Rmt::GetSequence(model, shockerId, type, intensity), .zeroSequence = Rmt::GetZeroSequence(model, shockerId), .shockerId = shockerId, .overwrite = overwriteExisting}; // We will use nullptr commands to end the task, if we got a nullptr here, we are out of memory... :( if (cmd == nullptr) { @@ -153,20 +154,27 @@ void RFTransmitter::TransmitTask(void* arg) { } // Replace the command if it already exists - bool replaced = false; + bool existed = false; for (auto it = commands.begin(); it != commands.end(); ++it) { - if ((*it)->shockerId == cmd->shockerId) { - delete *it; - *it = cmd; + auto& existingCmd = *it; + + if (existingCmd->shockerId == cmd->shockerId) { + existed = true; - replaced = true; + // Only replace the command if it should be overwritten + if (existingCmd->overwrite) { + delete *it; + *it = cmd; + } else { + delete cmd; + } break; } } // If the command was not replaced, add it to the queue - if (!replaced) { + if (!existed) { commands.push_back(cmd); } } From 129ad0b372c158f721b9a970409ffcb4c4412742 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Mon, 27 Nov 2023 23:18:42 -0800 Subject: [PATCH 014/147] Use WiFi.begin() for faster connect if we recognize the cached SSID (#128) * Use WiFi.begin() for faster connect if we recognize the cached SSID * Clean up SSID cache check --------- Co-authored-by: HentaiHeavenVR --- src/wifi/WiFiManager.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index f3fddeee..af72d62d 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -14,6 +14,7 @@ #include +#include #include #include @@ -299,6 +300,16 @@ bool WiFiManager::Init() { WiFi.enableSTA(true); WiFi.setHostname(OPENSHOCK_FW_HOSTNAME); // TODO: Add the device name to the hostname (retrieve from API and store in LittleFS) + // If we recognize the network in the ESP's WiFi cache, try to connect to it + wifi_config_t current_conf; + if (esp_wifi_get_config((wifi_interface_t)ESP_IF_WIFI_STA, ¤t_conf) == ESP_OK) { + if (current_conf.sta.ssid[0] != '\0') { + if (Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(current_conf.sta.ssid)) != 0) { + WiFi.begin(); + } + } + } + return true; } From f4dbc8ce4ea9e72a80bdefd07c8926ec4c4a4b21 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 28 Nov 2023 08:30:42 +0100 Subject: [PATCH 015/147] Reduce concurrent Github jobs (#131) --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 902f6c1d..8ab3c990 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,9 +2,9 @@ name: 'CodeQL' on: push: - branches: ['develop', 'master'] + branches: ['master'] pull_request: - branches: ['develop'] + branches: ['master'] schedule: - cron: '0 6 * * 1' From 3c56492c030a958e7b66341aa9490582541c951c Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 10:36:50 +0100 Subject: [PATCH 016/147] Cleanup & beautify strings and logging * Clean up SerialInputHandler print statements * Raw string literals go BRRR --- src/CaptivePortalInstance.cpp | 10 +- src/SerialInputHandler.cpp | 228 ++++++++++++++++++---------------- 2 files changed, 130 insertions(+), 108 deletions(-) diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index b474b0f4..d0a513ab 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -95,8 +95,14 @@ CaptivePortalInstance::CaptivePortalInstance() request->send( 200, "text/plain", - "You probably forgot to upload the Filesystem with PlatformIO!\nGo to PlatformIO -> Platform -> Upload Filesystem Image!\nIf this happened with a file we provided or you just need help, come to the Discord!\n\ndiscord.gg/openshock" - ); +// Raw string literal (1+ to remove the first newline) +1+R"( +You probably forgot to upload the Filesystem with PlatformIO! +Go to PlatformIO -> Platform -> Upload Filesystem Image! +If this happened with a file we provided or you just need help, come to the Discord! + +discord.gg/openshock +)"); }); } diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index e43886ee..1bd3ef8a 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -13,117 +13,133 @@ const char* const TAG = "SerialInputHandler"; +#define SERPR_SYS(format, ...) Serial.printf("$SYS$|" format "\n", ##__VA_ARGS__) +#define SERPR_RESPONSE(format, ...) SERPR_SYS("Response|" format, ##__VA_ARGS__) +#define SERPR_SUCCESS(format, ...) SERPR_SYS("Success|" format, ##__VA_ARGS__) +#define SERPR_ERROR(format, ...) SERPR_SYS("Error|" format, ##__VA_ARGS__) + using namespace OpenShock; -const char* const kCommandHelp = "help"; -const char* const kCommandVersion = "version"; -const char* const kCommandRestart = "restart"; -const char* const kCommandRmtpin = "rmtpin"; -const char* const kCommandAuthToken = "authtoken"; -const char* const kCommandNetworks = "networks"; -const char* const kCommandKeepAlive = "keepalive"; -const char* const kCommandFactoryReset = "factoryreset"; +#define kCommandHelp "help" +#define kCommandVersion "version" +#define kCommandRestart "restart" +#define kCommandRmtpin "rmtpin" +#define kCommandAuthToken "authtoken" +#define kCommandNetworks "networks" +#define kCommandKeepAlive "keepalive" +#define kCommandFactoryReset "factoryreset" void _handleHelpCommand(char* arg, std::size_t argLength) { SerialInputHandler::PrintWelcomeHeader(); if (arg == nullptr || argLength <= 0) { - Serial.println("help print this menu"); - Serial.println("help print help for a command"); - Serial.println("version print version information"); - Serial.println("restart restart the board"); - Serial.println("rmtpin get radio pin"); - Serial.println("rmtpin set radio pin"); - Serial.println("authtoken set auth token"); - Serial.println("networks get all saved networks"); - Serial.println("networks set all saved networks"); - Serial.println("keepalive get shocker keep-alive status"); - Serial.println("keepalive enable/disable shocker keep-alive"); - Serial.println("factoryreset reset device to factory defaults and reboot"); + // Raw string literal (1+ to remove the first newline) + Serial.print(1+R"( +help print this menu +help print help for a command +version print version information +restart restart the board +rmtpin get radio pin +rmtpin set radio pin +authtoken set auth token +networks get all saved networks +networks set all saved networks +keepalive get shocker keep-alive status +keepalive enable/disable shocker keep-alive +factoryreset reset device to factory defaults and reboot +)"); return; } if (strcmp(arg, kCommandRmtpin) == 0) { - Serial.println("rmtpin"); - Serial.println(" Get the GPIO pin used for the radio transmitter."); + Serial.print(kCommandRmtpin R"( + Get the GPIO pin used for the radio transmitter. Serial.println(); - Serial.println("rmtpin []"); - Serial.println(" Set the GPIO pin used for the radio transmitter."); - Serial.println(" Arguments:"); - Serial.println(" must be a number."); - Serial.println(" Example:"); - Serial.println(" rmtpin 15"); +rmtpin [] + Set the GPIO pin used for the radio transmitter. + Arguments: + must be a number. + Example: + rmtpin 15 +)"); return; } if (strcmp(arg, kCommandAuthToken) == 0) { - Serial.println("authtoken "); - Serial.println(" Set the auth token."); - Serial.println(" Arguments:"); - Serial.println(" must be a string."); - Serial.println(" Example:"); - Serial.println(" authtoken mytoken"); + Serial.print(kCommandAuthToken R"( + Set the auth token. + Arguments: + must be a string. + Example: + authtoken mytoken +)"); return; } if (strcmp(arg, kCommandNetworks) == 0) { - Serial.println("networks"); - Serial.println(" Get all saved networks."); + Serial.print(kCommandNetworks R"( + Get all saved networks. Serial.println(); - Serial.println("networks []"); - Serial.println(" Set all saved networks."); - Serial.println(" Arguments:"); - Serial.println(" must be a array of objects with the following fields:"); - Serial.println(" ssid (string) SSID of the network"); - Serial.println(" password (string) Password of the network"); - Serial.println(" Example:"); - Serial.println(" networks [{\"ssid\":\"myssid\",\"password\":\"mypassword\"}]"); +networks [] + Set all saved networks. + Arguments: + must be a array of objects with the following fields: + ssid (string) SSID of the network + password (string) Password of the network + Example: + networks [{\"ssid\":\"myssid\",\"password\":\"mypassword\"}] +)"); return; } if (strcmp(arg, kCommandKeepAlive) == 0) { - Serial.println("keepalive"); - Serial.println(" Get the shocker keep-alive status."); + Serial.print(kCommandKeepAlive R"( + Get the shocker keep-alive status. Serial.println(); - Serial.println("keepalive []"); - Serial.println(" Enable/disable shocker keep-alive."); - Serial.println(" Arguments:"); - Serial.println(" must be a boolean."); - Serial.println(" Example:"); - Serial.println(" keepalive true"); +keepalive [] + Enable/disable shocker keep-alive. + Arguments: + must be a boolean. + Example: + keepalive true +)"); return; } if (strcmp(arg, kCommandRestart) == 0) { - Serial.println(kCommandRestart); - Serial.println(" Restart the board"); - Serial.println(" Example:"); - Serial.println(" restart"); + Serial.print(kCommandRestart R"( + Restart the board + Example: + restart +)"); return; } if (strcmp(arg, kCommandFactoryReset) == 0) { - Serial.println(kCommandFactoryReset); - Serial.println(" Reset the device to factory defaults and reboot"); - Serial.println(" Example:"); - Serial.println(" factoryreset"); + Serial.print(kCommandFactoryReset R"( + Reset the device to factory defaults and reboot + Example: + factoryreset +)"); return; } if (strcmp(arg, kCommandVersion) == 0) { - Serial.println(kCommandVersion); - Serial.println(" Print version information"); - Serial.println(" Example:"); - Serial.println(" version"); + Serial.print(kCommandVersion R"( + Print version information + Example: + version +)"); return; } if (strcmp(arg, kCommandHelp) == 0) { - Serial.println(kCommandHelp); - Serial.println(" Print help information"); - Serial.println(" Arguments:"); - Serial.println(" (optional) command to print help for"); - Serial.println(" Example:"); - Serial.println(" help"); + Serial.print(kCommandHelp R"( [] + Print help information + Arguments: + (optional) command to print help for + Example: + help +)"); return; } @@ -171,36 +187,35 @@ void _handleFactoryResetCommand(char* arg, std::size_t argLength) { void _handleRmtpinCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { // Get rmt pin - Serial.print("$SYS$|Response|RmtPin|"); - Serial.println(Config::GetRFConfig().txPin); + SERPR_RESPONSE("RmtPin|%u", Config::GetRFConfig().txPin); return; } unsigned int pin; if (sscanf(arg, "%u", &pin) != 1) { - Serial.println("$SYS$|Error|Invalid argument (not a number)"); + SERPR_ERROR("Invalid argument (not a number)"); return; } if (pin > UINT8_MAX) { - Serial.println("$SYS$|Error|Invalid argument (out of range)"); + SERPR_ERROR("Invalid argument (out of range)"); return; } OpenShock::CommandHandler::SetRfTxPin(static_cast(pin)); - Serial.println("$SYS$|Success|Saved config"); + SERPR_SUCCESS("Saved config"); } void _handleAuthtokenCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { - Serial.println("$SYS$|Error|Invalid argument"); + SERPR_ERROR("Invalid argument"); return; } OpenShock::Config::SetBackendAuthToken(std::string(arg, argLength)); - Serial.println("$SYS$|Success|Saved config"); + SERPR_SUCCESS("Saved config"); } void _handleNetworksCommand(char* arg, std::size_t argLength) { @@ -210,14 +225,14 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { root = OpenShock::JsonRoot::CreateArray(); if (!root.isValid()) { - Serial.println("$SYS$|Error|Failed to create JSON array"); + SERPR_ERROR("Failed to create JSON array"); return; } for (auto& creds : Config::GetWiFiCredentials()) { network = cJSON_CreateObject(); if (network == nullptr) { - Serial.println("$SYS$|Error|Failed to create JSON object"); + SERPR_ERROR("Failed to create JSON object"); return; } @@ -229,12 +244,11 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { char* out = cJSON_PrintUnformatted(root); if (out == nullptr) { - Serial.println("$SYS$|Error|Failed to print JSON"); + SERPR_ERROR("Failed to print JSON"); return; } - Serial.print("$SYS$|Response|Networks|"); - Serial.println(out); + SERPR_RESPONSE("Networks|%s", out); cJSON_free(out); return; @@ -242,12 +256,11 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { root = OpenShock::JsonRoot::Parse(arg, argLength); if (!root.isValid()) { - Serial.print("$SYS$|Error|Failed to parse JSON: "); - Serial.println(root.GetErrorMessage()); + SERPR_ERROR("Failed to parse JSON: %s", root.GetErrorMessage()); return; } if (!root.isArray()) { - Serial.println("$SYS$|Error|Invalid argument (not an array)"); + SERPR_ERROR("Invalid argument (not an array)"); return; } @@ -255,7 +268,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { std::vector creds; cJSON_ArrayForEach(network, root) { if (!cJSON_IsObject(network)) { - Serial.println("$SYS$|Error|Invalid argument (array entry is not an object)"); + SERPR_ERROR("Invalid argument (array entry is not an object)"); return; } @@ -263,7 +276,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { const cJSON* password = cJSON_GetObjectItemCaseSensitive(network, "password"); if (!cJSON_IsString(ssid) || !cJSON_IsString(password)) { - Serial.println("$SYS$|Error|Invalid argument (ssid or password is not a string)"); + SERPR_ERROR("Invalid argument (ssid or password is not a string)"); return; } @@ -271,11 +284,11 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { const char* passwordStr = password->valuestring; if (ssidStr == nullptr || passwordStr == nullptr) { - Serial.println("$SYS$|Error|Invalid argument (ssid or password is null)"); + SERPR_ERROR("Invalid argument (ssid or password is null)"); return; } if (ssidStr[0] == '\0' || passwordStr[0] == '\0') { - Serial.println("$SYS$|Error|Invalid argument (ssid or password is empty)"); + SERPR_ERROR("Invalid argument (ssid or password is empty)"); return; } @@ -291,11 +304,11 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { } if (!OpenShock::Config::SetWiFiCredentials(creds)) { - Serial.println("$SYS$|Error|Failed to save config"); + SERPR_ERROR("Failed to save config"); return; } - Serial.println("$SYS$|Success|Saved config"); + SERPR_SUCCESS("Saved config"); OpenShock::WiFiManager::RefreshNetworkCredentials(); } @@ -303,21 +316,20 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { void _handleKeepAliveCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { // Get keep alive status - Serial.print("$SYS$|Response|KeepAlive|"); - Serial.println(Config::GetRFConfig().keepAliveEnabled ? "true" : "false"); + SERPR_RESPONSE("KeepAlive|%s", Config::GetRFConfig().keepAliveEnabled ? "true" : "false"); return; } std::uint8_t enabled = _argToBool(arg, argLength); if (enabled == 255) { - Serial.println("$SYS$|Error|Invalid argument (not a boolean)"); + SERPR_ERROR("Invalid argument (not a boolean)"); return; } else { OpenShock::CommandHandler::SetKeepAliveEnabled(enabled); } - Serial.println("$SYS$|Success|Saved config"); + SERPR_SUCCESS("Saved config"); } static std::unordered_map s_commandHandlers = { @@ -366,7 +378,7 @@ int findLineStart(const char* buffer, int bufferSize, int lineEnd) { void processSerialLine(char* data, std::size_t length) { int delimiter = findChar(data, length, ' '); if (delimiter == 0) { - Serial.println("$SYS$|Error|Command cannot start with a space"); + SERPR_ERROR("Command cannot start with a space"); return; } @@ -438,17 +450,21 @@ void SerialInputHandler::Update() { } void SerialInputHandler::PrintWelcomeHeader() { - Serial.println("\n============== OPENSHOCK =============="); - Serial.println(" Contribute @ github.com/OpenShock"); - Serial.println(" Discuss @ discord.gg/AHcCbXbEcF"); - Serial.println(" Type 'help' for available commands"); - Serial.println("=======================================\n"); + Serial.print(R"( +============== OPENSHOCK ============== + Contribute @ github.com/OpenShock + Discuss @ discord.gg/OpenShock + Type 'help' for available commands +======================================= +)"); } void SerialInputHandler::PrintVersionInfo() { - Serial.println(" Version: " OPENSHOCK_FW_VERSION); - Serial.println(" Build: " OPENSHOCK_FW_MODE); - Serial.println(" Commit: " OPENSHOCK_FW_COMMIT); - Serial.println(" Board: " OPENSHOCK_FW_BOARD); - Serial.println(" Chip: " OPENSHOCK_FW_CHIP); + Serial.print("\ + Version: " OPENSHOCK_FW_VERSION "\n\ + Build: " OPENSHOCK_FW_MODE "\n\ + Commit: " OPENSHOCK_FW_COMMIT "\n\ + Board: " OPENSHOCK_FW_BOARD "\n\ + Chip: " OPENSHOCK_FW_CHIP "\n\ +"); } From 05db2b8b33a21ada19f7169e9159c5a11a443d97 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 12:19:32 +0100 Subject: [PATCH 017/147] Rework config (#134) --- .../configuration/captive-portal-config.ts | 32 ++- .../serialization/configuration/config.ts | 8 +- .../serialization/configuration/rfconfig.ts | 41 ++- include/config/BackendConfig.h | 19 ++ include/config/CaptivePortalConfig.h | 20 ++ include/{ => config}/Config.h | 37 +-- include/config/ConfigBase.h | 19 ++ include/config/RFConfig.h | 18 ++ include/config/RootConfig.h | 24 ++ include/config/WiFiConfig.h | 23 ++ include/config/WiFiCredentials.h | 25 ++ include/config/internal/utils.h | 27 ++ include/http/HTTPRequestManager.h | 10 +- .../serialization/_fbs/ConfigFile_generated.h | 154 +++++++---- include/util/HexUtils.h | 40 ++- include/util/JsonRoot.h | 99 ------- schemas/ConfigFile.fbs | 4 +- src/CaptivePortal.cpp | 2 +- src/CommandHandler.cpp | 2 +- src/EStopManager.cpp | 2 +- src/GatewayConnectionManager.cpp | 2 +- src/SerialInputHandler.cpp | 59 +--- src/config/BackendConfig.cpp | 62 +++++ src/config/CaptivePortalConfig.cpp | 69 +++++ src/{ => config}/Config.cpp | 259 ++++-------------- src/config/RFConfig.cpp | 67 +++++ src/config/RootConfig.cpp | 92 +++++++ src/config/WiFiConfig.cpp | 117 ++++++++ src/config/WiFiCredentials.cpp | 139 ++++++++++ src/event_handlers/WiFiScan.cpp | 2 +- src/main.cpp | 2 +- src/wifi/WiFiManager.cpp | 2 +- 32 files changed, 1016 insertions(+), 462 deletions(-) create mode 100644 include/config/BackendConfig.h create mode 100644 include/config/CaptivePortalConfig.h rename include/{ => config}/Config.h (75%) create mode 100644 include/config/ConfigBase.h create mode 100644 include/config/RFConfig.h create mode 100644 include/config/RootConfig.h create mode 100644 include/config/WiFiConfig.h create mode 100644 include/config/WiFiCredentials.h create mode 100644 include/config/internal/utils.h delete mode 100644 include/util/JsonRoot.h create mode 100644 src/config/BackendConfig.cpp create mode 100644 src/config/CaptivePortalConfig.cpp rename src/{ => config}/Config.cpp (50%) create mode 100644 src/config/RFConfig.cpp create mode 100644 src/config/RootConfig.cpp create mode 100644 src/config/WiFiConfig.cpp create mode 100644 src/config/WiFiCredentials.cpp diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts index d9134e50..5c8b161c 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts @@ -11,18 +11,36 @@ export class CaptivePortalConfig { return this; } +static getRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { + return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + alwaysEnabled():boolean { - return !!this.bb!.readInt8(this.bb_pos); + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; } -static sizeOf():number { - return 1; +static startCaptivePortalConfig(builder:flatbuffers.Builder) { + builder.startObject(1); } -static createCaptivePortalConfig(builder:flatbuffers.Builder, always_enabled: boolean):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(Number(Boolean(always_enabled))); - return builder.offset(); +static addAlwaysEnabled(builder:flatbuffers.Builder, alwaysEnabled:boolean) { + builder.addFieldInt8(0, +alwaysEnabled, +false); } +static endCaptivePortalConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createCaptivePortalConfig(builder:flatbuffers.Builder, alwaysEnabled:boolean):flatbuffers.Offset { + CaptivePortalConfig.startCaptivePortalConfig(builder); + CaptivePortalConfig.addAlwaysEnabled(builder, alwaysEnabled); + return CaptivePortalConfig.endCaptivePortalConfig(builder); +} } diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts index 36d11e38..f8b88f9b 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts @@ -28,7 +28,7 @@ static getSizePrefixedRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Confi rf(obj?:RFConfig):RFConfig|null { const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? (obj || new RFConfig()).__init(this.bb_pos + offset, this.bb!) : null; + return offset ? (obj || new RFConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } wifi(obj?:WiFiConfig):WiFiConfig|null { @@ -38,7 +38,7 @@ wifi(obj?:WiFiConfig):WiFiConfig|null { captivePortal(obj?:CaptivePortalConfig):CaptivePortalConfig|null { const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? (obj || new CaptivePortalConfig()).__init(this.bb_pos + offset, this.bb!) : null; + return offset ? (obj || new CaptivePortalConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } backend(obj?:BackendConfig):BackendConfig|null { @@ -51,7 +51,7 @@ static startConfig(builder:flatbuffers.Builder) { } static addRf(builder:flatbuffers.Builder, rfOffset:flatbuffers.Offset) { - builder.addFieldStruct(0, rfOffset, 0); + builder.addFieldOffset(0, rfOffset, 0); } static addWifi(builder:flatbuffers.Builder, wifiOffset:flatbuffers.Offset) { @@ -59,7 +59,7 @@ static addWifi(builder:flatbuffers.Builder, wifiOffset:flatbuffers.Offset) { } static addCaptivePortal(builder:flatbuffers.Builder, captivePortalOffset:flatbuffers.Offset) { - builder.addFieldStruct(2, captivePortalOffset, 0); + builder.addFieldOffset(2, captivePortalOffset, 0); } static addBackend(builder:flatbuffers.Builder, backendOffset:flatbuffers.Offset) { diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts index c0ff31a2..8c1e725a 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts @@ -11,23 +11,46 @@ export class RFConfig { return this; } +static getRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { + return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + txPin():number { - return this.bb!.readUint8(this.bb_pos); + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; } keepaliveEnabled():boolean { - return !!this.bb!.readInt8(this.bb_pos + 1); + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; } -static sizeOf():number { - return 2; +static startRFConfig(builder:flatbuffers.Builder) { + builder.startObject(2); } -static createRFConfig(builder:flatbuffers.Builder, tx_pin: number, keepalive_enabled: boolean):flatbuffers.Offset { - builder.prep(1, 2); - builder.writeInt8(Number(Boolean(keepalive_enabled))); - builder.writeInt8(tx_pin); - return builder.offset(); +static addTxPin(builder:flatbuffers.Builder, txPin:number) { + builder.addFieldInt8(0, txPin, 0); } +static addKeepaliveEnabled(builder:flatbuffers.Builder, keepaliveEnabled:boolean) { + builder.addFieldInt8(1, +keepaliveEnabled, +false); +} + +static endRFConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createRFConfig(builder:flatbuffers.Builder, txPin:number, keepaliveEnabled:boolean):flatbuffers.Offset { + RFConfig.startRFConfig(builder); + RFConfig.addTxPin(builder, txPin); + RFConfig.addKeepaliveEnabled(builder, keepaliveEnabled); + return RFConfig.endRFConfig(builder); +} } diff --git a/include/config/BackendConfig.h b/include/config/BackendConfig.h new file mode 100644 index 00000000..3c417fb9 --- /dev/null +++ b/include/config/BackendConfig.h @@ -0,0 +1,19 @@ +#pragma once + +#include "config/ConfigBase.h" + +#include + +namespace OpenShock::Config { + struct BackendConfig : public ConfigBase { + std::string authToken; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::BackendConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/CaptivePortalConfig.h b/include/config/CaptivePortalConfig.h new file mode 100644 index 00000000..ebcd3f60 --- /dev/null +++ b/include/config/CaptivePortalConfig.h @@ -0,0 +1,20 @@ +#pragma once + +#include "config/ConfigBase.h" + +namespace OpenShock::Config { + struct CaptivePortalConfig : public ConfigBase { + CaptivePortalConfig(); + CaptivePortalConfig(bool alwaysEnabled); + + bool alwaysEnabled; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::CaptivePortalConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/Config.h b/include/config/Config.h similarity index 75% rename from include/Config.h rename to include/config/Config.h index 40349629..d821ee2c 100644 --- a/include/Config.h +++ b/include/config/Config.h @@ -1,37 +1,24 @@ #pragma once -#include "serialization/_fbs/ConfigFile_generated.h" +#include "config/BackendConfig.h" +#include "config/CaptivePortalConfig.h" +#include "config/RFConfig.h" +#include "config/WiFiConfig.h" +#include "config/WiFiCredentials.h" #include #include #include namespace OpenShock::Config { - // This is a copy of the flatbuffers schema defined in schemas/ConfigFile.fbs - struct RFConfig { - std::uint8_t txPin; - bool keepAliveEnabled; - }; - struct WiFiCredentials { - std::uint8_t id; - std::string ssid; - std::uint8_t bssid[6]; - std::string password; - }; - struct WiFiConfig { - std::string apSsid; - std::string hostname; - std::vector credentials; - }; - struct CaptivePortalConfig { - bool alwaysEnabled; - }; - struct BackendConfig { - std::string authToken; - }; - void Init(); + /* Get the config file translated to JSON. */ + std::string GetAsJSON(); + + /* Save the config file from JSON. */ + bool SaveFromJSON(const std::string& json); + /** * @brief Resets the config file to the factory default values. * @@ -68,4 +55,6 @@ namespace OpenShock::Config { const std::string& GetBackendAuthToken(); bool SetBackendAuthToken(const std::string& token); bool ClearBackendAuthToken(); + + bool SaveChanges(); } // namespace OpenShock::Config diff --git a/include/config/ConfigBase.h b/include/config/ConfigBase.h new file mode 100644 index 00000000..7133444a --- /dev/null +++ b/include/config/ConfigBase.h @@ -0,0 +1,19 @@ +#pragma once + +#include "serialization/_fbs/ConfigFile_generated.h" + +#include + +namespace OpenShock::Config { + template + struct ConfigBase { + virtual void ToDefault() = 0; + + virtual bool FromFlatbuffers(const T* config) = 0; + virtual flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const = 0; + + virtual bool FromJSON(const cJSON* json) = 0; + virtual cJSON* ToJSON() const = 0; + }; + +} // namespace OpenShock::Config diff --git a/include/config/RFConfig.h b/include/config/RFConfig.h new file mode 100644 index 00000000..85083078 --- /dev/null +++ b/include/config/RFConfig.h @@ -0,0 +1,18 @@ +#pragma once + +#include "config/ConfigBase.h" + +namespace OpenShock::Config { + struct RFConfig : public ConfigBase { + std::uint8_t txPin; + bool keepAliveEnabled; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::RFConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/RootConfig.h b/include/config/RootConfig.h new file mode 100644 index 00000000..68299ed6 --- /dev/null +++ b/include/config/RootConfig.h @@ -0,0 +1,24 @@ +#pragma once + +#include "config/RFConfig.h" +#include "config/WiFiConfig.h" +#include "config/CaptivePortalConfig.h" +#include "config/BackendConfig.h" +#include "config/ConfigBase.h" + +namespace OpenShock::Config { + struct RootConfig : public ConfigBase { + OpenShock::Config::RFConfig rf; + OpenShock::Config::WiFiConfig wifi; + OpenShock::Config::CaptivePortalConfig captivePortal; + OpenShock::Config::BackendConfig backend; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::Config* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/WiFiConfig.h b/include/config/WiFiConfig.h new file mode 100644 index 00000000..46f7add7 --- /dev/null +++ b/include/config/WiFiConfig.h @@ -0,0 +1,23 @@ +#pragma once + +#include "config/WiFiCredentials.h" +#include "config/ConfigBase.h" + +#include +#include + +namespace OpenShock::Config { + struct WiFiConfig : public ConfigBase { + std::string accessPointSSID; + std::string hostname; + std::vector credentialsList; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::WiFiConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/WiFiCredentials.h b/include/config/WiFiCredentials.h new file mode 100644 index 00000000..f4f150b3 --- /dev/null +++ b/include/config/WiFiCredentials.h @@ -0,0 +1,25 @@ +#pragma once + +#include "config/ConfigBase.h" + +#include + +namespace OpenShock::Config { + struct WiFiCredentials : public ConfigBase { + WiFiCredentials(); + WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password); + + std::uint8_t id; + std::string ssid; + std::uint8_t bssid[6]; + std::string password; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::WiFiCredentials* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/internal/utils.h b/include/config/internal/utils.h new file mode 100644 index 00000000..189cd46e --- /dev/null +++ b/include/config/internal/utils.h @@ -0,0 +1,27 @@ +#pragma once + +#include "config/ConfigBase.h" + +#include + +namespace OpenShock::Config::Internal::Utils { + inline void FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr) { + if (fbsStr != nullptr) { + str = fbsStr->c_str(); + } else { + str = defaultStr; + } + } + template // T inherits from ConfigBase + void FromFbsVec(std::vector& vec, const flatbuffers::Vector>* fbsVec) { + vec.clear(); + if (fbsVec != nullptr) { + for (auto fbsItem : *fbsVec) { + T item; + if (item.FromFlatbuffers(fbsItem)) { + vec.push_back(std::move(item)); + } + } + } + } +} // namespace OpenShock::Config::Internal::Utils diff --git a/include/http/HTTPRequestManager.h b/include/http/HTTPRequestManager.h index 93751a3b..820efd34 100644 --- a/include/http/HTTPRequestManager.h +++ b/include/http/HTTPRequestManager.h @@ -1,9 +1,9 @@ #pragma once -#include "util/JsonRoot.h" - #include +#include + #include #include #include @@ -37,8 +37,8 @@ namespace OpenShock::HTTP { return {response.result, response.code, {}}; } - OpenShock::JsonRoot json = OpenShock::JsonRoot::Parse(response.data); - if (!json.isValid()) { + cJSON* json = cJSON_ParseWithLength(response.data.c_str(), response.data.length()); + if (json == nullptr) { return {RequestResult::ParseFailed, response.code, {}}; } @@ -47,6 +47,8 @@ namespace OpenShock::HTTP { return {RequestResult::ParseFailed, response.code, {}}; } + cJSON_Delete(json); + return {response.result, response.code, data}; } } // namespace OpenShock::HTTP diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index 3f693163..c9281c8e 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -20,6 +20,7 @@ namespace Configuration { struct BSSID; struct RFConfig; +struct RFConfigBuilder; struct WiFiCredentials; struct WiFiCredentialsBuilder; @@ -28,6 +29,7 @@ struct WiFiConfig; struct WiFiConfigBuilder; struct CaptivePortalConfig; +struct CaptivePortalConfigBuilder; struct BackendConfig; struct BackendConfigBuilder; @@ -60,60 +62,64 @@ struct BSSID::Traits { using type = BSSID; }; -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) RFConfig FLATBUFFERS_FINAL_CLASS { - private: - uint8_t tx_pin_; - uint8_t keepalive_enabled_; - - public: +struct RFConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef RFConfigBuilder Builder; struct Traits; static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { return "OpenShock.Serialization.Configuration.RFConfig"; } - RFConfig() - : tx_pin_(0), - keepalive_enabled_(0) { - } - RFConfig(uint8_t _tx_pin, bool _keepalive_enabled) - : tx_pin_(::flatbuffers::EndianScalar(_tx_pin)), - keepalive_enabled_(::flatbuffers::EndianScalar(static_cast(_keepalive_enabled))) { - } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TX_PIN = 4, + VT_KEEPALIVE_ENABLED = 6 + }; uint8_t tx_pin() const { - return ::flatbuffers::EndianScalar(tx_pin_); + return GetField(VT_TX_PIN, 0); } bool keepalive_enabled() const { - return ::flatbuffers::EndianScalar(keepalive_enabled_) != 0; + return GetField(VT_KEEPALIVE_ENABLED, 0) != 0; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_TX_PIN, 1) && + VerifyField(verifier, VT_KEEPALIVE_ENABLED, 1) && + verifier.EndTable(); } }; -FLATBUFFERS_STRUCT_END(RFConfig, 2); - -struct RFConfig::Traits { - using type = RFConfig; -}; - -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) CaptivePortalConfig FLATBUFFERS_FINAL_CLASS { - private: - uint8_t always_enabled_; - public: - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.Configuration.CaptivePortalConfig"; +struct RFConfigBuilder { + typedef RFConfig Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_tx_pin(uint8_t tx_pin) { + fbb_.AddElement(RFConfig::VT_TX_PIN, tx_pin, 0); } - CaptivePortalConfig() - : always_enabled_(0) { + void add_keepalive_enabled(bool keepalive_enabled) { + fbb_.AddElement(RFConfig::VT_KEEPALIVE_ENABLED, static_cast(keepalive_enabled), 0); } - CaptivePortalConfig(bool _always_enabled) - : always_enabled_(::flatbuffers::EndianScalar(static_cast(_always_enabled))) { + explicit RFConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); } - bool always_enabled() const { - return ::flatbuffers::EndianScalar(always_enabled_) != 0; + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; } }; -FLATBUFFERS_STRUCT_END(CaptivePortalConfig, 1); -struct CaptivePortalConfig::Traits { - using type = CaptivePortalConfig; +inline ::flatbuffers::Offset CreateRFConfig( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint8_t tx_pin = 0, + bool keepalive_enabled = false) { + RFConfigBuilder builder_(_fbb); + builder_.add_keepalive_enabled(keepalive_enabled); + builder_.add_tx_pin(tx_pin); + return builder_.Finish(); +} + +struct RFConfig::Traits { + using type = RFConfig; + static auto constexpr Create = CreateRFConfig; }; struct WiFiCredentials FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { @@ -303,6 +309,56 @@ inline ::flatbuffers::Offset CreateWiFiConfigDirect( credentials__); } +struct CaptivePortalConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef CaptivePortalConfigBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Configuration.CaptivePortalConfig"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ALWAYS_ENABLED = 4 + }; + bool always_enabled() const { + return GetField(VT_ALWAYS_ENABLED, 0) != 0; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ALWAYS_ENABLED, 1) && + verifier.EndTable(); + } +}; + +struct CaptivePortalConfigBuilder { + typedef CaptivePortalConfig Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_always_enabled(bool always_enabled) { + fbb_.AddElement(CaptivePortalConfig::VT_ALWAYS_ENABLED, static_cast(always_enabled), 0); + } + explicit CaptivePortalConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateCaptivePortalConfig( + ::flatbuffers::FlatBufferBuilder &_fbb, + bool always_enabled = false) { + CaptivePortalConfigBuilder builder_(_fbb); + builder_.add_always_enabled(always_enabled); + return builder_.Finish(); +} + +struct CaptivePortalConfig::Traits { + using type = CaptivePortalConfig; + static auto constexpr Create = CreateCaptivePortalConfig; +}; + struct BackendConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef BackendConfigBuilder Builder; struct Traits; @@ -390,23 +446,25 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_BACKEND = 10 }; const OpenShock::Serialization::Configuration::RFConfig *rf() const { - return GetStruct(VT_RF); + return GetPointer(VT_RF); } const OpenShock::Serialization::Configuration::WiFiConfig *wifi() const { return GetPointer(VT_WIFI); } const OpenShock::Serialization::Configuration::CaptivePortalConfig *captive_portal() const { - return GetStruct(VT_CAPTIVE_PORTAL); + return GetPointer(VT_CAPTIVE_PORTAL); } const OpenShock::Serialization::Configuration::BackendConfig *backend() const { return GetPointer(VT_BACKEND); } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyField(verifier, VT_RF, 1) && + VerifyOffset(verifier, VT_RF) && + verifier.VerifyTable(rf()) && VerifyOffset(verifier, VT_WIFI) && verifier.VerifyTable(wifi()) && - VerifyField(verifier, VT_CAPTIVE_PORTAL, 1) && + VerifyOffset(verifier, VT_CAPTIVE_PORTAL) && + verifier.VerifyTable(captive_portal()) && VerifyOffset(verifier, VT_BACKEND) && verifier.VerifyTable(backend()) && verifier.EndTable(); @@ -417,14 +475,14 @@ struct ConfigBuilder { typedef Config Table; ::flatbuffers::FlatBufferBuilder &fbb_; ::flatbuffers::uoffset_t start_; - void add_rf(const OpenShock::Serialization::Configuration::RFConfig *rf) { - fbb_.AddStruct(Config::VT_RF, rf); + void add_rf(::flatbuffers::Offset rf) { + fbb_.AddOffset(Config::VT_RF, rf); } void add_wifi(::flatbuffers::Offset wifi) { fbb_.AddOffset(Config::VT_WIFI, wifi); } - void add_captive_portal(const OpenShock::Serialization::Configuration::CaptivePortalConfig *captive_portal) { - fbb_.AddStruct(Config::VT_CAPTIVE_PORTAL, captive_portal); + void add_captive_portal(::flatbuffers::Offset captive_portal) { + fbb_.AddOffset(Config::VT_CAPTIVE_PORTAL, captive_portal); } void add_backend(::flatbuffers::Offset backend) { fbb_.AddOffset(Config::VT_BACKEND, backend); @@ -442,9 +500,9 @@ struct ConfigBuilder { inline ::flatbuffers::Offset CreateConfig( ::flatbuffers::FlatBufferBuilder &_fbb, - const OpenShock::Serialization::Configuration::RFConfig *rf = nullptr, + ::flatbuffers::Offset rf = 0, ::flatbuffers::Offset wifi = 0, - const OpenShock::Serialization::Configuration::CaptivePortalConfig *captive_portal = nullptr, + ::flatbuffers::Offset captive_portal = 0, ::flatbuffers::Offset backend = 0) { ConfigBuilder builder_(_fbb); builder_.add_backend(backend); diff --git a/include/util/HexUtils.h b/include/util/HexUtils.h index 8760dedf..ef4d7d0e 100644 --- a/include/util/HexUtils.h +++ b/include/util/HexUtils.h @@ -4,6 +4,7 @@ #include #include +#include namespace OpenShock::HexUtils { /// @brief Converts a single byte to a hex pair, and writes it to the output buffer. @@ -98,19 +99,34 @@ namespace OpenShock::HexUtils { return true; } - /// @brief Converts a hex string to a byte array. - /// @param data The hex string to convert. - /// @param output The output buffer to write to. - /// @return Whether the conversion was successful. - /// @remark To use this you must specify the size of the array in the template parameter. - template - constexpr bool TryParseHexMac(nonstd::span data, nonstd::span output) noexcept { - static_assert((N + 1) % 3 == 0, "Invalid MAC-Style hex string length."); - for (std::size_t i = 0; i < output.size(); ++i) { - if (!TryParseHexPair(data[i * 3], data[i * 3 + 1], output[i])) { - return false; + constexpr std::size_t TryParseHexMac(const char* str, std::size_t strLen, std::uint8_t* out, std::size_t outLen) noexcept { + std::size_t parsedLength = (strLen + 1) / 3; + + if ((parsedLength * 3) - 1 != strLen) { + return 0; // Invalid MAC-Style hex string length. + } + + if (parsedLength > outLen) { + return 0; // Output buffer is too small. + } + + for (std::size_t i = 0; i < parsedLength - 1; ++i) { + if (!TryParseHexPair(str[i * 3], str[i * 3 + 1], out[i])) { + return 0; // Invalid hex pair. + } + if (str[i * 3 + 2] != ':') { + return 0; // Invalid separator. } } - return true; + + if (!TryParseHexPair(str[(parsedLength - 1) * 3], str[(parsedLength - 1) * 3 + 1], out[parsedLength - 1])) { + return 0; // Invalid hex pair. + } + + return parsedLength; + } + + inline std::size_t TryParseHexMac(const char* str, std::uint8_t* out, std::size_t outLen) noexcept { + return TryParseHexMac(str, strlen(str), out, outLen); } } // namespace OpenShock::HexUtils diff --git a/include/util/JsonRoot.h b/include/util/JsonRoot.h deleted file mode 100644 index 9e98bb37..00000000 --- a/include/util/JsonRoot.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include - -#include - -#include -#include - -namespace OpenShock { - class JsonRoot { - JsonRoot(cJSON* root) : _root(root) { } - public: - static JsonRoot Parse(const char* data) { - return JsonRoot(cJSON_Parse(data)); - } - static JsonRoot Parse(const char* data, std::size_t length) { - return JsonRoot(cJSON_ParseWithLength(data, length)); - } - static JsonRoot Parse(const std::string& data) { - return JsonRoot(cJSON_Parse(data.c_str())); - } - static JsonRoot Parse(const String& data) { - return JsonRoot(cJSON_Parse(data.c_str())); - } - static JsonRoot CreateNull() { - return JsonRoot(cJSON_CreateNull()); - } - static JsonRoot CreateObject() { - return JsonRoot(cJSON_CreateObject()); - } - static JsonRoot CreateArray() { - return JsonRoot(cJSON_CreateArray()); - } - - JsonRoot() : _root(nullptr) { } - JsonRoot(JsonRoot&& other) : _root(other._root) { - other._root = nullptr; - } - JsonRoot(const JsonRoot& other) : _root(nullptr) { - if (other._root != nullptr) { - _root = cJSON_Duplicate(other._root, true); - } - } - ~JsonRoot() { - if (_root != nullptr) { - cJSON_Delete(_root); - } - } - - bool isValid() const { - return _root != nullptr; - } - bool isObject() const { - return isValid() && cJSON_IsObject(_root); - } - bool isArray() const { - return isValid() && cJSON_IsArray(_root); - } - - const char* GetErrorMessage() const { - const char* error = cJSON_GetErrorPtr(); - if (error == nullptr) { - return "Unknown error"; - } - - return error; - } - - JsonRoot& operator=(JsonRoot&& other) { - if (this != &other) { - if (_root) { - cJSON_Delete(_root); - } - _root = other._root; - other._root = nullptr; - } - return *this; - } - JsonRoot& operator=(const JsonRoot& other) { - if (this != &other) { - if (_root) { - cJSON_Delete(_root); - } - _root = cJSON_Duplicate(other._root, true); - } - return *this; - } - - cJSON* operator->() const { - return _root; - } - operator cJSON*() const { - return _root; - } - private: - cJSON* _root; - }; -} diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index c13159c1..d17967e5 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -4,7 +4,7 @@ struct BSSID { array:[ubyte:6]; } -struct RFConfig { +table RFConfig { tx_pin:uint8; keepalive_enabled:bool; } @@ -22,7 +22,7 @@ table WiFiConfig { credentials:[WiFiCredentials]; } -struct CaptivePortalConfig { +table CaptivePortalConfig { always_enabled:bool; } diff --git a/src/CaptivePortal.cpp b/src/CaptivePortal.cpp index 54331f9d..ca5605a9 100644 --- a/src/CaptivePortal.cpp +++ b/src/CaptivePortal.cpp @@ -2,7 +2,7 @@ #include "CaptivePortalInstance.h" #include "CommandHandler.h" -#include "Config.h" +#include "config/Config.h" #include "GatewayConnectionManager.h" #include "Logging.h" diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 1c0b4cf2..59509a22 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -1,7 +1,7 @@ #include "CommandHandler.h" #include "Board.h" -#include "Config.h" +#include "config/Config.h" #include "Constants.h" #include "Logging.h" #include "radio/RFTransmitter.h" diff --git a/src/EStopManager.cpp b/src/EStopManager.cpp index 6edb8331..43ea87c1 100644 --- a/src/EStopManager.cpp +++ b/src/EStopManager.cpp @@ -1,7 +1,7 @@ #include "EStopManager.h" #include "CommandHandler.h" -#include "Config.h" +#include "config/Config.h" #include "Logging.h" #include "Time.h" #include "VisualStateManager.h" diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index ff104850..752e3139 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -2,7 +2,7 @@ #include "VisualStateManager.h" -#include "Config.h" +#include "config/Config.h" #include "GatewayClient.h" #include "http/JsonAPI.h" #include "Logging.h" diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 1bd3ef8a..8dbffc7d 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -1,9 +1,8 @@ #include "SerialInputHandler.h" #include "CommandHandler.h" -#include "Config.h" +#include "config/Config.h" #include "Logging.h" -#include "util/JsonRoot.h" #include "wifi/WiFiManager.h" #include @@ -220,24 +219,17 @@ void _handleAuthtokenCommand(char* arg, std::size_t argLength) { void _handleNetworksCommand(char* arg, std::size_t argLength) { cJSON* network = nullptr; - OpenShock::JsonRoot root; + cJSON* root; if (arg == nullptr || argLength <= 0) { - root = OpenShock::JsonRoot::CreateArray(); - if (!root.isValid()) { + root = cJSON_CreateArray(); + if (root == nullptr) { SERPR_ERROR("Failed to create JSON array"); return; } for (auto& creds : Config::GetWiFiCredentials()) { - network = cJSON_CreateObject(); - if (network == nullptr) { - SERPR_ERROR("Failed to create JSON object"); - return; - } - - cJSON_AddStringToObject(network, "ssid", creds.ssid.c_str()); - cJSON_AddStringToObject(network, "password", creds.password.c_str()); + network = creds.ToJSON(); cJSON_AddItemToArray(root, network); } @@ -254,12 +246,13 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - root = OpenShock::JsonRoot::Parse(arg, argLength); - if (!root.isValid()) { - SERPR_ERROR("Failed to parse JSON: %s", root.GetErrorMessage()); + root = cJSON_ParseWithLength(arg, argLength); + if (root == nullptr) { + SERPR_ERROR("Failed to parse JSON: %s", cJSON_GetErrorPtr()); return; } - if (!root.isArray()) { + + if (!cJSON_IsArray(root)) { SERPR_ERROR("Invalid argument (not an array)"); return; } @@ -267,38 +260,14 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { std::uint8_t id = 1; std::vector creds; cJSON_ArrayForEach(network, root) { - if (!cJSON_IsObject(network)) { - SERPR_ERROR("Invalid argument (array entry is not an object)"); - return; - } - - const cJSON* ssid = cJSON_GetObjectItemCaseSensitive(network, "ssid"); - const cJSON* password = cJSON_GetObjectItemCaseSensitive(network, "password"); + Config::WiFiCredentials cred; - if (!cJSON_IsString(ssid) || !cJSON_IsString(password)) { - SERPR_ERROR("Invalid argument (ssid or password is not a string)"); - return; - } - - const char* ssidStr = ssid->valuestring; - const char* passwordStr = password->valuestring; - - if (ssidStr == nullptr || passwordStr == nullptr) { - SERPR_ERROR("Invalid argument (ssid or password is null)"); - return; - } - if (ssidStr[0] == '\0' || passwordStr[0] == '\0') { - SERPR_ERROR("Invalid argument (ssid or password is empty)"); + if (!cred.FromJSON(network)) { + SERPR_ERROR("Failed to parse network"); return; } - Config::WiFiCredentials cred { - .id = id++, - .ssid = ssidStr, - .bssid = {0, 0, 0, 0, 0, 0}, - .password = passwordStr, - }; - ESP_LOGI(TAG, "Adding network to config %s", ssidStr); + ESP_LOGI(TAG, "Adding network to config %s", cred.ssid.c_str()); creds.push_back(std::move(cred)); } diff --git a/src/config/BackendConfig.cpp b/src/config/BackendConfig.cpp new file mode 100644 index 00000000..5867c007 --- /dev/null +++ b/src/config/BackendConfig.cpp @@ -0,0 +1,62 @@ +#include "config/BackendConfig.h" + +#include "config/internal/utils.h" +#include "Logging.h" + +const char* const TAG = "Config::BackendConfig"; + +using namespace OpenShock::Config; + +void BackendConfig::ToDefault() { + authToken = ""; +} + +bool BackendConfig::FromFlatbuffers(const Serialization::Configuration::BackendConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + Internal::Utils::FromFbsStr(authToken, config->auth_token(), ""); + + return true; +} + +flatbuffers::Offset BackendConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + return Serialization::Configuration::CreateBackendConfig(builder, builder.CreateString(authToken)); +} + +bool BackendConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* authTokenJson = cJSON_GetObjectItemCaseSensitive(json, "authToken"); + if (authTokenJson == nullptr) { + ESP_LOGE(TAG, "authToken is null"); + return false; + } + + if (!cJSON_IsString(authTokenJson)) { + ESP_LOGE(TAG, "authToken is not a string"); + return false; + } + + authToken = authTokenJson->valuestring; + + return true; +} + +cJSON* BackendConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddStringToObject(root, "authToken", authToken.c_str()); + + return root; +} diff --git a/src/config/CaptivePortalConfig.cpp b/src/config/CaptivePortalConfig.cpp new file mode 100644 index 00000000..db3f5746 --- /dev/null +++ b/src/config/CaptivePortalConfig.cpp @@ -0,0 +1,69 @@ +#include "config/CaptivePortalConfig.h" + +#include "Logging.h" + +const char* const TAG = "Config::CaptivePortalConfig"; + +using namespace OpenShock::Config; + +CaptivePortalConfig::CaptivePortalConfig() { + ToDefault(); +} + +CaptivePortalConfig::CaptivePortalConfig(bool alwaysEnabled) { + this->alwaysEnabled = alwaysEnabled; +} + +void CaptivePortalConfig::ToDefault() { + alwaysEnabled = false; +} + +bool CaptivePortalConfig::FromFlatbuffers(const Serialization::Configuration::CaptivePortalConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + alwaysEnabled = config->always_enabled(); + + return true; +} + +flatbuffers::Offset CaptivePortalConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + return Serialization::Configuration::CreateCaptivePortalConfig(builder, alwaysEnabled); +} + +bool CaptivePortalConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* alwaysEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "alwaysEnabled"); + if (alwaysEnabledJson == nullptr) { + ESP_LOGE(TAG, "alwaysEnabled is null"); + return false; + } + + if (!cJSON_IsBool(alwaysEnabledJson)) { + ESP_LOGE(TAG, "alwaysEnabled is not a bool"); + return false; + } + + alwaysEnabled = cJSON_IsTrue(alwaysEnabledJson); + + return true; +} + +cJSON* CaptivePortalConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddBoolToObject(root, "alwaysEnabled", alwaysEnabled); + + return root; +} diff --git a/src/Config.cpp b/src/config/Config.cpp similarity index 50% rename from src/Config.cpp rename to src/config/Config.cpp index 58f3703b..e4abcc2c 100644 --- a/src/Config.cpp +++ b/src/config/Config.cpp @@ -1,151 +1,19 @@ -#include "Config.h" +#include "config/Config.h" +#include "config/RootConfig.h" #include "Constants.h" #include "Logging.h" #include "util/HexUtils.h" #include +#include + const char* const TAG = "Config"; using namespace OpenShock; -struct MainConfig { - Config::RFConfig rf; - Config::WiFiConfig wifi; - Config::CaptivePortalConfig captivePortal; - Config::BackendConfig backend; -}; - -static MainConfig _mainConfig; - -bool ReadFbsConfig(const Serialization::Configuration::RFConfig* fbsConfig) { - if (fbsConfig == nullptr) { - ESP_LOGE(TAG, "Config::RF is null"); - return false; - } - - _mainConfig.rf = { - .txPin = fbsConfig->tx_pin(), - .keepAliveEnabled = fbsConfig->keepalive_enabled(), - }; - - return true; -} -bool ReadFbsConfig(const Serialization::Configuration::WiFiConfig* cfg) { - if (cfg == nullptr) { - ESP_LOGE(TAG, "Config::WiFi is null"); - return false; - } - - auto fbsApSsid = cfg->ap_ssid(); - auto fbsHostname = cfg->hostname(); - auto fbsCredsVec = cfg->credentials(); - - if (fbsApSsid == nullptr || fbsHostname == nullptr || fbsCredsVec == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::apSsid, Config::WiFi::hostname or Config::WiFi::credentials is null"); - return false; - } - - std::vector credentials; - credentials.reserve(fbsCredsVec->size()); - - for (auto it = fbsCredsVec->begin(); it != fbsCredsVec->end(); ++it) { - auto fbsCreds = *it; - - if (fbsCreds == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::credentials contains null entry"); - continue; - } - - auto id = fbsCreds->id(); - if (id == 0 || id > 32) { - ESP_LOGE(TAG, "Config::WiFi::credentials entry %u has invalid ID (must be 1-32)", id); - continue; - } - - auto ssid = fbsCreds->ssid(); - if (ssid == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::credentials entry has null SSID"); - continue; - } - - auto bssid = fbsCreds->bssid(); - if (bssid == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::credentials entry has null BSSID"); - continue; - } - - auto password = fbsCreds->password(); - if (password == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::credentials entry has null password"); - continue; - } - - auto bssidArray = bssid->array(); - if (bssidArray == nullptr) { - ESP_LOGE(TAG, "Config::WiFi::credentials entry has null BSSID array"); - continue; - } - - Config::WiFiCredentials creds { - .id = id, - .ssid = ssid->str(), - .password = password->str(), - }; - - std::memcpy(creds.bssid, bssidArray->data(), 6); - - credentials.push_back(std::move(creds)); - } - - _mainConfig.wifi = { - .apSsid = cfg->ap_ssid()->str(), - .hostname = cfg->hostname()->str(), - .credentials = std::move(credentials), - }; - - return true; -} -bool ReadFbsConfig(const Serialization::Configuration::CaptivePortalConfig* cfg) { - if (cfg == nullptr) { - ESP_LOGE(TAG, "Config::CaptivePortal is null"); - return false; - } - - _mainConfig.captivePortal = { - .alwaysEnabled = cfg->always_enabled(), - }; - - return true; -} -bool ReadFbsConfig(const Serialization::Configuration::BackendConfig* cfg) { - if (cfg == nullptr) { - ESP_LOGE(TAG, "Config::Backend is null"); - return false; - } - - auto authToken = cfg->auth_token(); - - if (authToken == nullptr) { - ESP_LOGE(TAG, "Config::Backend::authToken is null"); - return false; - } - - _mainConfig.backend = { - .authToken = authToken->str(), - }; - - return true; -} -bool ReadFbsConfig(const Serialization::Configuration::Config* cfg) { - if (cfg == nullptr) { - ESP_LOGE(TAG, "Config is null"); - return false; - } - - return ReadFbsConfig(cfg->rf()) && ReadFbsConfig(cfg->wifi()) && ReadFbsConfig(cfg->captive_portal()) && ReadFbsConfig(cfg->backend()); -} +Config::RootConfig _mainConfig; bool _tryLoadConfig() { File file = LittleFS.open("/config", "rb"); @@ -186,7 +54,7 @@ bool _tryLoadConfig() { } // Read config - if (!ReadFbsConfig(fbsConfig)) { + if (!_mainConfig.FromFlatbuffers(fbsConfig)) { ESP_LOGE(TAG, "Failed to read config file"); return false; } @@ -208,24 +76,7 @@ bool _trySaveConfig() { // Serialize flatbuffers::FlatBufferBuilder builder(1024); - auto rfConfig = Serialization::Configuration::RFConfig(_rf.txPin, _rf.keepAliveEnabled); - - std::vector> wifiCredentials; - for (const auto& cred : _wifi.credentials) { - auto bssid = Serialization::Configuration::BSSID(cred.bssid); - - wifiCredentials.push_back(Serialization::Configuration::CreateWiFiCredentials(builder, cred.id, builder.CreateString(cred.ssid), &bssid, builder.CreateString(cred.password))); - } - - auto wifiConfig = Serialization::Configuration::CreateWiFiConfig(builder, builder.CreateString(_wifi.apSsid), builder.CreateString(_wifi.hostname), builder.CreateVector(wifiCredentials)); - - auto backendConfig = Serialization::Configuration::CreateBackendConfig(builder, builder.CreateString(""), builder.CreateString(_backend.authToken)); - - auto captivePortalConfig = Serialization::Configuration::CaptivePortalConfig(_captivePortal.alwaysEnabled); - - auto fbsConfig = Serialization::Configuration::CreateConfig(builder, &rfConfig, wifiConfig, &captivePortalConfig, backendConfig); - - builder.Finish(fbsConfig); + builder.Finish(_mainConfig.ToFlatbuffers(builder)); // Write file if (file.write(builder.GetBufferPointer(), builder.GetSize()) != builder.GetSize()) { @@ -245,33 +96,45 @@ void Config::Init() { ESP_LOGW(TAG, "Failed to load config, writing default config"); - _mainConfig = { - .rf = { -#ifdef OPENSHOCK_TX_PIN - .txPin = OPENSHOCK_TX_PIN, -#else - .txPin = Constants::GPIO_INVALID, -#endif - .keepAliveEnabled = true, - }, - .wifi = { - .apSsid = "", - .hostname = "", - .credentials = {}, - }, - .captivePortal = { - .alwaysEnabled = false, - }, - .backend = { - .authToken = "", - }, - }; + _mainConfig.ToDefault(); if (!_trySaveConfig()) { ESP_PANIC(TAG, "Failed to save default config. Recommend formatting microcontroller and re-flashing firmware"); } } +std::string Config::GetAsJSON() { + cJSON* root = _mainConfig.ToJSON(); + + char* json = cJSON_PrintUnformatted(root); + + std::string result(json); + + free(json); + + cJSON_Delete(root); + + return result; +} +bool Config::SaveFromJSON(const std::string& json) { + cJSON* root = cJSON_Parse(json.c_str()); + if (root == nullptr) { + ESP_LOGE(TAG, "Failed to parse JSON: %s", cJSON_GetErrorPtr()); + return false; + } + + bool result = _mainConfig.FromJSON(root); + + cJSON_Delete(root); + + if (!result) { + ESP_LOGE(TAG, "Failed to read JSON"); + return false; + } + + return _trySaveConfig(); +} + void Config::FactoryReset() { if (!LittleFS.remove("/config") && LittleFS.exists("/config")) { ESP_PANIC(TAG, "Failed to remove existing config file for factory reset. Reccomend formatting microcontroller and re-flashing firmware"); @@ -287,7 +150,7 @@ const Config::WiFiConfig& Config::GetWiFiConfig() { } const std::vector& Config::GetWiFiCredentials() { - return _mainConfig.wifi.credentials; + return _mainConfig.wifi.credentialsList; } const Config::CaptivePortalConfig& Config::GetCaptivePortalConfig() { @@ -298,17 +161,17 @@ const Config::BackendConfig& Config::GetBackendConfig() { return _mainConfig.backend; } -bool Config::SetRFConfig(const RFConfig& config) { +bool Config::SetRFConfig(const Config::RFConfig& config) { _mainConfig.rf = config; return _trySaveConfig(); } -bool Config::SetWiFiConfig(const WiFiConfig& config) { +bool Config::SetWiFiConfig(const Config::WiFiConfig& config) { _mainConfig.wifi = config; return _trySaveConfig(); } -bool Config::SetWiFiCredentials(const std::vector& credentials) { +bool Config::SetWiFiCredentials(const std::vector& credentials) { for (auto& cred : credentials) { if (cred.id == 0 || cred.id > 32) { ESP_LOGE(TAG, "Cannot set WiFi credentials: credential ID %u is invalid (must be 1-32)", cred.id); @@ -316,16 +179,16 @@ bool Config::SetWiFiCredentials(const std::vector& credentials) } } - _mainConfig.wifi.credentials = credentials; + _mainConfig.wifi.credentialsList = credentials; return _trySaveConfig(); } -bool Config::SetCaptivePortalConfig(const CaptivePortalConfig& config) { +bool Config::SetCaptivePortalConfig(const Config::CaptivePortalConfig& config) { _mainConfig.captivePortal = config; return _trySaveConfig(); } -bool Config::SetBackendConfig(const BackendConfig& config) { +bool Config::SetBackendConfig(const Config::BackendConfig& config) { _mainConfig.backend = config; return _trySaveConfig(); } @@ -345,7 +208,7 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint // Bitmask representing available credential IDs (0-31) std::uint32_t bits = 0; - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (creds.ssid == ssid) { creds.password = password; @@ -369,15 +232,9 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint return 0; } - WiFiCredentials creds { - .id = id, - .ssid = ssid, - .password = password, - }; - - memcpy(creds.bssid, bssid, 6); + WiFiCredentials creds(id, ssid, bssid, password); - _mainConfig.wifi.credentials.push_back(creds); + _mainConfig.wifi.credentialsList.push_back(creds); } _trySaveConfig(); @@ -386,7 +243,7 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint } bool Config::TryGetWiFiCredentialsByID(std::uint8_t id, Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (creds.id == id) { credentials = creds; return true; @@ -397,7 +254,7 @@ bool Config::TryGetWiFiCredentialsByID(std::uint8_t id, Config::WiFiCredentials& } bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (creds.ssid == ssid) { credentials = creds; return true; @@ -408,7 +265,7 @@ bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentia } bool Config::TryGetWiFiCredentialsByBSSID(const std::uint8_t (&bssid)[6], Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (memcmp(creds.bssid, bssid, 6) == 0) { credentials = creds; return true; @@ -419,7 +276,7 @@ bool Config::TryGetWiFiCredentialsByBSSID(const std::uint8_t (&bssid)[6], Config } std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (creds.ssid == ssid) { return creds.id; } @@ -429,7 +286,7 @@ std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { } std::uint8_t Config::GetWiFiCredentialsIDbyBSSID(const std::uint8_t (&bssid)[6]) { - for (auto& creds : _mainConfig.wifi.credentials) { + for (auto& creds : _mainConfig.wifi.credentialsList) { if (memcmp(creds.bssid, bssid, 6) == 0) { return creds.id; } @@ -448,9 +305,9 @@ std::uint8_t Config::GetWiFiCredentialsIDbyBSSIDorSSID(const std::uint8_t (&bssi } bool Config::RemoveWiFiCredentials(std::uint8_t id) { - for (auto it = _mainConfig.wifi.credentials.begin(); it != _mainConfig.wifi.credentials.end(); ++it) { + for (auto it = _mainConfig.wifi.credentialsList.begin(); it != _mainConfig.wifi.credentialsList.end(); ++it) { if (it->id == id) { - _mainConfig.wifi.credentials.erase(it); + _mainConfig.wifi.credentialsList.erase(it); _trySaveConfig(); return true; } @@ -460,7 +317,7 @@ bool Config::RemoveWiFiCredentials(std::uint8_t id) { } void Config::ClearWiFiCredentials() { - _mainConfig.wifi.credentials.clear(); + _mainConfig.wifi.credentialsList.clear(); _trySaveConfig(); } diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp new file mode 100644 index 00000000..f6f321b6 --- /dev/null +++ b/src/config/RFConfig.cpp @@ -0,0 +1,67 @@ +#include "config/RFConfig.h" + +#include "Logging.h" + +const char* const TAG = "Config::RFConfig"; + +using namespace OpenShock::Config; + +void RFConfig::ToDefault() { + txPin = 0U; + keepAliveEnabled = true; +} + +bool RFConfig::FromFlatbuffers(const Serialization::Configuration::RFConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + txPin = config->tx_pin(); + keepAliveEnabled = config->keepalive_enabled(); + + return true; +} + +flatbuffers::Offset RFConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + return Serialization::Configuration::CreateRFConfig(builder, txPin, keepAliveEnabled); +} + +bool RFConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* txPinJson = cJSON_GetObjectItemCaseSensitive(json, "txPin"); + if (!cJSON_IsNumber(txPinJson)) { + ESP_LOGE(TAG, "value at 'txPin' is not a number"); + return false; + } + + txPin = txPinJson->valueint; + + const cJSON* keepAliveEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "keepAliveEnabled"); + if (!cJSON_IsBool(keepAliveEnabledJson)) { + ESP_LOGE(TAG, "value at 'keepAliveEnabled' is not a bool"); + return false; + } + + keepAliveEnabled = cJSON_IsTrue(keepAliveEnabledJson); + + return true; +} + +cJSON* RFConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddNumberToObject(root, "txPin", txPin); + cJSON_AddBoolToObject(root, "keepAliveEnabled", keepAliveEnabled); + + return root; +} diff --git a/src/config/RootConfig.cpp b/src/config/RootConfig.cpp new file mode 100644 index 00000000..02f08482 --- /dev/null +++ b/src/config/RootConfig.cpp @@ -0,0 +1,92 @@ +#include "config/RootConfig.h" + +#include "Logging.h" + +const char* const TAG = "Config::RootConfig"; + +using namespace OpenShock::Config; + +void RootConfig::ToDefault() { + rf.ToDefault(); + wifi.ToDefault(); + captivePortal.ToDefault(); + backend.ToDefault(); +} + +bool RootConfig::FromFlatbuffers(const Serialization::Configuration::Config* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + if (!rf.FromFlatbuffers(config->rf())) { + ESP_LOGE(TAG, "Unable to load rf config"); + return false; + } + + if (!wifi.FromFlatbuffers(config->wifi())) { + ESP_LOGE(TAG, "Unable to load wifi config"); + return false; + } + + if (!captivePortal.FromFlatbuffers(config->captive_portal())) { + ESP_LOGE(TAG, "Unable to load captive portal config"); + return false; + } + + if (!backend.FromFlatbuffers(config->backend())) { + ESP_LOGE(TAG, "Unable to load backend config"); + return false; + } + + return true; +} + +flatbuffers::Offset RootConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + return Serialization::Configuration::CreateConfig(builder, rf.ToFlatbuffers(builder), wifi.ToFlatbuffers(builder), captivePortal.ToFlatbuffers(builder), backend.ToFlatbuffers(builder)); +} + +bool RootConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + if (!rf.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "rf"))) { + ESP_LOGE(TAG, "Unable to load rf config"); + return false; + } + + if (!wifi.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "wifi"))) { + ESP_LOGE(TAG, "Unable to load wifi config"); + return false; + } + + if (!captivePortal.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "captivePortal"))) { + ESP_LOGE(TAG, "Unable to load captive portal config"); + return false; + } + + if (!backend.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "backend"))) { + ESP_LOGE(TAG, "Unable to load backend config"); + return false; + } + + return true; +} + +cJSON* RootConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddItemToObject(root, "rf", rf.ToJSON()); + cJSON_AddItemToObject(root, "wifi", wifi.ToJSON()); + cJSON_AddItemToObject(root, "captivePortal", captivePortal.ToJSON()); + cJSON_AddItemToObject(root, "backend", backend.ToJSON()); + + return root; +} diff --git a/src/config/WiFiConfig.cpp b/src/config/WiFiConfig.cpp new file mode 100644 index 00000000..08428ec7 --- /dev/null +++ b/src/config/WiFiConfig.cpp @@ -0,0 +1,117 @@ +#include "config/WiFiConfig.h" + +#include "config/internal/utils.h" +#include "Logging.h" + +const char* const TAG = "Config::WiFiConfig"; + +using namespace OpenShock::Config; + +void WiFiConfig::ToDefault() { + accessPointSSID = OPENSHOCK_FW_AP_PREFIX; + hostname = OPENSHOCK_FW_HOSTNAME; + credentialsList.clear(); +} + +bool WiFiConfig::FromFlatbuffers(const Serialization::Configuration::WiFiConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + Internal::Utils::FromFbsStr(accessPointSSID, config->ap_ssid(), OPENSHOCK_FW_AP_PREFIX); + Internal::Utils::FromFbsStr(hostname, config->hostname(), OPENSHOCK_FW_HOSTNAME); + Internal::Utils::FromFbsVec(credentialsList, config->credentials()); + + return true; +} + +flatbuffers::Offset WiFiConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + std::vector> fbsCredentialsList; + for (auto& credentials : credentialsList) { + fbsCredentialsList.push_back(credentials.ToFlatbuffers(builder)); + } + + return Serialization::Configuration::CreateWiFiConfig(builder, builder.CreateString(accessPointSSID), builder.CreateString(hostname), builder.CreateVector(fbsCredentialsList)); +} + +bool WiFiConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* accessPointSSIDJson = cJSON_GetObjectItemCaseSensitive(json, "accessPointSSID"); + if (accessPointSSIDJson == nullptr) { + ESP_LOGE(TAG, "accessPointSSID is null"); + return false; + } + + if (!cJSON_IsString(accessPointSSIDJson)) { + ESP_LOGE(TAG, "accessPointSSID is not a string"); + return false; + } + + accessPointSSID = accessPointSSIDJson->valuestring; + + const cJSON* hostnameJson = cJSON_GetObjectItemCaseSensitive(json, "hostname"); + if (hostnameJson == nullptr) { + ESP_LOGE(TAG, "hostname is null"); + return false; + } + + if (!cJSON_IsString(hostnameJson)) { + ESP_LOGE(TAG, "hostname is not a string"); + return false; + } + + hostname = hostnameJson->valuestring; + + const cJSON* credentialsListJson = cJSON_GetObjectItemCaseSensitive(json, "credentials"); + if (credentialsListJson == nullptr) { + ESP_LOGE(TAG, "credentials is null"); + return false; + } + + if (!cJSON_IsArray(credentialsListJson)) { + ESP_LOGE(TAG, "credentials is not an array"); + return false; + } + + credentialsList.clear(); + + const cJSON* credentialsJson = nullptr; + cJSON_ArrayForEach(credentialsJson, credentialsListJson) { + WiFiCredentials wifiCredential; + if (!wifiCredential.FromJSON(credentialsJson)) { + ESP_LOGE(TAG, "Failed to parse WiFiCredential"); + return false; + } + + credentialsList.push_back(std::move(wifiCredential)); + } + + return true; +} + +cJSON* WiFiConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddStringToObject(root, "accessPointSSID", accessPointSSID.c_str()); + cJSON_AddStringToObject(root, "hostname", hostname.c_str()); + + cJSON* credentialsListJson = cJSON_CreateArray(); + + for (auto& credentials : credentialsList) { + cJSON_AddItemToArray(credentialsListJson, credentials.ToJSON()); + } + + cJSON_AddItemToObject(root, "credentials", credentialsListJson); + + return root; +} diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp new file mode 100644 index 00000000..2f03f720 --- /dev/null +++ b/src/config/WiFiCredentials.cpp @@ -0,0 +1,139 @@ +#include "config/WiFiCredentials.h" + +#include "config/internal/utils.h" +#include "Logging.h" +#include "util/HexUtils.h" + +const char* const TAG = "Config::WiFiCredentials"; + +using namespace OpenShock::Config; + +WiFiCredentials::WiFiCredentials() { + ToDefault(); +} + +WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password) { + this->id = id; + this->ssid = ssid; + this->password = password; + std::copy(std::begin(bssid), std::end(bssid), this->bssid); +} + +void WiFiCredentials::ToDefault() { + id = 0; + ssid = ""; + std::fill(std::begin(bssid), std::end(bssid), 0); + password = ""; +} + +bool WiFiCredentials::FromFlatbuffers(const Serialization::Configuration::WiFiCredentials* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + id = config->id(); + Internal::Utils::FromFbsStr(ssid, config->ssid(), ""); + Internal::Utils::FromFbsStr(password, config->password(), ""); + + auto fbsBssid = config->bssid(); + if (fbsBssid != nullptr) { + auto fbsBssidArr = fbsBssid->array(); + if (fbsBssidArr != nullptr) { + std::copy(fbsBssidArr->begin(), fbsBssidArr->end(), bssid); + } else { + std::fill(std::begin(bssid), std::end(bssid), 0); + } + } else { + std::fill(std::begin(bssid), std::end(bssid), 0); + } + + return true; +} + +flatbuffers::Offset WiFiCredentials::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + Serialization::Configuration::BSSID fbsBssid(bssid); + + return Serialization::Configuration::CreateWiFiCredentials(builder, id, builder.CreateString(ssid), &fbsBssid, builder.CreateString(password)); +} + +bool WiFiCredentials::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* idJson = cJSON_GetObjectItemCaseSensitive(json, "id"); + if (idJson == nullptr) { + ESP_LOGE(TAG, "id is null"); + return false; + } + + if (!cJSON_IsNumber(idJson)) { + ESP_LOGE(TAG, "id is not a number"); + return false; + } + + if (idJson->valueint < 0 || idJson->valueint > UINT8_MAX) { + ESP_LOGE(TAG, "id is out of range"); + return false; + } + + id = idJson->valueint; + + const cJSON* ssidJson = cJSON_GetObjectItemCaseSensitive(json, "ssid"); + if (ssidJson == nullptr) { + ESP_LOGE(TAG, "ssid is null"); + return false; + } + + if (!cJSON_IsString(ssidJson)) { + ESP_LOGE(TAG, "ssid is not a string"); + return false; + } + + ssid = ssidJson->valuestring; + + const cJSON* bssidJson = cJSON_GetObjectItemCaseSensitive(json, "bssid"); + if (bssidJson == nullptr) { + ESP_LOGE(TAG, "bssid is null"); + return false; + } + + if (!cJSON_IsString(bssidJson)) { + ESP_LOGE(TAG, "bssid is not a string"); + return false; + } + + std::size_t bssidLen = strlen(bssidJson->valuestring); + + if (bssidLen != 17) { + ESP_LOGE(TAG, "bssid is not a valid MAC address"); + return false; + } + + if (!HexUtils::TryParseHexMac(bssidJson->valuestring, bssidLen, bssid, 6)) { + ESP_LOGE(TAG, "bssid has a invalid format"); + return false; + } + + return true; +} + +cJSON* WiFiCredentials::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddNumberToObject(root, "id", id); + cJSON_AddStringToObject(root, "ssid", ssid.c_str()); + + char bssidStr[17]; + HexUtils::ToHexMac<6>(bssid, bssidStr); + cJSON_AddStringToObject(root, "bssid", bssidStr); + + return root; +} diff --git a/src/event_handlers/WiFiScan.cpp b/src/event_handlers/WiFiScan.cpp index 60529fe2..3ce78b80 100644 --- a/src/event_handlers/WiFiScan.cpp +++ b/src/event_handlers/WiFiScan.cpp @@ -1,7 +1,7 @@ #include "event_handlers/WiFiScan.h" #include "CaptivePortal.h" -#include "Config.h" +#include "config/Config.h" #include "serialization/WSLocal.h" #include "wifi/WiFiManager.h" #include "wifi/WiFiNetwork.h" diff --git a/src/main.cpp b/src/main.cpp index bed426f6..cc209f32 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ #include "CaptivePortal.h" #include "CommandHandler.h" -#include "Config.h" +#include "config/Config.h" #include "Constants.h" #include "EStopManager.h" #include "event_handlers/Init.h" diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index af72d62d..66a00783 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -1,7 +1,7 @@ #include "wifi/WiFiManager.h" #include "CaptivePortal.h" -#include "Config.h" +#include "config/Config.h" #include "FormatHelpers.h" #include "Logging.h" #include "serialization/WSLocal.h" From 973d4e1e76a21977767d08bab40e3efc9d2baa46 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 12:33:20 +0100 Subject: [PATCH 018/147] Fix CommandHandler semaphore initialization (#135) --- src/CommandHandler.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 59509a22..125f6737 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -157,6 +157,12 @@ bool CommandHandler::Init() { return true; } + // Initialize semaphores + s_rfTransmitterSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive(s_rfTransmitterSemaphore); + s_keepAliveSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive(s_keepAliveSemaphore); + auto& rfConfig = Config::GetRFConfig(); std::uint8_t txPin = rfConfig.txPin; @@ -166,8 +172,6 @@ bool CommandHandler::Init() { return false; } - s_rfTransmitterSemaphore = xSemaphoreCreateBinary(); - xSemaphoreGive(s_rfTransmitterSemaphore); s_rfTransmitter = std::make_unique(txPin, 32); if (!s_rfTransmitter->ok()) { ESP_LOGE(TAG, "Failed to initialize RF Transmitter"); @@ -175,8 +179,6 @@ bool CommandHandler::Init() { return false; } - s_keepAliveSemaphore = xSemaphoreCreateBinary(); - xSemaphoreGive(s_keepAliveSemaphore); if (rfConfig.keepAliveEnabled) { _internalSetKeepAliveEnabled(true); } From 49cedab9ac070853b6e7b11a1d3def524c28788e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 12:34:36 +0100 Subject: [PATCH 019/147] Remove code accidentally embedded in serial print strings (#136) --- src/SerialInputHandler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 8dbffc7d..371e8332 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -52,7 +52,7 @@ factoryreset reset device to factory defaults and reboot if (strcmp(arg, kCommandRmtpin) == 0) { Serial.print(kCommandRmtpin R"( Get the GPIO pin used for the radio transmitter. - Serial.println(); + rmtpin [] Set the GPIO pin used for the radio transmitter. Arguments: @@ -77,7 +77,7 @@ rmtpin [] if (strcmp(arg, kCommandNetworks) == 0) { Serial.print(kCommandNetworks R"( Get all saved networks. - Serial.println(); + networks [] Set all saved networks. Arguments: @@ -91,9 +91,9 @@ networks [] } if (strcmp(arg, kCommandKeepAlive) == 0) { - Serial.print(kCommandKeepAlive R"( + Serial.print(kCommandKeepAlive R"( Get the shocker keep-alive status. - Serial.println(); + keepalive [] Enable/disable shocker keep-alive. Arguments: From 202924e906726ecb288a425075c9fd9c4a3eafb2 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Wed, 29 Nov 2023 03:43:12 -0800 Subject: [PATCH 020/147] Fix clearing E-Stop re-enabling keep-alive when disabled in config (#132) Keep-Alive consistency Co-authored-by: HentaiHeavenVR --- src/CommandHandler.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 125f6737..f9961c15 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -48,7 +48,7 @@ static TaskHandle_t s_keepAliveTaskHandle = nullptr; void _keepAliveTask(void* arg) { std::int64_t timeToKeepAlive = KEEP_ALIVE_INTERVAL; - // Map of shocker IDs to time of next keep alive + // Map of shocker IDs to time of next keep-alive std::unordered_map activityMap; while (true) { @@ -58,7 +58,7 @@ void _keepAliveTask(void* arg) { KnownShocker cmd; while (xQueueReceive(s_keepAliveQueue, &cmd, pdMS_TO_TICKS(eepyTime)) == pdTRUE) { if (cmd.killTask) { - ESP_LOGW(TAG, "Received kill command, exiting keep alive task"); + ESP_LOGW(TAG, "Received kill command, exiting keep-alive task"); vTaskDelete(nullptr); break; // This should never be reached } @@ -74,20 +74,20 @@ void _keepAliveTask(void* arg) { // Keep track of the minimum activity time, so we know when to wake up timeToKeepAlive = now + KEEP_ALIVE_INTERVAL; - // For every entry that has a keep alive time less than now, send a keep alive + // For every entry that has a keep-alive time less than now, send a keep-alive for (auto it = activityMap.begin(); it != activityMap.end(); ++it) { auto& cmd = it->second; if (cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL < now) { - ESP_LOGV(TAG, "Sending keep alive for shocker %u", cmd.shockerId); + ESP_LOGV(TAG, "Sending keep-alive for shocker %u", cmd.shockerId); if (s_rfTransmitter == nullptr) { - ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring keep alive"); + ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring keep-alive"); break; } if (!s_rfTransmitter->SendCommand(cmd.model, cmd.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) { - ESP_LOGW(TAG, "Failed to send keep alive for shocker %u", cmd.shockerId); + ESP_LOGW(TAG, "Failed to send keep-alive for shocker %u", cmd.shockerId); } cmd.lastActivityTimestamp = now; @@ -102,14 +102,14 @@ bool _internalSetKeepAliveEnabled(bool enabled) { bool wasEnabled = s_keepAliveQueue != nullptr && s_keepAliveTaskHandle != nullptr; if (enabled == wasEnabled) { - ESP_LOGV(TAG, "Keep alive task is already %s", enabled ? "enabled" : "disabled"); + ESP_LOGV(TAG, "keep-alive task is already %s", enabled ? "enabled" : "disabled"); return true; } xSemaphoreTake(s_keepAliveSemaphore, portMAX_DELAY); if (enabled) { - ESP_LOGV(TAG, "Enabling keep alive task"); + ESP_LOGV(TAG, "Enabling keep-alive task"); s_keepAliveQueue = xQueueCreate(32, sizeof(KnownShocker)); if (s_keepAliveQueue == nullptr) { @@ -129,7 +129,7 @@ bool _internalSetKeepAliveEnabled(bool enabled) { return false; } } else { - ESP_LOGV(TAG, "Disabling keep alive task"); + ESP_LOGV(TAG, "Disabling keep-alive task"); if (s_keepAliveTaskHandle != nullptr && s_keepAliveQueue != nullptr) { // Wait for the task to stop KnownShocker cmd {.killTask = true}; @@ -142,7 +142,7 @@ bool _internalSetKeepAliveEnabled(bool enabled) { vQueueDelete(s_keepAliveQueue); s_keepAliveQueue = nullptr; } else { - ESP_LOGW(TAG, "Keep alive task is already disabled? Something might be wrong."); + ESP_LOGW(TAG, "keep-alive task is already disabled? Something might be wrong."); } } @@ -230,7 +230,7 @@ bool CommandHandler::SetKeepAliveEnabled(bool enabled) { } if (!Config::SetRFConfigKeepAliveEnabled(enabled)) { - ESP_LOGE(TAG, "Failed to set keep alive enabled in config"); + ESP_LOGE(TAG, "Failed to set keep-alive enabled in config"); return false; } @@ -238,6 +238,10 @@ bool CommandHandler::SetKeepAliveEnabled(bool enabled) { } bool CommandHandler::SetKeepAlivePaused(bool paused) { + if (Config::GetRFConfig().keepAliveEnabled == false && paused == false) { + ESP_LOGW(TAG, "Keep-alive is disabled in config, ignoring unpause command"); + return false; + } if (!_internalSetKeepAliveEnabled(!paused)) { return false; } From 85353e4be8694436f6f66c843f078b7195e4c6cd Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 15:51:06 +0100 Subject: [PATCH 021/147] Feature/improve network config (#139) * Remove BSSID from config * Increase credentials id limit to 255 --- .../open-shock/serialization/configuration.ts | 1 - .../serialization/configuration/bssid.ts | 33 ------ .../configuration/wi-fi-credentials.ts | 25 ++--- include/config/Config.h | 5 +- include/config/WiFiCredentials.h | 3 +- .../serialization/_fbs/ConfigFile_generated.h | 41 +------ include/wifi/WiFiManager.h | 22 ---- schemas/ConfigFile.fbs | 5 - src/config/Config.cpp | 82 ++++++-------- src/config/WiFiCredentials.cpp | 47 ++------ src/event_handlers/WiFiScan.cpp | 2 +- src/wifi/WiFiManager.cpp | 100 ++++++------------ 12 files changed, 87 insertions(+), 279 deletions(-) delete mode 100644 WebUI/src/lib/_fbs/open-shock/serialization/configuration/bssid.ts diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts index eb922d92..1f71591a 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts @@ -1,6 +1,5 @@ // automatically generated by the FlatBuffers compiler, do not modify -export { BSSID } from './serialization/configuration/bssid.js'; export { BackendConfig } from './serialization/configuration/backend-config.js'; export { CaptivePortalConfig } from './serialization/configuration/captive-portal-config.js'; export { Config } from './serialization/configuration/config.js'; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/bssid.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/bssid.ts deleted file mode 100644 index a762a285..00000000 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/bssid.ts +++ /dev/null @@ -1,33 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -import * as flatbuffers from 'flatbuffers'; - -export class BSSID { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):BSSID { - this.bb_pos = i; - this.bb = bb; - return this; -} - -array(index: number):number|null { - return this.bb!.readUint8(this.bb_pos + 0 + index); -} - -static sizeOf():number { - return 6; -} - -static createBSSID(builder:flatbuffers.Builder, array: number[]|null):flatbuffers.Offset { - builder.prep(1, 6); - - for (let i = 5; i >= 0; --i) { - builder.writeInt8((array?.[i] ?? 0)); - - } - - return builder.offset(); -} - -} diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts index 8c2f1320..232e6166 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts @@ -2,9 +2,6 @@ import * as flatbuffers from 'flatbuffers'; -import { BSSID } from '../../../open-shock/serialization/configuration/bssid.js'; - - export class WiFiCredentials { bb: flatbuffers.ByteBuffer|null = null; bb_pos = 0; @@ -35,20 +32,15 @@ ssid(optionalEncoding?:any):string|Uint8Array|null { return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } -bssid(obj?:BSSID):BSSID|null { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? (obj || new BSSID()).__init(this.bb_pos + offset, this.bb!) : null; -} - password():string|null password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null password(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 10); + const offset = this.bb!.__offset(this.bb_pos, 8); return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } static startWiFiCredentials(builder:flatbuffers.Builder) { - builder.startObject(4); + builder.startObject(3); } static addId(builder:flatbuffers.Builder, id:number) { @@ -59,12 +51,8 @@ static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { builder.addFieldOffset(1, ssidOffset, 0); } -static addBssid(builder:flatbuffers.Builder, bssidOffset:flatbuffers.Offset) { - builder.addFieldStruct(2, bssidOffset, 0); -} - static addPassword(builder:flatbuffers.Builder, passwordOffset:flatbuffers.Offset) { - builder.addFieldOffset(3, passwordOffset, 0); + builder.addFieldOffset(2, passwordOffset, 0); } static endWiFiCredentials(builder:flatbuffers.Builder):flatbuffers.Offset { @@ -72,4 +60,11 @@ static endWiFiCredentials(builder:flatbuffers.Builder):flatbuffers.Offset { return offset; } +static createWiFiCredentials(builder:flatbuffers.Builder, id:number, ssidOffset:flatbuffers.Offset, passwordOffset:flatbuffers.Offset):flatbuffers.Offset { + WiFiCredentials.startWiFiCredentials(builder); + WiFiCredentials.addId(builder, id); + WiFiCredentials.addSsid(builder, ssidOffset); + WiFiCredentials.addPassword(builder, passwordOffset); + return WiFiCredentials.endWiFiCredentials(builder); +} } diff --git a/include/config/Config.h b/include/config/Config.h index d821ee2c..bb8f585d 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -41,13 +41,10 @@ namespace OpenShock::Config { bool SetRFConfigTxPin(std::uint8_t txPin); bool SetRFConfigKeepAliveEnabled(bool enabled); - std::uint8_t AddWiFiCredentials(const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password); + std::uint8_t AddWiFiCredentials(const std::string& ssid, const std::string& password); bool TryGetWiFiCredentialsByID(std::uint8_t id, WiFiCredentials& out); bool TryGetWiFiCredentialsBySSID(const char* ssid, WiFiCredentials& out); - bool TryGetWiFiCredentialsByBSSID(const std::uint8_t (&bssid)[6], WiFiCredentials& out); std::uint8_t GetWiFiCredentialsIDbySSID(const char* ssid); - std::uint8_t GetWiFiCredentialsIDbyBSSID(const std::uint8_t (&bssid)[6]); - std::uint8_t GetWiFiCredentialsIDbyBSSIDorSSID(const std::uint8_t (&bssid)[6], const char* ssid); bool RemoveWiFiCredentials(std::uint8_t id); void ClearWiFiCredentials(); diff --git a/include/config/WiFiCredentials.h b/include/config/WiFiCredentials.h index f4f150b3..03308adc 100644 --- a/include/config/WiFiCredentials.h +++ b/include/config/WiFiCredentials.h @@ -7,11 +7,10 @@ namespace OpenShock::Config { struct WiFiCredentials : public ConfigBase { WiFiCredentials(); - WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password); + WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::string& password); std::uint8_t id; std::string ssid; - std::uint8_t bssid[6]; std::string password; void ToDefault() override; diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index c9281c8e..2274ee8e 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -17,8 +17,6 @@ namespace OpenShock { namespace Serialization { namespace Configuration { -struct BSSID; - struct RFConfig; struct RFConfigBuilder; @@ -37,31 +35,6 @@ struct BackendConfigBuilder; struct Config; struct ConfigBuilder; -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) BSSID FLATBUFFERS_FINAL_CLASS { - private: - uint8_t array_[6]; - - public: - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.Configuration.BSSID"; - } - BSSID() - : array_() { - } - BSSID(::flatbuffers::span _array) { - ::flatbuffers::CastToArray(array_).CopyFromSpan(_array); - } - const ::flatbuffers::Array *array() const { - return &::flatbuffers::CastToArray(array_); - } -}; -FLATBUFFERS_STRUCT_END(BSSID, 6); - -struct BSSID::Traits { - using type = BSSID; -}; - struct RFConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef RFConfigBuilder Builder; struct Traits; @@ -131,8 +104,7 @@ struct WiFiCredentials FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ID = 4, VT_SSID = 6, - VT_BSSID = 8, - VT_PASSWORD = 10 + VT_PASSWORD = 8 }; uint8_t id() const { return GetField(VT_ID, 0); @@ -140,9 +112,6 @@ struct WiFiCredentials FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const ::flatbuffers::String *ssid() const { return GetPointer(VT_SSID); } - const OpenShock::Serialization::Configuration::BSSID *bssid() const { - return GetStruct(VT_BSSID); - } const ::flatbuffers::String *password() const { return GetPointer(VT_PASSWORD); } @@ -151,7 +120,6 @@ struct WiFiCredentials FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VerifyField(verifier, VT_ID, 1) && VerifyOffset(verifier, VT_SSID) && verifier.VerifyString(ssid()) && - VerifyField(verifier, VT_BSSID, 1) && VerifyOffset(verifier, VT_PASSWORD) && verifier.VerifyString(password()) && verifier.EndTable(); @@ -168,9 +136,6 @@ struct WiFiCredentialsBuilder { void add_ssid(::flatbuffers::Offset<::flatbuffers::String> ssid) { fbb_.AddOffset(WiFiCredentials::VT_SSID, ssid); } - void add_bssid(const OpenShock::Serialization::Configuration::BSSID *bssid) { - fbb_.AddStruct(WiFiCredentials::VT_BSSID, bssid); - } void add_password(::flatbuffers::Offset<::flatbuffers::String> password) { fbb_.AddOffset(WiFiCredentials::VT_PASSWORD, password); } @@ -189,11 +154,9 @@ inline ::flatbuffers::Offset CreateWiFiCredentials( ::flatbuffers::FlatBufferBuilder &_fbb, uint8_t id = 0, ::flatbuffers::Offset<::flatbuffers::String> ssid = 0, - const OpenShock::Serialization::Configuration::BSSID *bssid = nullptr, ::flatbuffers::Offset<::flatbuffers::String> password = 0) { WiFiCredentialsBuilder builder_(_fbb); builder_.add_password(password); - builder_.add_bssid(bssid); builder_.add_ssid(ssid); builder_.add_id(id); return builder_.Finish(); @@ -208,7 +171,6 @@ inline ::flatbuffers::Offset CreateWiFiCredentialsDirect( ::flatbuffers::FlatBufferBuilder &_fbb, uint8_t id = 0, const char *ssid = nullptr, - const OpenShock::Serialization::Configuration::BSSID *bssid = nullptr, const char *password = nullptr) { auto ssid__ = ssid ? _fbb.CreateString(ssid) : 0; auto password__ = password ? _fbb.CreateString(password) : 0; @@ -216,7 +178,6 @@ inline ::flatbuffers::Offset CreateWiFiCredentialsDirect( _fbb, id, ssid__, - bssid, password__); } diff --git a/include/wifi/WiFiManager.h b/include/wifi/WiFiManager.h index 46c55b5f..910e4c01 100644 --- a/include/wifi/WiFiManager.h +++ b/include/wifi/WiFiManager.h @@ -16,22 +16,11 @@ namespace OpenShock::WiFiManager { /// @return True if the network was saved successfully bool Save(const char* ssid, const std::string& password); - /// @brief Saves a network to the config by it's BSSID (supports hidden networks) - /// @param bssid BSSID of the network - /// @param password Password of the network - /// @return True if the network was saved successfully - bool Save(const std::uint8_t (&bssid)[6], const std::string& password); - /// @brief Removes a network from the config by it's SSID /// @param ssid SSID of the network /// @return True if the network was removed successfully bool Forget(const char* ssid); - /// @brief Removes a network from the config by it's BSSID - /// @param bssid BSSID of the network - /// @return True if the network was removed successfully - bool Forget(const std::uint8_t (&bssid)[6]); - /// @brief Refreshes all the networks with updated credential IDs from the config /// @return True if the networks were refreshed successfully bool RefreshNetworkCredentials(); @@ -41,17 +30,6 @@ namespace OpenShock::WiFiManager { /// @return True if a saved network matches the given SSID bool IsSaved(const char* ssid); - /// @brief Checks if a network is saved in the config by it's BSSID - /// @param bssid BSSID of the network - /// @return True if a saved network matches the given BSSID - bool IsSaved(const std::uint8_t (&bssid)[6]); - - /// @brief Checks if a network is saved in the config by it's SSID and BSSID - /// @param ssid SSID of the network - /// @param bssid BSSID of the network - /// @return True if a saved network matches both the given SSID and BSSID - bool IsSaved(const char* ssid, const std::uint8_t (&bssid)[6]); - /// @brief Connects to a saved network by it's SSID /// @param ssid SSID of the network /// @return True if the saved network was found and the connection process was started successfully diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index d17967e5..54f99eca 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -1,9 +1,5 @@ namespace OpenShock.Serialization.Configuration; -struct BSSID { - array:[ubyte:6]; -} - table RFConfig { tx_pin:uint8; keepalive_enabled:bool; @@ -12,7 +8,6 @@ table RFConfig { table WiFiCredentials { id:uint8; ssid:string; - bssid:BSSID; password:string; } diff --git a/src/config/Config.cpp b/src/config/Config.cpp index e4abcc2c..d4108d33 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -3,12 +3,13 @@ #include "config/RootConfig.h" #include "Constants.h" #include "Logging.h" -#include "util/HexUtils.h" #include #include +#include + const char* const TAG = "Config"; using namespace OpenShock; @@ -173,8 +174,8 @@ bool Config::SetWiFiConfig(const Config::WiFiConfig& config) { bool Config::SetWiFiCredentials(const std::vector& credentials) { for (auto& cred : credentials) { - if (cred.id == 0 || cred.id > 32) { - ESP_LOGE(TAG, "Cannot set WiFi credentials: credential ID %u is invalid (must be 1-32)", cred.id); + if (cred.id == 0) { + ESP_LOGE(TAG, "Cannot set WiFi credentials: credential ID cannot be 0"); return false; } } @@ -203,12 +204,13 @@ bool Config::SetRFConfigKeepAliveEnabled(bool enabled) { return _trySaveConfig(); } -std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password) { +std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::string& password) { std::uint8_t id = 0; - // Bitmask representing available credential IDs (0-31) - std::uint32_t bits = 0; - for (auto& creds : _mainConfig.wifi.credentialsList) { + std::bitset<255> bits; + for (auto it = _mainConfig.wifi.credentialsList.begin(); it != _mainConfig.wifi.credentialsList.end(); ++it) { + auto& creds = *it; + if (creds.ssid == ssid) { creds.password = password; @@ -217,26 +219,34 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::uint break; } - // Mark the credential ID as used - bits |= 1u << creds.id; - } - - if (id == 0) { - id = 1; - while (bits & (1u << (id - 1)) && id <= 32) { - id++; + if (creds.id == 0) { + ESP_LOGW(TAG, "Found WiFi credentials with ID 0, removing"); + it = _mainConfig.wifi.credentialsList.erase(it); + continue; } - if (id > 32) { - ESP_LOGE(TAG, "Cannot add WiFi credentials: too many credentials"); - return 0; - } + // Mark ID as used + bits[creds.id - 1] = true; + } - WiFiCredentials creds(id, ssid, bssid, password); + // Get first available ID + for (std::size_t i = 0; i < bits.size(); ++i) { + if (!bits[i]) { + id = i + 1; + break; + } + } - _mainConfig.wifi.credentialsList.push_back(creds); + if (id == 0) { + ESP_LOGE(TAG, "Failed to add WiFi credentials: no available IDs"); + return 0; } + _mainConfig.wifi.credentialsList.push_back({ + .id = id, + .ssid = ssid, + .password = password, + }); _trySaveConfig(); return id; @@ -264,17 +274,6 @@ bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentia return false; } -bool Config::TryGetWiFiCredentialsByBSSID(const std::uint8_t (&bssid)[6], Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentialsList) { - if (memcmp(creds.bssid, bssid, 6) == 0) { - credentials = creds; - return true; - } - } - - return false; -} - std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { for (auto& creds : _mainConfig.wifi.credentialsList) { if (creds.ssid == ssid) { @@ -285,25 +284,6 @@ std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { return 0; } -std::uint8_t Config::GetWiFiCredentialsIDbyBSSID(const std::uint8_t (&bssid)[6]) { - for (auto& creds : _mainConfig.wifi.credentialsList) { - if (memcmp(creds.bssid, bssid, 6) == 0) { - return creds.id; - } - } - - return 0; -} - -std::uint8_t Config::GetWiFiCredentialsIDbyBSSIDorSSID(const std::uint8_t (&bssid)[6], const char* ssid) { - std::uint8_t id = GetWiFiCredentialsIDbyBSSID(bssid); - if (id != 0) { - return id; - } - - return GetWiFiCredentialsIDbySSID(ssid); -} - bool Config::RemoveWiFiCredentials(std::uint8_t id) { for (auto it = _mainConfig.wifi.credentialsList.begin(); it != _mainConfig.wifi.credentialsList.end(); ++it) { if (it->id == id) { diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp index 2f03f720..bc017ff4 100644 --- a/src/config/WiFiCredentials.cpp +++ b/src/config/WiFiCredentials.cpp @@ -12,17 +12,15 @@ WiFiCredentials::WiFiCredentials() { ToDefault(); } -WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::uint8_t (&bssid)[6], const std::string& password) { +WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::string& password) { this->id = id; this->ssid = ssid; this->password = password; - std::copy(std::begin(bssid), std::end(bssid), this->bssid); } void WiFiCredentials::ToDefault() { id = 0; ssid = ""; - std::fill(std::begin(bssid), std::end(bssid), 0); password = ""; } @@ -36,25 +34,11 @@ bool WiFiCredentials::FromFlatbuffers(const Serialization::Configuration::WiFiCr Internal::Utils::FromFbsStr(ssid, config->ssid(), ""); Internal::Utils::FromFbsStr(password, config->password(), ""); - auto fbsBssid = config->bssid(); - if (fbsBssid != nullptr) { - auto fbsBssidArr = fbsBssid->array(); - if (fbsBssidArr != nullptr) { - std::copy(fbsBssidArr->begin(), fbsBssidArr->end(), bssid); - } else { - std::fill(std::begin(bssid), std::end(bssid), 0); - } - } else { - std::fill(std::begin(bssid), std::end(bssid), 0); - } - return true; } flatbuffers::Offset WiFiCredentials::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - Serialization::Configuration::BSSID fbsBssid(bssid); - - return Serialization::Configuration::CreateWiFiCredentials(builder, id, builder.CreateString(ssid), &fbsBssid, builder.CreateString(password)); + return Serialization::Configuration::CreateWiFiCredentials(builder, id, builder.CreateString(ssid), builder.CreateString(password)); } bool WiFiCredentials::FromJSON(const cJSON* json) { @@ -99,28 +83,18 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { ssid = ssidJson->valuestring; - const cJSON* bssidJson = cJSON_GetObjectItemCaseSensitive(json, "bssid"); - if (bssidJson == nullptr) { - ESP_LOGE(TAG, "bssid is null"); - return false; - } - - if (!cJSON_IsString(bssidJson)) { - ESP_LOGE(TAG, "bssid is not a string"); + const cJSON* passwordJson = cJSON_GetObjectItemCaseSensitive(json, "password"); + if (passwordJson == nullptr) { + ESP_LOGE(TAG, "password is null"); return false; } - std::size_t bssidLen = strlen(bssidJson->valuestring); - - if (bssidLen != 17) { - ESP_LOGE(TAG, "bssid is not a valid MAC address"); + if (!cJSON_IsString(passwordJson)) { + ESP_LOGE(TAG, "password is not a string"); return false; } - if (!HexUtils::TryParseHexMac(bssidJson->valuestring, bssidLen, bssid, 6)) { - ESP_LOGE(TAG, "bssid has a invalid format"); - return false; - } + password = passwordJson->valuestring; return true; } @@ -130,10 +104,7 @@ cJSON* WiFiCredentials::ToJSON() const { cJSON_AddNumberToObject(root, "id", id); cJSON_AddStringToObject(root, "ssid", ssid.c_str()); - - char bssidStr[17]; - HexUtils::ToHexMac<6>(bssid, bssidStr); - cJSON_AddStringToObject(root, "bssid", bssidStr); + cJSON_AddStringToObject(root, "password", password.c_str()); return root; } diff --git a/src/event_handlers/WiFiScan.cpp b/src/event_handlers/WiFiScan.cpp index 3ce78b80..4885a853 100644 --- a/src/event_handlers/WiFiScan.cpp +++ b/src/event_handlers/WiFiScan.cpp @@ -20,7 +20,7 @@ void _scanStatusChangedHandler(OpenShock::WiFiScanStatus status) { } void _scanNetworkDiscoveredHandler(const wifi_ap_record_t* record) { - std::uint8_t id = Config::GetWiFiCredentialsIDbyBSSIDorSSID(record->bssid, reinterpret_cast(record->ssid)); + std::uint8_t id = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); WiFiNetwork network(record, id); Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, network, CaptivePortal::BroadcastMessageBIN); diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 66a00783..b8c85f99 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -118,8 +118,6 @@ bool _getNextWiFiNetwork(OpenShock::Config::WiFiCredentials& creds) { return false; } - memcpy(creds.bssid, net.bssid, sizeof(creds.bssid)); - return true; }) != s_wifiNetworks.end(); } @@ -146,13 +144,10 @@ bool _connectHidden(const std::uint8_t (&bssid)[6], const std::string& password) return false; } -bool _connect(const std::string& ssid, const std::string& password, const std::uint8_t (&bssid)[6]) { +bool _connect(const std::string& ssid, const std::string& password) { if (ssid.empty()) { - return _connectHidden(bssid, password); - } - - if (!_isZeroBSSID(bssid)) { - return _connectImpl(ssid.c_str(), password.c_str(), bssid); + ESP_LOGW(TAG, "Cannot connect to network with empty SSID"); + return false; } auto it = _findNetworkBySSID(ssid.c_str()); @@ -163,9 +158,23 @@ bool _connect(const std::string& ssid, const std::string& password, const std::u return _connectImpl(ssid.c_str(), password.c_str(), it->bssid); } +bool _connect(const std::uint8_t (&bssid)[6], const std::string& password) { + if (_isZeroBSSID(bssid)) { + ESP_LOGW(TAG, "Cannot connect to network with zero BSSID"); + return false; + } + + auto it = _findNetworkByBSSID(bssid); + if (it == s_wifiNetworks.end()) { + ESP_LOGE(TAG, "Failed to find network " BSSID_FMT, BSSID_ARG(bssid)); + return false; + } + + return _connectImpl(it->ssid, password.c_str(), bssid); +} bool _authenticate(const WiFiNetwork& net, const std::string& password) { - std::uint8_t id = Config::AddWiFiCredentials(net.ssid, net.bssid, password); + std::uint8_t id = Config::AddWiFiCredentials(net.ssid, password); if (id == 0) { Serialization::Local::SerializeErrorMessage("too_many_credentials", CaptivePortal::BroadcastMessageBIN); return false; @@ -173,7 +182,7 @@ bool _authenticate(const WiFiNetwork& net, const std::string& password) { Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Saved, net, CaptivePortal::BroadcastMessageBIN); - return _connect(net.ssid, password, net.bssid); + return _connect(net.ssid, password); } void _evWiFiConnected(arduino_event_t* event) { @@ -219,7 +228,7 @@ void _evWiFiDisconnected(arduino_event_t* event) { auto& info = event->event_info.wifi_sta_disconnected; Config::WiFiCredentials creds; - if (!Config::TryGetWiFiCredentialsBySSID(reinterpret_cast(info.ssid), creds) && !Config::TryGetWiFiCredentialsByBSSID(info.bssid, creds)) { + if (!Config::TryGetWiFiCredentialsBySSID(reinterpret_cast(info.ssid), creds)) { ESP_LOGW(TAG, "Disconnected from unknown network... WTF?"); return; } @@ -255,7 +264,7 @@ void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { } } void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { - std::uint8_t credsId = Config::GetWiFiCredentialsIDbyBSSIDorSSID(record->bssid, reinterpret_cast(record->ssid)); + std::uint8_t credsId = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); auto it = _findNetworkByBSSID(record->bssid); if (it != s_wifiNetworks.end()) { @@ -328,21 +337,6 @@ bool WiFiManager::Save(const char* ssid, const std::string& password) { return _authenticate(*it, password); } -bool WiFiManager::Save(const std::uint8_t (&bssid)[6], const std::string& password) { - ESP_LOGV(TAG, "Authenticating to network " BSSID_FMT, BSSID_ARG(bssid)); - - auto it = _findNetworkByBSSID(bssid); - if (it == s_wifiNetworks.end()) { - ESP_LOGE(TAG, "Failed to find network with BSSID " BSSID_FMT, BSSID_ARG(bssid)); - - Serialization::Local::SerializeErrorMessage("network_not_found", CaptivePortal::BroadcastMessageBIN); - - return false; - } - - return _authenticate(*it, password); -} - bool WiFiManager::Forget(const char* ssid) { ESP_LOGV(TAG, "Forgetting network %s", ssid); @@ -369,38 +363,12 @@ bool WiFiManager::Forget(const char* ssid) { return true; } -bool WiFiManager::Forget(const std::uint8_t (&bssid)[6]) { - ESP_LOGV(TAG, "Forgetting network " BSSID_FMT, BSSID_ARG(bssid)); - - auto it = std::find_if(s_wifiNetworks.begin(), s_wifiNetworks.end(), [bssid](const WiFiNetwork& net) { return memcmp(net.bssid, bssid, sizeof(bssid)) == 0; }); - if (it == s_wifiNetworks.end()) { - ESP_LOGE(TAG, "Failed to find network with BSSID " BSSID_FMT, BSSID_ARG(bssid)); - return false; - } - - std::uint8_t credsId = it->credentialsID; - - // Check if the network is currently connected - if (s_connectedCredentialsID == credsId) { - // Disconnect from the network - WiFiManager::Disconnect(); - } - - // Remove the credentials from the config - if (Config::RemoveWiFiCredentials(credsId)) { - it->credentialsID = 0; - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Removed, *it, CaptivePortal::BroadcastMessageBIN); - } - - return true; -} - bool WiFiManager::RefreshNetworkCredentials() { ESP_LOGV(TAG, "Refreshing network credentials"); for (auto& net : s_wifiNetworks) { Config::WiFiCredentials creds; - if (Config::TryGetWiFiCredentialsBySSID(net.ssid, creds) || Config::TryGetWiFiCredentialsByBSSID(net.bssid, creds)) { + if (Config::TryGetWiFiCredentialsBySSID(net.ssid, creds)) { ESP_LOGV(TAG, "Found credentials for network %s (" BSSID_FMT ")", net.ssid, BSSID_ARG(net.bssid)); net.credentialsID = creds.id; } else { @@ -416,14 +384,6 @@ bool WiFiManager::IsSaved(const char* ssid) { return _isSaved([ssid](const Config::WiFiCredentials& creds) { return creds.ssid == ssid; }); } -bool WiFiManager::IsSaved(const std::uint8_t (&bssid)[6]) { - return _isSaved([bssid](const Config::WiFiCredentials& creds) { return memcmp(creds.bssid, bssid, sizeof(bssid)) == 0; }); -} - -bool WiFiManager::IsSaved(const char* ssid, const std::uint8_t (&bssid)[6]) { - return _isSaved([ssid, bssid](const Config::WiFiCredentials& creds) { return creds.ssid == ssid || memcmp(creds.bssid, bssid, sizeof(bssid)) == 0; }); -} - bool WiFiManager::Connect(const char* ssid) { Config::WiFiCredentials creds; if (!Config::TryGetWiFiCredentialsBySSID(ssid, creds)) { @@ -446,9 +406,15 @@ bool WiFiManager::Connect(const char* ssid) { } bool WiFiManager::Connect(const std::uint8_t (&bssid)[6]) { + auto it = _findNetworkByBSSID(bssid); + if (it == s_wifiNetworks.end()) { + ESP_LOGE(TAG, "Failed to find network " BSSID_FMT, BSSID_ARG(bssid)); + return false; + } + Config::WiFiCredentials creds; - if (!Config::TryGetWiFiCredentialsByBSSID(bssid, creds)) { - ESP_LOGE(TAG, "Failed to find credentials for network " BSSID_FMT, BSSID_ARG(bssid)); + if (!Config::TryGetWiFiCredentialsBySSID(it->ssid, creds)) { + ESP_LOGE(TAG, "Failed to find credentials for network %s (" BSSID_FMT ")", it->ssid, BSSID_ARG(it->bssid)); return false; } @@ -503,11 +469,11 @@ void WiFiManager::Update() { return; } - if (_connect(creds.ssid, creds.password, creds.bssid)) { + if (_connect(creds.ssid, creds.password)) { return; } - ESP_LOGE(TAG, "Failed to connect to network %s (" BSSID_FMT ")", creds.ssid.c_str(), BSSID_ARG(creds.bssid)); + ESP_LOGE(TAG, "Failed to connect to network %s", creds.ssid.c_str()); } Config::WiFiCredentials creds; @@ -522,5 +488,5 @@ void WiFiManager::Update() { return; } - _connect(creds.ssid, creds.password, creds.bssid); + _connect(creds.ssid, creds.password); } From 841ebb877254dc3afea925921938e4cc376ab62b Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 16:13:13 +0100 Subject: [PATCH 022/147] Feature/config improvements (#140) * Some cleanup and make mainconfig static * More config improvements * Add more comments --- .../configuration/backend-config.ts | 20 ++++++---- .../configuration/captive-portal-config.ts | 4 ++ .../serialization/configuration/config.ts | 12 ++++++ .../serialization/configuration/rfconfig.ts | 6 +++ .../configuration/wi-fi-config.ts | 9 +++++ .../configuration/wi-fi-credentials.ts | 9 +++++ include/config/BackendConfig.h | 1 + .../serialization/_fbs/ConfigFile_generated.h | 40 +++++++++++++------ schemas/ConfigFile.fbs | 27 ++++++++++++- src/config/BackendConfig.cpp | 18 ++++++++- src/config/Config.cpp | 7 +--- 11 files changed, 126 insertions(+), 27 deletions(-) diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts index 66490f3e..95270161 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts @@ -20,13 +20,19 @@ static getSizePrefixedRootAsBackendConfig(bb:flatbuffers.ByteBuffer, obj?:Backen return (obj || new BackendConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } -host():string|null -host(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -host(optionalEncoding?:any):string|Uint8Array|null { +/** + * Domain name of the backend server, e.g. "api.shocklink.net" + */ +domain():string|null +domain(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +domain(optionalEncoding?:any):string|Uint8Array|null { const offset = this.bb!.__offset(this.bb_pos, 4); return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } +/** + * Authentication token for the backend server + */ authToken():string|null authToken(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null authToken(optionalEncoding?:any):string|Uint8Array|null { @@ -38,8 +44,8 @@ static startBackendConfig(builder:flatbuffers.Builder) { builder.startObject(2); } -static addHost(builder:flatbuffers.Builder, hostOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, hostOffset, 0); +static addDomain(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, domainOffset, 0); } static addAuthToken(builder:flatbuffers.Builder, authTokenOffset:flatbuffers.Offset) { @@ -51,9 +57,9 @@ static endBackendConfig(builder:flatbuffers.Builder):flatbuffers.Offset { return offset; } -static createBackendConfig(builder:flatbuffers.Builder, hostOffset:flatbuffers.Offset, authTokenOffset:flatbuffers.Offset):flatbuffers.Offset { +static createBackendConfig(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset, authTokenOffset:flatbuffers.Offset):flatbuffers.Offset { BackendConfig.startBackendConfig(builder); - BackendConfig.addHost(builder, hostOffset); + BackendConfig.addDomain(builder, domainOffset); BackendConfig.addAuthToken(builder, authTokenOffset); return BackendConfig.endBackendConfig(builder); } diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts index 5c8b161c..3c4dba00 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts @@ -20,6 +20,10 @@ static getSizePrefixedRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?: return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } +/** + * Whether the captive portal is forced to be enabled + * The captive portal will otherwise shut down when a gateway connection is established + */ alwaysEnabled():boolean { const offset = this.bb!.__offset(this.bb_pos, 4); return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts index f8b88f9b..b4aecfd8 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts @@ -26,21 +26,33 @@ static getSizePrefixedRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Confi return (obj || new Config()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } +/** + * RF Transmitter configuration + */ rf(obj?:RFConfig):RFConfig|null { const offset = this.bb!.__offset(this.bb_pos, 4); return offset ? (obj || new RFConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } +/** + * WiFi configuration + */ wifi(obj?:WiFiConfig):WiFiConfig|null { const offset = this.bb!.__offset(this.bb_pos, 6); return offset ? (obj || new WiFiConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } +/** + * Captive portal configuration + */ captivePortal(obj?:CaptivePortalConfig):CaptivePortalConfig|null { const offset = this.bb!.__offset(this.bb_pos, 8); return offset ? (obj || new CaptivePortalConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } +/** + * Backend configuration + */ backend(obj?:BackendConfig):BackendConfig|null { const offset = this.bb!.__offset(this.bb_pos, 10); return offset ? (obj || new BackendConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts index 8c1e725a..045f5045 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts @@ -20,11 +20,17 @@ static getSizePrefixedRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):R return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } +/** + * The GPIO pin connected to the RF modulator's data pin for transmitting (TX) + */ txPin():number { const offset = this.bb!.__offset(this.bb_pos, 4); return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; } +/** + * Whether to transmit keepalive messages to keep the devices from entering sleep mode + */ keepaliveEnabled():boolean { const offset = this.bb!.__offset(this.bb_pos, 6); return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts index 3b8fe4b5..d429eed7 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts @@ -23,6 +23,9 @@ static getSizePrefixedRootAsWiFiConfig(bb:flatbuffers.ByteBuffer, obj?:WiFiConfi return (obj || new WiFiConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } +/** + * Access point SSID + */ apSsid():string|null apSsid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null apSsid(optionalEncoding?:any):string|Uint8Array|null { @@ -30,6 +33,9 @@ apSsid(optionalEncoding?:any):string|Uint8Array|null { return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } +/** + * Device hostname + */ hostname():string|null hostname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null hostname(optionalEncoding?:any):string|Uint8Array|null { @@ -37,6 +43,9 @@ hostname(optionalEncoding?:any):string|Uint8Array|null { return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } +/** + * WiFi network credentials + */ credentials(index: number, obj?:WiFiCredentials):WiFiCredentials|null { const offset = this.bb!.__offset(this.bb_pos, 8); return offset ? (obj || new WiFiCredentials()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts index 232e6166..ea4a3902 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts @@ -20,11 +20,17 @@ static getSizePrefixedRootAsWiFiCredentials(bb:flatbuffers.ByteBuffer, obj?:WiFi return (obj || new WiFiCredentials()).__init(bb.readInt32(bb.position()) + bb.position(), bb); } +/** + * ID of the WiFi network credentials, used for referencing the credentials with a low memory footprint + */ id():number { const offset = this.bb!.__offset(this.bb_pos, 4); return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; } +/** + * SSID of the WiFi network + */ ssid():string|null ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null ssid(optionalEncoding?:any):string|Uint8Array|null { @@ -32,6 +38,9 @@ ssid(optionalEncoding?:any):string|Uint8Array|null { return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; } +/** + * Password of the WiFi network + */ password():string|null password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null password(optionalEncoding?:any):string|Uint8Array|null { diff --git a/include/config/BackendConfig.h b/include/config/BackendConfig.h index 3c417fb9..befc00a6 100644 --- a/include/config/BackendConfig.h +++ b/include/config/BackendConfig.h @@ -6,6 +6,7 @@ namespace OpenShock::Config { struct BackendConfig : public ConfigBase { + std::string domain; std::string authToken; void ToDefault() override; diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index 2274ee8e..bcdd0d53 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -45,9 +45,11 @@ struct RFConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_TX_PIN = 4, VT_KEEPALIVE_ENABLED = 6 }; + /// The GPIO pin connected to the RF modulator's data pin for transmitting (TX) uint8_t tx_pin() const { return GetField(VT_TX_PIN, 0); } + /// Whether to transmit keepalive messages to keep the devices from entering sleep mode bool keepalive_enabled() const { return GetField(VT_KEEPALIVE_ENABLED, 0) != 0; } @@ -106,12 +108,15 @@ struct WiFiCredentials FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_SSID = 6, VT_PASSWORD = 8 }; + /// ID of the WiFi network credentials, used for referencing the credentials with a low memory footprint uint8_t id() const { return GetField(VT_ID, 0); } + /// SSID of the WiFi network const ::flatbuffers::String *ssid() const { return GetPointer(VT_SSID); } + /// Password of the WiFi network const ::flatbuffers::String *password() const { return GetPointer(VT_PASSWORD); } @@ -192,12 +197,15 @@ struct WiFiConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_HOSTNAME = 6, VT_CREDENTIALS = 8 }; + /// Access point SSID const ::flatbuffers::String *ap_ssid() const { return GetPointer(VT_AP_SSID); } + /// Device hostname const ::flatbuffers::String *hostname() const { return GetPointer(VT_HOSTNAME); } + /// WiFi network credentials const ::flatbuffers::Vector<::flatbuffers::Offset> *credentials() const { return GetPointer> *>(VT_CREDENTIALS); } @@ -279,6 +287,8 @@ struct CaptivePortalConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Tabl enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ALWAYS_ENABLED = 4 }; + /// Whether the captive portal is forced to be enabled + /// The captive portal will otherwise shut down when a gateway connection is established bool always_enabled() const { return GetField(VT_ALWAYS_ENABLED, 0) != 0; } @@ -327,19 +337,21 @@ struct BackendConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { return "OpenShock.Serialization.Configuration.BackendConfig"; } enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_HOST = 4, + VT_DOMAIN = 4, VT_AUTH_TOKEN = 6 }; - const ::flatbuffers::String *host() const { - return GetPointer(VT_HOST); + /// Domain name of the backend server, e.g. "api.shocklink.net" + const ::flatbuffers::String *domain() const { + return GetPointer(VT_DOMAIN); } + /// Authentication token for the backend server const ::flatbuffers::String *auth_token() const { return GetPointer(VT_AUTH_TOKEN); } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_HOST) && - verifier.VerifyString(host()) && + VerifyOffset(verifier, VT_DOMAIN) && + verifier.VerifyString(domain()) && VerifyOffset(verifier, VT_AUTH_TOKEN) && verifier.VerifyString(auth_token()) && verifier.EndTable(); @@ -350,8 +362,8 @@ struct BackendConfigBuilder { typedef BackendConfig Table; ::flatbuffers::FlatBufferBuilder &fbb_; ::flatbuffers::uoffset_t start_; - void add_host(::flatbuffers::Offset<::flatbuffers::String> host) { - fbb_.AddOffset(BackendConfig::VT_HOST, host); + void add_domain(::flatbuffers::Offset<::flatbuffers::String> domain) { + fbb_.AddOffset(BackendConfig::VT_DOMAIN, domain); } void add_auth_token(::flatbuffers::Offset<::flatbuffers::String> auth_token) { fbb_.AddOffset(BackendConfig::VT_AUTH_TOKEN, auth_token); @@ -369,11 +381,11 @@ struct BackendConfigBuilder { inline ::flatbuffers::Offset CreateBackendConfig( ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::String> host = 0, + ::flatbuffers::Offset<::flatbuffers::String> domain = 0, ::flatbuffers::Offset<::flatbuffers::String> auth_token = 0) { BackendConfigBuilder builder_(_fbb); builder_.add_auth_token(auth_token); - builder_.add_host(host); + builder_.add_domain(domain); return builder_.Finish(); } @@ -384,13 +396,13 @@ struct BackendConfig::Traits { inline ::flatbuffers::Offset CreateBackendConfigDirect( ::flatbuffers::FlatBufferBuilder &_fbb, - const char *host = nullptr, + const char *domain = nullptr, const char *auth_token = nullptr) { - auto host__ = host ? _fbb.CreateString(host) : 0; + auto domain__ = domain ? _fbb.CreateString(domain) : 0; auto auth_token__ = auth_token ? _fbb.CreateString(auth_token) : 0; return OpenShock::Serialization::Configuration::CreateBackendConfig( _fbb, - host__, + domain__, auth_token__); } @@ -406,15 +418,19 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_CAPTIVE_PORTAL = 8, VT_BACKEND = 10 }; + /// RF Transmitter configuration const OpenShock::Serialization::Configuration::RFConfig *rf() const { return GetPointer(VT_RF); } + /// WiFi configuration const OpenShock::Serialization::Configuration::WiFiConfig *wifi() const { return GetPointer(VT_WIFI); } + /// Captive portal configuration const OpenShock::Serialization::Configuration::CaptivePortalConfig *captive_portal() const { return GetPointer(VT_CAPTIVE_PORTAL); } + /// Backend configuration const OpenShock::Serialization::Configuration::BackendConfig *backend() const { return GetPointer(VT_BACKEND); } diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index 54f99eca..cf138c77 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -1,34 +1,59 @@ namespace OpenShock.Serialization.Configuration; table RFConfig { + /// The GPIO pin connected to the RF modulator's data pin for transmitting (TX) tx_pin:uint8; + + /// Whether to transmit keepalive messages to keep the devices from entering sleep mode keepalive_enabled:bool; } table WiFiCredentials { + /// ID of the WiFi network credentials, used for referencing the credentials with a low memory footprint id:uint8; + + /// SSID of the WiFi network ssid:string; + + /// Password of the WiFi network password:string; } table WiFiConfig { + /// Access point SSID ap_ssid:string; + + /// Device hostname hostname:string; + + /// WiFi network credentials credentials:[WiFiCredentials]; } table CaptivePortalConfig { + /// Whether the captive portal is forced to be enabled + /// The captive portal will otherwise shut down when a gateway connection is established always_enabled:bool; } table BackendConfig { - host:string; + /// Domain name of the backend server, e.g. "api.shocklink.net" + domain:string; + + /// Authentication token for the backend server auth_token:string; } table Config { + /// RF Transmitter configuration rf:RFConfig; + + /// WiFi configuration wifi:WiFiConfig; + + /// Captive portal configuration captive_portal:CaptivePortalConfig; + + /// Backend configuration backend:BackendConfig; } diff --git a/src/config/BackendConfig.cpp b/src/config/BackendConfig.cpp index 5867c007..061028fb 100644 --- a/src/config/BackendConfig.cpp +++ b/src/config/BackendConfig.cpp @@ -8,6 +8,7 @@ const char* const TAG = "Config::BackendConfig"; using namespace OpenShock::Config; void BackendConfig::ToDefault() { + domain = OPENSHOCK_API_DOMAIN; authToken = ""; } @@ -17,13 +18,14 @@ bool BackendConfig::FromFlatbuffers(const Serialization::Configuration::BackendC return false; } + Internal::Utils::FromFbsStr(domain, config->domain(), OPENSHOCK_API_DOMAIN); Internal::Utils::FromFbsStr(authToken, config->auth_token(), ""); return true; } flatbuffers::Offset BackendConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - return Serialization::Configuration::CreateBackendConfig(builder, builder.CreateString(authToken)); + return Serialization::Configuration::CreateBackendConfig(builder, builder.CreateString(domain), builder.CreateString(authToken)); } bool BackendConfig::FromJSON(const cJSON* json) { @@ -37,6 +39,19 @@ bool BackendConfig::FromJSON(const cJSON* json) { return false; } + const cJSON* domainJson = cJSON_GetObjectItemCaseSensitive(json, "domain"); + if (domainJson == nullptr) { + ESP_LOGE(TAG, "domain is null"); + return false; + } + + if (!cJSON_IsString(domainJson)) { + ESP_LOGE(TAG, "domain is not a string"); + return false; + } + + domain = domainJson->valuestring; + const cJSON* authTokenJson = cJSON_GetObjectItemCaseSensitive(json, "authToken"); if (authTokenJson == nullptr) { ESP_LOGE(TAG, "authToken is null"); @@ -56,6 +71,7 @@ bool BackendConfig::FromJSON(const cJSON* json) { cJSON* BackendConfig::ToJSON() const { cJSON* root = cJSON_CreateObject(); + cJSON_AddStringToObject(root, "domain", domain.c_str()); cJSON_AddStringToObject(root, "authToken", authToken.c_str()); return root; diff --git a/src/config/Config.cpp b/src/config/Config.cpp index d4108d33..f7989bef 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -14,7 +14,7 @@ const char* const TAG = "Config"; using namespace OpenShock; -Config::RootConfig _mainConfig; +static Config::RootConfig _mainConfig; bool _tryLoadConfig() { File file = LittleFS.open("/config", "rb"); @@ -69,11 +69,6 @@ bool _trySaveConfig() { return false; } - auto& _rf = _mainConfig.rf; - auto& _wifi = _mainConfig.wifi; - auto& _backend = _mainConfig.backend; - auto& _captivePortal = _mainConfig.captivePortal; - // Serialize flatbuffers::FlatBufferBuilder builder(1024); From 55813c5082780e7c5a7b5833621153ea0c50732e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 29 Nov 2023 16:15:11 +0100 Subject: [PATCH 023/147] RFTransmitter cleanup (#138) * Remove magic numbers in RFTransmitter * Move intensity limiters into sequence encoders --- include/radio/RFTransmitter.h | 2 +- src/CommandHandler.cpp | 4 ++-- src/radio/RFTransmitter.cpp | 24 ++++++++++++------------ src/radio/rmt/PetTrainerEncoder.cpp | 3 +++ src/radio/rmt/XlcEncoder.cpp | 8 ++++++++ 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/include/radio/RFTransmitter.h b/include/radio/RFTransmitter.h index 50850177..7bcb7e36 100644 --- a/include/radio/RFTransmitter.h +++ b/include/radio/RFTransmitter.h @@ -15,7 +15,7 @@ typedef void* TaskHandle_t; namespace OpenShock { class RFTransmitter { public: - RFTransmitter(std::uint8_t gpioPin, int queueSize = 32); + RFTransmitter(std::uint8_t gpioPin); ~RFTransmitter(); inline std::uint8_t GetTxPin() const { return m_txPin; } diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index f9961c15..2954eb1d 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -172,7 +172,7 @@ bool CommandHandler::Init() { return false; } - s_rfTransmitter = std::make_unique(txPin, 32); + s_rfTransmitter = std::make_unique(txPin); if (!s_rfTransmitter->ok()) { ESP_LOGE(TAG, "Failed to initialize RF Transmitter"); s_rfTransmitter = nullptr; @@ -203,7 +203,7 @@ SetRfPinResultCode CommandHandler::SetRfTxPin(std::uint8_t txPin) { } ESP_LOGV(TAG, "Creating new RF transmitter"); - auto rfxmit = std::make_unique(txPin, 32); + auto rfxmit = std::make_unique(txPin); if (!rfxmit->ok()) { ESP_LOGE(TAG, "Failed to initialize RF transmitter"); diff --git a/src/radio/RFTransmitter.cpp b/src/radio/RFTransmitter.cpp index 555632f2..ada503d4 100644 --- a/src/radio/RFTransmitter.cpp +++ b/src/radio/RFTransmitter.cpp @@ -9,7 +9,14 @@ #include #include -#include +const char* const TAG = "RFTransmitter"; + +const UBaseType_t RFTRANSMITTER_QUEUE_SIZE = 32; +const BaseType_t RFTRANSMITTER_TASK_PRIORITY = 1; +const std::uint32_t RFTRANSMITTER_TASK_STACK_SIZE = 4096; +const float RFTRANSMITTER_TICKRATE_NS = 1000; + +using namespace OpenShock; struct command_t { std::int64_t until; @@ -19,11 +26,7 @@ struct command_t { bool overwrite; }; -const char* const TAG = "RFTransmitter"; - -using namespace OpenShock; - -RFTransmitter::RFTransmitter(std::uint8_t gpioPin, int queueSize) : m_txPin(gpioPin), m_rmtHandle(nullptr), m_queueHandle(nullptr), m_taskHandle(nullptr) { +RFTransmitter::RFTransmitter(std::uint8_t gpioPin) : m_txPin(gpioPin), m_rmtHandle(nullptr), m_queueHandle(nullptr), m_taskHandle(nullptr) { ESP_LOGD(TAG, "[pin-%u] Creating RFTransmitter", m_txPin); m_rmtHandle = rmtInit(gpioPin, RMT_TX_MODE, RMT_MEM_64); @@ -33,10 +36,10 @@ RFTransmitter::RFTransmitter(std::uint8_t gpioPin, int queueSize) : m_txPin(gpio return; } - float realTick = rmtSetTick(m_rmtHandle, 1000); + float realTick = rmtSetTick(m_rmtHandle, RFTRANSMITTER_TICKRATE_NS); ESP_LOGD(TAG, "[pin-%u] real tick set to: %fns", m_txPin, realTick); - m_queueHandle = xQueueCreate(queueSize, sizeof(command_t*)); + m_queueHandle = xQueueCreate(RFTRANSMITTER_QUEUE_SIZE, sizeof(command_t*)); if (m_queueHandle == nullptr) { ESP_LOGE(TAG, "[pin-%u] Failed to create queue", m_txPin); destroy(); @@ -46,7 +49,7 @@ RFTransmitter::RFTransmitter(std::uint8_t gpioPin, int queueSize) : m_txPin(gpio char name[32]; snprintf(name, sizeof(name), "RFTransmitter-%u", m_txPin); - if (TaskUtils::TaskCreateExpensive(TransmitTask, name, 4096, this, 1, &m_taskHandle) != pdPASS) { + if (TaskUtils::TaskCreateExpensive(TransmitTask, name, RFTRANSMITTER_TASK_STACK_SIZE, this, RFTRANSMITTER_TASK_PRIORITY, &m_taskHandle) != pdPASS) { ESP_LOGE(TAG, "[pin-%u] Failed to create task", m_txPin); destroy(); return; @@ -63,9 +66,6 @@ bool RFTransmitter::SendCommand(ShockerModelType model, std::uint16_t shockerId, return false; } - // Intensity must be between 0 and 99 - intensity = std::min(intensity, (std::uint8_t)99); - command_t* cmd = new command_t {.until = OpenShock::millis() + durationMs, .sequence = Rmt::GetSequence(model, shockerId, type, intensity), .zeroSequence = Rmt::GetZeroSequence(model, shockerId), .shockerId = shockerId, .overwrite = overwriteExisting}; // We will use nullptr commands to end the task, if we got a nullptr here, we are out of memory... :( diff --git a/src/radio/rmt/PetTrainerEncoder.cpp b/src/radio/rmt/PetTrainerEncoder.cpp index af53a63e..9ae3344b 100644 --- a/src/radio/rmt/PetTrainerEncoder.cpp +++ b/src/radio/rmt/PetTrainerEncoder.cpp @@ -8,6 +8,9 @@ const rmt_data_t kRmtPostamble = {200, 1, 7000, 0}; using namespace OpenShock; std::vector Rmt::PetTrainerEncoder::GetSequence(std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity) { + // Intensity must be between 0 and ?? (guessing 99) + intensity = std::min(intensity, (std::uint8_t)99); + std::uint8_t methodBit = (0x80 | (1 << ((std::uint8_t)type - 1))) & 0xFF; std::uint8_t methodChecksum = 0xFF ^ ((1 << (8 - (std::uint8_t)type)) | 1); diff --git a/src/radio/rmt/XlcEncoder.cpp b/src/radio/rmt/XlcEncoder.cpp index e9aa7c12..626ba1ca 100644 --- a/src/radio/rmt/XlcEncoder.cpp +++ b/src/radio/rmt/XlcEncoder.cpp @@ -2,6 +2,11 @@ #include "Checksum.h" +// This is the encoder for the CaiXianlin shocker. +// +// It is based on the following documentation: +// https://wiki.openshock.org/hardware/shockers/caixianlin/#rf-specification + const rmt_data_t kRmtPreamble = {1400, 1, 800, 0}; const rmt_data_t kRmtOne = {800, 1, 300, 0}; const rmt_data_t kRmtZero = {300, 1, 800, 0}; @@ -9,6 +14,9 @@ const rmt_data_t kRmtZero = {300, 1, 800, 0}; using namespace OpenShock; std::vector Rmt::XlcEncoder::GetSequence(std::uint16_t transmitterId, std::uint8_t channelId, ShockerCommandType type, std::uint8_t intensity) { + // Intensity must be between 0 and 99 + intensity = std::min(intensity, (std::uint8_t)99); + std::uint64_t data = (std::uint64_t(transmitterId) << 24) | (std::uint64_t(channelId & 0xF) << 20) | (std::uint64_t((std::uint8_t)type & 0xF) << 16) | (std::uint64_t(intensity & 0xFF) << 8); data |= Checksum::CRC8(data) & 0xFF; From 200ee2aa123c8ba9ce43e33c21d43d5a050fdb6e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 09:31:11 +0100 Subject: [PATCH 024/147] Implement serial command for reading and writing raw config (#142) * Implement getter and setter command to import/export raw config * Simplify function signatures * Return after config print * Fix base64 issues --- include/config/Config.h | 8 ++-- include/util/Base64Utils.h | 54 +++++++++++++++++++++++ src/SerialInputHandler.cpp | 65 +++++++++++++++++++++++++-- src/config/Config.cpp | 90 ++++++++++++++++++++++++++------------ src/util/Base64Utils.cpp | 77 ++++++++++++++++++++++++++++++++ 5 files changed, 259 insertions(+), 35 deletions(-) create mode 100644 include/util/Base64Utils.h create mode 100644 src/util/Base64Utils.cpp diff --git a/include/config/Config.h b/include/config/Config.h index bb8f585d..8fbe50e9 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -13,12 +13,14 @@ namespace OpenShock::Config { void Init(); - /* Get the config file translated to JSON. */ + /* GetAsJSON and SaveFromJSON are used for Reading/Writing the config file in its human-readable form. */ std::string GetAsJSON(); - - /* Save the config file from JSON. */ bool SaveFromJSON(const std::string& json); + /* GetRaw and SetRaw are used for Reading/Writing the config file in its binary form. */ + bool GetRaw(std::vector& buffer); + bool SetRaw(const std::uint8_t* buffer, std::size_t size); + /** * @brief Resets the config file to the factory default values. * diff --git a/include/util/Base64Utils.h b/include/util/Base64Utils.h new file mode 100644 index 00000000..8588bb0c --- /dev/null +++ b/include/util/Base64Utils.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include + +// IMPORTANT: WE DONT USE ARRAYS OR TEMPLATES HERE + +namespace OpenShock::Base64Utils { + /// @brief Calculates the size of the buffer required to hold the base64 encoded data. + /// @param size The size of the data to encode. + /// @return The size of the buffer required to hold the base64 encoded data. + constexpr std::size_t CalculateEncodedSize(std::size_t size) noexcept { + return (4 * (size / 3)) + 4; // TODO: This is wrong, but what mbedtls requires??? + } + + /// @brief Calculates the size of the buffer required to hold the decoded data. + /// @param size The size of the data to decode. + /// @return The size of the buffer required to hold the decoded data. + constexpr std::size_t CalculateDecodedSize(std::size_t size) noexcept { + return 3 * size / 4; + } + + /// @brief Encodes a byte array to base64. + /// @param data The data to encode. + /// @param dataLen The size of the data to encode. + /// @param output + /// @param outputLen + /// @return The amount of bytes written to the output buffer. + std::size_t Encode(const std::uint8_t* data, std::size_t dataLen, char* output, std::size_t outputLen) noexcept; + + /// @brief Encodes a byte array to base64. + /// @param data The data to encode. + /// @param dataLen The size of the data to encode. + /// @param output The output string to write to. + /// @return The amount of bytes written to the output buffer. + bool Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output) noexcept; + + /// @brief Decodes a base64 string. + /// @param data The data to decode. + /// @param dataLen The size of the data to decode. + /// @param output The output buffer to write to. + /// @param outputLen The size of the output buffer. + /// @return The amount of bytes written to the output buffer. + std::size_t Decode(const char* data, std::size_t dataLen, std::uint8_t* output, std::size_t outputLen) noexcept; + + /// @brief Decodes a base64 string. + /// @param data The data to decode. + /// @param dataLen The size of the data to decode. + /// @param output The output buffer to write to. + /// @return The amount of bytes written to the output buffer. + bool Decode(const char* data, std::size_t dataLen, std::vector& output) noexcept; +} // namespace OpenShock::Base64Utils diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 371e8332..8e62e0bd 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -3,6 +3,7 @@ #include "CommandHandler.h" #include "config/Config.h" #include "Logging.h" +#include "util/Base64Utils.h" #include "wifi/WiFiManager.h" #include @@ -12,10 +13,10 @@ const char* const TAG = "SerialInputHandler"; -#define SERPR_SYS(format, ...) Serial.printf("$SYS$|" format "\n", ##__VA_ARGS__) +#define SERPR_SYS(format, ...) Serial.printf("$SYS$|" format "\n", ##__VA_ARGS__) #define SERPR_RESPONSE(format, ...) SERPR_SYS("Response|" format, ##__VA_ARGS__) -#define SERPR_SUCCESS(format, ...) SERPR_SYS("Success|" format, ##__VA_ARGS__) -#define SERPR_ERROR(format, ...) SERPR_SYS("Error|" format, ##__VA_ARGS__) +#define SERPR_SUCCESS(format, ...) SERPR_SYS("Success|" format, ##__VA_ARGS__) +#define SERPR_ERROR(format, ...) SERPR_SYS("Error|" format, ##__VA_ARGS__) using namespace OpenShock; @@ -26,13 +27,14 @@ using namespace OpenShock; #define kCommandAuthToken "authtoken" #define kCommandNetworks "networks" #define kCommandKeepAlive "keepalive" +#define kCommandRawConfig "rawconfig" #define kCommandFactoryReset "factoryreset" void _handleHelpCommand(char* arg, std::size_t argLength) { SerialInputHandler::PrintWelcomeHeader(); if (arg == nullptr || argLength <= 0) { // Raw string literal (1+ to remove the first newline) - Serial.print(1+R"( + Serial.print(1 + R"( help print this menu help print help for a command version print version information @@ -44,6 +46,8 @@ networks get all saved networks networks set all saved networks keepalive get shocker keep-alive status keepalive enable/disable shocker keep-alive +rawconfig get raw binary config +rawconfig set raw binary config factoryreset reset device to factory defaults and reboot )"); return; @@ -113,6 +117,22 @@ keepalive [] return; } + if (strcmp(arg, kCommandRawConfig) == 0) { + Serial.print(kCommandRawConfig R"( + Get the raw binary config + Example: + rawconfig + +rawconfig + Set the raw binary config, and reboot + Arguments: + must be a base64 encoded string + Example: + rawconfig (base64 encoded binary data) +)"); + return; + } + if (strcmp(arg, kCommandFactoryReset) == 0) { Serial.print(kCommandFactoryReset R"( Reset the device to factory defaults and reboot @@ -301,6 +321,42 @@ void _handleKeepAliveCommand(char* arg, std::size_t argLength) { SERPR_SUCCESS("Saved config"); } +void _handleRawConfigCommand(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength <= 0) { + std::vector buffer; + + // Get raw config + if (!Config::GetRaw(buffer)) { + SERPR_ERROR("Failed to get raw config"); + return; + } + + std::string base64; + if (!OpenShock::Base64Utils::Encode(buffer.data(), buffer.size(), base64)) { + SERPR_ERROR("Failed to encode raw config to base64"); + return; + } + + SERPR_RESPONSE("RawConfig|%s", base64.c_str()); + return; + } + + std::vector buffer; + if (!OpenShock::Base64Utils::Decode(arg, argLength, buffer)) { + SERPR_ERROR("Failed to decode base64"); + return; + } + + if (!Config::SetRaw(buffer.data(), buffer.size())) { + SERPR_ERROR("Failed to save config"); + return; + } + + SERPR_SUCCESS("Saved config"); + + ESP.restart(); +} + static std::unordered_map s_commandHandlers = { { kCommandHelp, _handleHelpCommand}, { kCommandVersion, _handleVersionCommand}, @@ -309,6 +365,7 @@ static std::unordered_map s_commandHa { kCommandAuthToken, _handleAuthtokenCommand}, { kCommandNetworks, _handleNetworksCommand}, { kCommandKeepAlive, _handleKeepAliveCommand}, + { kCommandRawConfig, _handleRawConfigCommand}, {kCommandFactoryReset, _handleFactoryResetCommand}, }; diff --git a/src/config/Config.cpp b/src/config/Config.cpp index f7989bef..e3478279 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -16,29 +16,14 @@ using namespace OpenShock; static Config::RootConfig _mainConfig; -bool _tryLoadConfig() { - File file = LittleFS.open("/config", "rb"); - if (!file) { - ESP_LOGE(TAG, "Failed to open config file for reading"); - return false; - } - - // Get file size - std::size_t size = file.size(); - - // Allocate buffer - std::vector buffer(size); - - // Read file - if (file.read(buffer.data(), buffer.size()) != buffer.size()) { - ESP_LOGE(TAG, "Failed to read config file, size mismatch"); +bool _tryDeserializeConfig(const std::uint8_t* buffer, std::size_t bufferLen, OpenShock::Config::RootConfig& config) { + if (buffer == nullptr || bufferLen == 0) { + ESP_LOGE(TAG, "Buffer is null or empty"); return false; } - file.close(); - // Deserialize - auto fbsConfig = flatbuffers::GetRoot(buffer.data()); + auto fbsConfig = flatbuffers::GetRoot(buffer); if (fbsConfig == nullptr) { ESP_LOGE(TAG, "Failed to get deserialization root for config file"); return false; @@ -48,34 +33,60 @@ bool _tryLoadConfig() { flatbuffers::Verifier::Options verifierOptions { .max_size = 4096, // Should be enough }; - flatbuffers::Verifier verifier(buffer.data(), buffer.size(), verifierOptions); + flatbuffers::Verifier verifier(buffer, bufferLen, verifierOptions); if (!fbsConfig->Verify(verifier)) { ESP_LOGE(TAG, "Failed to verify config file integrity"); return false; } // Read config - if (!_mainConfig.FromFlatbuffers(fbsConfig)) { + if (!config.FromFlatbuffers(fbsConfig)) { ESP_LOGE(TAG, "Failed to read config file"); return false; } return true; } -bool _trySaveConfig() { - File file = LittleFS.open("/config", "wb"); +bool _tryLoadConfig(std::vector& buffer) { + File file = LittleFS.open("/config", "rb"); if (!file) { - ESP_LOGE(TAG, "Failed to open config file for writing"); + ESP_LOGE(TAG, "Failed to open config file for reading"); + return false; + } + + // Get file size + std::size_t size = file.size(); + + // Resize buffer + buffer.resize(size); + + // Read file + if (file.read(buffer.data(), buffer.size()) != buffer.size()) { + ESP_LOGE(TAG, "Failed to read config file, size mismatch"); return false; } - // Serialize - flatbuffers::FlatBufferBuilder builder(1024); + file.close(); + + return true; +} +bool _tryLoadConfig() { + std::vector buffer; + if (!_tryLoadConfig(buffer)) { + return false; + } - builder.Finish(_mainConfig.ToFlatbuffers(builder)); + return _tryDeserializeConfig(buffer.data(), buffer.size(), _mainConfig); +} +bool _trySaveConfig(const std::uint8_t* data, std::size_t dataLen) { + File file = LittleFS.open("/config", "wb"); + if (!file) { + ESP_LOGE(TAG, "Failed to open config file for writing"); + return false; + } // Write file - if (file.write(builder.GetBufferPointer(), builder.GetSize()) != builder.GetSize()) { + if (file.write(data, dataLen) != dataLen) { ESP_LOGE(TAG, "Failed to write config file"); return false; } @@ -84,6 +95,15 @@ bool _trySaveConfig() { return true; } +bool _trySaveConfig() { + flatbuffers::FlatBufferBuilder builder; + + auto fbsConfig = _mainConfig.ToFlatbuffers(builder); + + builder.Finish(fbsConfig); + + return _trySaveConfig(builder.GetBufferPointer(), builder.GetSize()); +} void Config::Init() { if (_tryLoadConfig()) { @@ -131,6 +151,20 @@ bool Config::SaveFromJSON(const std::string& json) { return _trySaveConfig(); } +bool Config::GetRaw(std::vector& buffer) { + return _tryLoadConfig(buffer); +} + +bool Config::SetRaw(const std::uint8_t* buffer, std::size_t size) { + OpenShock::Config::RootConfig config; + if (!_tryDeserializeConfig(buffer, size, config)) { + ESP_LOGE(TAG, "Failed to deserialize config"); + return false; + } + + return _trySaveConfig(buffer, size); +} + void Config::FactoryReset() { if (!LittleFS.remove("/config") && LittleFS.exists("/config")) { ESP_PANIC(TAG, "Failed to remove existing config file for factory reset. Reccomend formatting microcontroller and re-flashing firmware"); diff --git a/src/util/Base64Utils.cpp b/src/util/Base64Utils.cpp new file mode 100644 index 00000000..dc87c59b --- /dev/null +++ b/src/util/Base64Utils.cpp @@ -0,0 +1,77 @@ +#include "util/Base64Utils.h" + +#include "Logging.h" + +#include + +const char* const TAG = "Base64Utils"; + +using namespace OpenShock; + +std::size_t Base64Utils::Encode(const std::uint8_t* data, std::size_t dataLen, char* output, std::size_t outputLen) noexcept { + std::size_t requiredLen = 0; + + int retval = mbedtls_base64_encode(reinterpret_cast(output), outputLen, &requiredLen, data, dataLen); + if (retval != 0) { + if (retval == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) { + ESP_LOGW(TAG, "Output buffer too small (expected %zu, got %zu)", requiredLen, outputLen); + } else { + ESP_LOGW(TAG, "Failed to encode data, unknown error: %d", retval); + } + return 0; + } + + return requiredLen; +} + +bool Base64Utils::Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output) noexcept { + std::size_t requiredLen = Base64Utils::CalculateEncodedSize(dataLen) + 1; // +1 for null terminator + output.resize(requiredLen); + + std::size_t written = Encode(data, dataLen, const_cast(output.data()), output.size()); + if (written == 0) { + output.clear(); + return false; + } + + if (written < requiredLen) { + output.resize(written); + } + + return true; +} + +std::size_t Base64Utils::Decode(const char* data, std::size_t dataLen, std::uint8_t* output, std::size_t outputLen) noexcept { + std::size_t requiredLen = 0; + + int retval = mbedtls_base64_decode(output, outputLen, &requiredLen, reinterpret_cast(data), dataLen); + if (retval != 0) { + if (retval == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) { + ESP_LOGW(TAG, "Output buffer too small (expected %zu, got %zu)", requiredLen, outputLen); + } else if (retval == MBEDTLS_ERR_BASE64_INVALID_CHARACTER) { + ESP_LOGW(TAG, "Invalid character in input data"); + } else { + ESP_LOGW(TAG, "Failed to decode data, unknown error: %d", retval); + } + return 0; + } + + return requiredLen; +} + +bool Base64Utils::Decode(const char* data, std::size_t dataLen, std::vector& output) noexcept { + std::size_t requiredLen = Base64Utils::CalculateDecodedSize(dataLen); + output.resize(requiredLen); + + std::size_t written = Decode(data, dataLen, output.data(), output.size()); + if (written == 0) { + output.clear(); + return false; + } + + if (written < requiredLen) { + output.resize(written); + } + + return true; +} From 635b9f5c0ff580301d1c97ebfb7b1579be7a9c60 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 09:34:05 +0100 Subject: [PATCH 025/147] Remove misleading comment --- include/util/Base64Utils.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/util/Base64Utils.h b/include/util/Base64Utils.h index 8588bb0c..0df03662 100644 --- a/include/util/Base64Utils.h +++ b/include/util/Base64Utils.h @@ -5,8 +5,6 @@ #include #include -// IMPORTANT: WE DONT USE ARRAYS OR TEMPLATES HERE - namespace OpenShock::Base64Utils { /// @brief Calculates the size of the buffer required to hold the base64 encoded data. /// @param size The size of the data to encode. From 624774acae0a979ac000eaa84c40be700a162ec5 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 09:43:28 +0100 Subject: [PATCH 026/147] Show warning when no LED implementation is defined (#143) --- src/VisualStateManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/VisualStateManager.cpp b/src/VisualStateManager.cpp index 1038b28a..c4a70539 100644 --- a/src/VisualStateManager.cpp +++ b/src/VisualStateManager.cpp @@ -15,6 +15,10 @@ #endif // OPENSHOCK_LED_IMPLEMENTATION #endif // OPENSHOCK_LED_WS2812B +#ifndef OPENSHOCK_LED_IMPLEMENTATION +#warning "No LED implementation selected, board will not be able to indicate its status visually" +#endif // OPENSHOCK_LED_IMPLEMENTATION + #include "Logging.h" #include From 2f775bfc79e0a6e36526143670d3f77c8bf76ae6 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 09:49:11 +0100 Subject: [PATCH 027/147] Fix weird logging of received command list --- src/event_handlers/websocket/gateway/ShockerCommandList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event_handlers/websocket/gateway/ShockerCommandList.cpp b/src/event_handlers/websocket/gateway/ShockerCommandList.cpp index d1b9f6a2..55cdd99e 100644 --- a/src/event_handlers/websocket/gateway/ShockerCommandList.cpp +++ b/src/event_handlers/websocket/gateway/ShockerCommandList.cpp @@ -23,7 +23,7 @@ void _Private::HandleShockerCommandList(const OpenShock::Serialization::ServerTo return; } - ESP_LOGV(TAG, "Received command list from API (%llu commands)", commands->size()); + ESP_LOGV(TAG, "Received command list from API (%u commands)", commands->size()); for (auto command : *commands) { std::uint16_t id = command->id(); From b68fe895dafa5abe2c8799aed5969fe19f5f50ef Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 11:04:12 +0100 Subject: [PATCH 028/147] Implement sending shocker commands via serial (#144) --- include/serialization/JsonSerial.h | 20 +++++ src/SerialInputHandler.cpp | 45 ++++++++++++ src/serialization/JsonSerial.cpp | 113 +++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 include/serialization/JsonSerial.h create mode 100644 src/serialization/JsonSerial.cpp diff --git a/include/serialization/JsonSerial.h b/include/serialization/JsonSerial.h new file mode 100644 index 00000000..06e8baae --- /dev/null +++ b/include/serialization/JsonSerial.h @@ -0,0 +1,20 @@ +#pragma once + +#include "ShockerModelType.h" +#include "ShockerCommandType.h" + +#include + +#include + +namespace OpenShock::Serialization::JsonSerial { + struct ShockerCommand { + OpenShock::ShockerModelType model; + std::uint16_t id; + OpenShock::ShockerCommandType command; + std::uint8_t intensity; + std::uint16_t durationMs; + }; + + bool ParseShockerCommand(const cJSON* root, ShockerCommand& out); +} // namespace OpenShock::Serialization::JsonAPI diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 8e62e0bd..256ef639 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -3,6 +3,7 @@ #include "CommandHandler.h" #include "config/Config.h" #include "Logging.h" +#include "serialization/JsonSerial.h" #include "util/Base64Utils.h" #include "wifi/WiFiManager.h" @@ -28,6 +29,7 @@ using namespace OpenShock; #define kCommandNetworks "networks" #define kCommandKeepAlive "keepalive" #define kCommandRawConfig "rawconfig" +#define kCommandRFTransmit "rftransmit" #define kCommandFactoryReset "factoryreset" void _handleHelpCommand(char* arg, std::size_t argLength) { @@ -48,6 +50,7 @@ keepalive get shocker keep-alive status keepalive enable/disable shocker keep-alive rawconfig get raw binary config rawconfig set raw binary config +rftransmit transmit a RF command factoryreset reset device to factory defaults and reboot )"); return; @@ -162,6 +165,22 @@ rawconfig return; } + if (strcmp(arg, kCommandRFTransmit) == 0) { + Serial.print(kCommandRFTransmit R"( + Transmit a RF command + Arguments: + must be a JSON object with the following fields: + model (string) Model of the shocker ("CaiXianlin", "PetTrainer") + id (number) ID of the shocker (0-65535) + type (string) Type of the command ("shock", "vibrate", "sound", "stop") + intensity (number) Intensity of the command (0-255) + durationMs (number) Duration of the command in milliseconds (0-65535) + Example: + rftransmit {\"model\":\"cai-xianlin\",\"id\":12345,\"type\":\"shock\",\"intensity\":99,\"duration\":500} +)"); + return; + } + Serial.println("Command not found"); } @@ -357,6 +376,31 @@ void _handleRawConfigCommand(char* arg, std::size_t argLength) { ESP.restart(); } +void _handleRFTransmitCommand(char* arg, std::size_t argLength) { + cJSON* root = cJSON_ParseWithLength(arg, argLength); + if (root == nullptr) { + SERPR_ERROR("Failed to parse JSON: %s", cJSON_GetErrorPtr()); + return; + } + + OpenShock::Serialization::JsonSerial::ShockerCommand cmd; + bool parsed = Serialization::JsonSerial::ParseShockerCommand(root, cmd); + + cJSON_Delete(root); + + if (!parsed) { + SERPR_ERROR("Failed to parse shocker command"); + return; + } + + if (!OpenShock::CommandHandler::HandleCommand(cmd.model, cmd.id, cmd.command, cmd.intensity, cmd.durationMs)) { + SERPR_ERROR("Failed to send command"); + return; + } + + SERPR_SUCCESS("Command sent"); +} + static std::unordered_map s_commandHandlers = { { kCommandHelp, _handleHelpCommand}, { kCommandVersion, _handleVersionCommand}, @@ -366,6 +410,7 @@ static std::unordered_map s_commandHa { kCommandNetworks, _handleNetworksCommand}, { kCommandKeepAlive, _handleKeepAliveCommand}, { kCommandRawConfig, _handleRawConfigCommand}, + { kCommandRFTransmit, _handleRFTransmitCommand}, {kCommandFactoryReset, _handleFactoryResetCommand}, }; diff --git a/src/serialization/JsonSerial.cpp b/src/serialization/JsonSerial.cpp new file mode 100644 index 00000000..4e284ac7 --- /dev/null +++ b/src/serialization/JsonSerial.cpp @@ -0,0 +1,113 @@ +#include "serialization/JsonSerial.h" + +#include "Logging.h" + +const char* const TAG = "JsonSerial"; + +using namespace OpenShock::Serialization; + +bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerCommand& out) { + if (!cJSON_IsObject(root)) { + ESP_LOGE(TAG, "not an object"); + return false; + } + + const cJSON* model = cJSON_GetObjectItemCaseSensitive(root, "model"); + if (model == nullptr) { + ESP_LOGE(TAG, "missing 'model' field"); + return false; + } + if (!cJSON_IsString(model)) { + ESP_LOGE(TAG, "value at 'model' is not a string"); + return false; + } + ShockerModelType modelType; + if (strcmp(model->valuestring, "CaiXianlin") == 0 || strcmp(model->valuestring, "CaiXianLin") == 0 || strcmp(model->valuestring, "CXL") == 0) { + modelType = ShockerModelType::CaiXianlin; + } else if (strcmp(model->valuestring, "PetTrainer") == 0 || strcmp(model->valuestring, "PT") == 0) { + modelType = ShockerModelType::PetTrainer; + } else { + ESP_LOGE(TAG, "value at 'model' is not a valid shocker model (CaiXianlin, PetTrainer)"); + return false; + } + + const cJSON* id = cJSON_GetObjectItemCaseSensitive(root, "id"); + if (id == nullptr) { + ESP_LOGE(TAG, "missing 'id' field"); + return false; + } + if (!cJSON_IsNumber(id)) { + ESP_LOGE(TAG, "value at 'id' is not a number"); + return false; + } + int idInt = id->valueint; + if (idInt < 0 || idInt > UINT16_MAX) { + ESP_LOGE(TAG, "value at 'id' is out of range (0-65535)"); + return false; + } + std::uint16_t idU16 = static_cast(idInt); + + const cJSON* command = cJSON_GetObjectItemCaseSensitive(root, "type"); + if (command == nullptr) { + ESP_LOGE(TAG, "missing 'type' field"); + return false; + } + if (!cJSON_IsString(command)) { + ESP_LOGE(TAG, "value at 'type' is not a string"); + return false; + } + ShockerCommandType commandType; + if (strcmp(command->valuestring, "Stop") == 0) { + commandType = ShockerCommandType::Stop; + } else if (strcmp(command->valuestring, "Shock") == 0) { + commandType = ShockerCommandType::Shock; + } else if (strcmp(command->valuestring, "Vibrate") == 0) { + commandType = ShockerCommandType::Vibrate; + } else if (strcmp(command->valuestring, "Sound") == 0) { + commandType = ShockerCommandType::Sound; + } else { + ESP_LOGE(TAG, "value at 'type' is not a valid shocker command (Stop, Shock, Vibrate, Sound)"); + return false; + } + + const cJSON* intensity = cJSON_GetObjectItemCaseSensitive(root, "intensity"); + if (intensity == nullptr) { + ESP_LOGE(TAG, "missing 'intensity' field"); + return false; + } + if (!cJSON_IsNumber(intensity)) { + ESP_LOGE(TAG, "value at 'intensity' is not a number"); + return false; + } + int intensityInt = intensity->valueint; + if (intensityInt < 0 || intensityInt > UINT8_MAX) { + ESP_LOGE(TAG, "value at 'intensity' is out of range (0-255)"); + return false; + } + std::uint8_t intensityU8 = static_cast(intensityInt); + + const cJSON* durationMs = cJSON_GetObjectItemCaseSensitive(root, "durationMs"); + if (durationMs == nullptr) { + ESP_LOGE(TAG, "missing 'durationMs' field"); + return false; + } + if (!cJSON_IsNumber(durationMs)) { + ESP_LOGE(TAG, "value at 'durationMs' is not a number"); + return false; + } + if (durationMs->valueint < 0 || durationMs->valueint > UINT16_MAX) { + ESP_LOGE(TAG, "value at 'durationMs' is out of range (0-65535)"); + return false; + } + std::uint16_t durationMsU16 = static_cast(durationMs->valueint); + + out = { + .model = modelType, + .id = idU16, + .command = commandType, + .intensity = intensityU8, + .durationMs = durationMsU16, + }; + + return true; +} From 547fa24aea5be7278986a57f6fe44e165c8390fd Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 12:34:08 +0100 Subject: [PATCH 029/147] Make VSCode STFU --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e67a2fd2..daa26996 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .pio .vscode/.browse.c_cpp.db* .vscode/c_cpp_properties.json +.vscode/extensions.json .vscode/launch.json .vscode/ipch *.bin From 28b171b1031b4fd4451e3e7c868677879b90b7e3 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 1 Dec 2023 13:08:10 +0100 Subject: [PATCH 030/147] Update README.md --- README.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a29b5e0f..045fa202 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,34 @@ -# OpenShock (ESP-32) Firmware +# OpenShock Espressif Firmware -ESP-32 Firmware for OpenShock. Controlling shockers via 433 MHz RF. +Espressif Firmware for OpenShock. + +Controlling shockers via Reverse engineered proprietary Sub-1 GHz Protocols. ## Compatible Hardware -You will need a ESP-32 and a 433 MHz antenna attached to it. For more info about buying such hardware see here [OpenShock Wiki - Hardware: Buy](https://docs.shocklink.net/en/Hardware/Buy). -Guide for assembly can be found here [OpenShock Wiki - Hardware: Assembly](https://docs.shocklink.net/en/Hardware/Assembly) +You will need a ESP-32 and a 433 MHz antenna attached to it. + +For more info about buying such hardware see here [OpenShock Wiki - Vendors: Hardware](https://wiki.openshock.org/vendors/hardware/). + +Guide for assembly can be found here [OpenShock Wiki - DIY: Assembling](https://wiki.openshock.org/diy/assembling/) -Confirmed working ESP's: +Confirmed working boards: -- Wemos Mini D1 ESP32-WROOM-32 +- PiShock + - 2021 Q3 + - 2023 +- Seeed + - Xiao ESP32S3 +- Wemos + - D1 Mini + - Lolin S2 Mini + - Lolin S3 +- OpenShock (Legacy) + - Core V1 ## Flashing -Refer to [OpenShock Wiki - Device: Flashing](https://docs.shocklink.net/en/Device/Setup/Flashing) on how to flash your micro controller. +Refer to [OpenShock Wiki - Guides: First time setup](https://wiki.openshock.org/guides/openshock-first-setup/) on how to set up your microcontroller. Other than that, you can just flash via platform io in vscode. More in the contribute section. From 0b977e1bc5449a08612f0695e9f8b7761a50951c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 11:24:58 +0100 Subject: [PATCH 031/147] build(deps-dev): Bump the npm-dependencies group in /WebUI with 9 updates (#146) * build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 9 updates: | Package | From | To | | --- | --- | --- | | [@playwright/test](https://github.com/microsoft/playwright) | `1.40.0` | `1.40.1` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.10.0` | `20.10.3` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.12.0` | `6.13.1` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.12.0` | `6.13.1` | | [eslint](https://github.com/eslint/eslint) | `8.54.0` | `8.55.0` | | [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) | `9.0.0` | `9.1.0` | | [postcss](https://github.com/postcss/postcss) | `8.4.31` | `8.4.32` | | [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) | `4.2.7` | `4.2.8` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `4.5.0` | `5.0.4` | Updates `@playwright/test` from 1.40.0 to 1.40.1 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.40.0...v1.40.1) Updates `@types/node` from 20.10.0 to 20.10.3 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.12.0 to 6.13.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.13.1/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.12.0 to 6.13.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.13.1/packages/parser) Updates `eslint` from 8.54.0 to 8.55.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.54.0...v8.55.0) Updates `eslint-config-prettier` from 9.0.0 to 9.1.0 - [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-config-prettier/compare/v9.0.0...v9.1.0) Updates `postcss` from 8.4.31 to 8.4.32 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.31...8.4.32) Updates `svelte` from 4.2.7 to 4.2.8 - [Release notes](https://github.com/sveltejs/svelte/releases) - [Changelog](https://github.com/sveltejs/svelte/blob/svelte@4.2.8/packages/svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/svelte/commits/svelte@4.2.8/packages/svelte) Updates `vite` from 4.5.0 to 5.0.4 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.4/packages/vite) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: eslint-config-prettier dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: svelte dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] * Revert vite back to ^4.5.0 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: hhvrc --- WebUI/package-lock.json | 184 ++++++++++++++++++++-------------------- WebUI/package.json | 18 ++-- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 2b85d643..42df5bd2 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -11,31 +11,31 @@ "@floating-ui/dom": "1.5.3" }, "devDependencies": { - "@playwright/test": "1.40.0", + "@playwright/test": "1.40.1", "@skeletonlabs/skeleton": "2.5.1", "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-static": "2.0.3", "@sveltejs/kit": "1.27.6", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.0", - "@typescript-eslint/eslint-plugin": "6.12.0", - "@typescript-eslint/parser": "6.12.0", + "@types/node": "20.10.3", + "@typescript-eslint/eslint-plugin": "6.13.1", + "@typescript-eslint/parser": "6.13.1", "autoprefixer": "10.4.16", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", "npm-check-updates": "16.14.11", - "postcss": "8.4.31", + "postcss": "8.4.32", "prettier": "3.1.0", "prettier-plugin-svelte": "3.1.2", - "svelte": "4.2.7", + "svelte": "4.2.8", "svelte-check": "3.6.2", "tailwindcss": "3.3.5", "tslib": "2.6.2", "typescript": "5.3.2", - "vite": "^4.0.0", + "vite": "^4.5.0", "vite-plugin-tailwind-purgecss": "0.1.4", "vitest": "0.34.6" } @@ -461,9 +461,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -484,9 +484,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -867,12 +867,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz", - "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", + "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", "dev": true, "dependencies": { - "playwright": "1.40.0" + "playwright": "1.40.1" }, "bin": { "playwright": "cli.js" @@ -1229,9 +1229,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1250,16 +1250,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", - "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/type-utils": "6.12.0", - "@typescript-eslint/utils": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1285,15 +1285,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -1313,13 +1313,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1330,13 +1330,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", - "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1357,9 +1357,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1370,13 +1370,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1397,17 +1397,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -1422,12 +1422,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2761,15 +2761,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2828,9 +2828,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -4477,9 +4477,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -5234,12 +5234,12 @@ } }, "node_modules/playwright": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz", - "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", + "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", "dev": true, "dependencies": { - "playwright-core": "1.40.0" + "playwright-core": "1.40.1" }, "bin": { "playwright": "cli.js" @@ -5252,9 +5252,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz", - "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", + "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -5264,9 +5264,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -5283,7 +5283,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6523,9 +6523,9 @@ } }, "node_modules/svelte": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.7.tgz", - "integrity": "sha512-UExR1KS7raTdycsUrKLtStayu4hpdV3VZQgM0akX8XbXgLBlosdE/Sf3crOgyh9xIjqSYB3UEBuUlIQKRQX2hg==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.8.tgz", + "integrity": "sha512-hU6dh1MPl8gh6klQZwK/n73GiAHiR95IkFsesLPbMeEZi36ydaXL/ZAb4g9sayT0MXzpxyZjR28yderJHxcmYA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -7202,9 +7202,9 @@ } }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", diff --git a/WebUI/package.json b/WebUI/package.json index 303b84df..806ac0e8 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -15,31 +15,31 @@ "test:unit": "vitest" }, "devDependencies": { - "@playwright/test": "1.40.0", + "@playwright/test": "1.40.1", "@skeletonlabs/skeleton": "2.5.1", "@skeletonlabs/tw-plugin": "0.2.4", "@sveltejs/adapter-static": "2.0.3", "@sveltejs/kit": "1.27.6", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.0", - "@typescript-eslint/eslint-plugin": "6.12.0", - "@typescript-eslint/parser": "6.12.0", + "@types/node": "20.10.3", + "@typescript-eslint/eslint-plugin": "6.13.1", + "@typescript-eslint/parser": "6.13.1", "autoprefixer": "10.4.16", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", "npm-check-updates": "16.14.11", - "postcss": "8.4.31", + "postcss": "8.4.32", "prettier": "3.1.0", "prettier-plugin-svelte": "3.1.2", - "svelte": "4.2.7", + "svelte": "4.2.8", "svelte-check": "3.6.2", "tailwindcss": "3.3.5", "tslib": "2.6.2", "typescript": "5.3.2", - "vite": "^4.0.0", + "vite": "^4.5.0", "vite-plugin-tailwind-purgecss": "0.1.4", "vitest": "0.34.6" }, From 36b4db3e3351d8cdb9a76c6c6741c74dabc11df3 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Mon, 4 Dec 2023 15:13:03 +0100 Subject: [PATCH 032/147] Radio code cleanup (#147) --- .../serialization/types/shocker-model-type.ts | 2 +- include/radio/rmt/CaiXianlinEncoder.h | 12 ++++++++++++ ...{PetTrainerEncoder.h => PetrainerEncoder.h} | 2 +- include/radio/rmt/XlcEncoder.h | 15 --------------- .../_fbs/ShockerModelType_generated.h | 10 +++++----- schemas/Types/ShockerModelType.fbs | 2 +- src/SerialInputHandler.cpp | 4 ++-- .../{XlcEncoder.cpp => CaiXianlinEncoder.cpp} | 4 ++-- src/radio/rmt/MainEncoder.cpp | 17 ++++++++--------- ...TrainerEncoder.cpp => PetrainerEncoder.cpp} | 8 ++++---- src/serialization/JsonAPI.cpp | 6 +++--- src/serialization/JsonSerial.cpp | 18 +++++++++--------- 12 files changed, 48 insertions(+), 52 deletions(-) create mode 100644 include/radio/rmt/CaiXianlinEncoder.h rename include/radio/rmt/{PetTrainerEncoder.h => PetrainerEncoder.h} (83%) delete mode 100644 include/radio/rmt/XlcEncoder.h rename src/radio/rmt/{XlcEncoder.cpp => CaiXianlinEncoder.cpp} (83%) rename src/radio/rmt/{PetTrainerEncoder.cpp => PetrainerEncoder.cpp} (74%) diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts b/WebUI/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts index 90981952..f83b16d5 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts @@ -2,5 +2,5 @@ export enum ShockerModelType { CaiXianlin = 0, - PetTrainer = 1 + Petrainer = 1 } diff --git a/include/radio/rmt/CaiXianlinEncoder.h b/include/radio/rmt/CaiXianlinEncoder.h new file mode 100644 index 00000000..bf7f4e26 --- /dev/null +++ b/include/radio/rmt/CaiXianlinEncoder.h @@ -0,0 +1,12 @@ +#pragma once + +#include "ShockerCommandType.h" + +#include + +#include +#include + +namespace OpenShock::Rmt::CaiXianlinEncoder { + std::vector GetSequence(std::uint16_t transmitterId, std::uint8_t channelId, OpenShock::ShockerCommandType type, std::uint8_t intensity); +} diff --git a/include/radio/rmt/PetTrainerEncoder.h b/include/radio/rmt/PetrainerEncoder.h similarity index 83% rename from include/radio/rmt/PetTrainerEncoder.h rename to include/radio/rmt/PetrainerEncoder.h index 52b354a8..1ccaace8 100644 --- a/include/radio/rmt/PetTrainerEncoder.h +++ b/include/radio/rmt/PetrainerEncoder.h @@ -7,6 +7,6 @@ #include #include -namespace OpenShock::Rmt::PetTrainerEncoder { +namespace OpenShock::Rmt::PetrainerEncoder { std::vector GetSequence(std::uint16_t shockerId, OpenShock::ShockerCommandType type, std::uint8_t intensity); } diff --git a/include/radio/rmt/XlcEncoder.h b/include/radio/rmt/XlcEncoder.h deleted file mode 100644 index 968e9aec..00000000 --- a/include/radio/rmt/XlcEncoder.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "ShockerCommandType.h" - -#include - -#include -#include - -namespace OpenShock::Rmt::XlcEncoder { - std::vector GetSequence(std::uint16_t transmitterId, - std::uint8_t channelId, - OpenShock::ShockerCommandType type, - std::uint8_t intensity); -} diff --git a/include/serialization/_fbs/ShockerModelType_generated.h b/include/serialization/_fbs/ShockerModelType_generated.h index a8a826c9..f55fc512 100644 --- a/include/serialization/_fbs/ShockerModelType_generated.h +++ b/include/serialization/_fbs/ShockerModelType_generated.h @@ -19,15 +19,15 @@ namespace Types { enum class ShockerModelType : uint8_t { CaiXianlin = 0, - PetTrainer = 1, + Petrainer = 1, MIN = CaiXianlin, - MAX = PetTrainer + MAX = Petrainer }; inline const ShockerModelType (&EnumValuesShockerModelType())[2] { static const ShockerModelType values[] = { ShockerModelType::CaiXianlin, - ShockerModelType::PetTrainer + ShockerModelType::Petrainer }; return values; } @@ -35,14 +35,14 @@ inline const ShockerModelType (&EnumValuesShockerModelType())[2] { inline const char * const *EnumNamesShockerModelType() { static const char * const names[3] = { "CaiXianlin", - "PetTrainer", + "Petrainer", nullptr }; return names; } inline const char *EnumNameShockerModelType(ShockerModelType e) { - if (::flatbuffers::IsOutRange(e, ShockerModelType::CaiXianlin, ShockerModelType::PetTrainer)) return ""; + if (::flatbuffers::IsOutRange(e, ShockerModelType::CaiXianlin, ShockerModelType::Petrainer)) return ""; const size_t index = static_cast(e); return EnumNamesShockerModelType()[index]; } diff --git a/schemas/Types/ShockerModelType.fbs b/schemas/Types/ShockerModelType.fbs index 5e03e7d3..606e3df4 100644 --- a/schemas/Types/ShockerModelType.fbs +++ b/schemas/Types/ShockerModelType.fbs @@ -2,5 +2,5 @@ namespace OpenShock.Serialization.Types; enum ShockerModelType : uint8 { CaiXianlin = 0, - PetTrainer = 1 + Petrainer = 1 } diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 256ef639..d0d88880 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -170,13 +170,13 @@ rawconfig Transmit a RF command Arguments: must be a JSON object with the following fields: - model (string) Model of the shocker ("CaiXianlin", "PetTrainer") + model (string) Model of the shocker ("caixianlin", "petrainer") id (number) ID of the shocker (0-65535) type (string) Type of the command ("shock", "vibrate", "sound", "stop") intensity (number) Intensity of the command (0-255) durationMs (number) Duration of the command in milliseconds (0-65535) Example: - rftransmit {\"model\":\"cai-xianlin\",\"id\":12345,\"type\":\"shock\",\"intensity\":99,\"duration\":500} + rftransmit {"model":"caixianlin","id":12345,"type":"shock","intensity":99,"duration_ms":500} )"); return; } diff --git a/src/radio/rmt/XlcEncoder.cpp b/src/radio/rmt/CaiXianlinEncoder.cpp similarity index 83% rename from src/radio/rmt/XlcEncoder.cpp rename to src/radio/rmt/CaiXianlinEncoder.cpp index 626ba1ca..63aafe47 100644 --- a/src/radio/rmt/XlcEncoder.cpp +++ b/src/radio/rmt/CaiXianlinEncoder.cpp @@ -1,4 +1,4 @@ -#include "radio/rmt/XlcEncoder.h" +#include "radio/rmt/CaiXianlinEncoder.h" #include "Checksum.h" @@ -13,7 +13,7 @@ const rmt_data_t kRmtZero = {300, 1, 800, 0}; using namespace OpenShock; -std::vector Rmt::XlcEncoder::GetSequence(std::uint16_t transmitterId, std::uint8_t channelId, ShockerCommandType type, std::uint8_t intensity) { +std::vector Rmt::CaiXianlinEncoder::GetSequence(std::uint16_t transmitterId, std::uint8_t channelId, ShockerCommandType type, std::uint8_t intensity) { // Intensity must be between 0 and 99 intensity = std::min(intensity, (std::uint8_t)99); diff --git a/src/radio/rmt/MainEncoder.cpp b/src/radio/rmt/MainEncoder.cpp index 59f93cc4..5da09093 100644 --- a/src/radio/rmt/MainEncoder.cpp +++ b/src/radio/rmt/MainEncoder.cpp @@ -1,9 +1,8 @@ #include "radio/rmt/MainEncoder.h" #include "Logging.h" -#include "radio/rmt/PetTrainerEncoder.h" -#include "radio/rmt/XlcEncoder.h" - +#include "radio/rmt/CaiXianlinEncoder.h" +#include "radio/rmt/PetrainerEncoder.h" #include @@ -13,10 +12,10 @@ using namespace OpenShock; std::vector Rmt::GetSequence(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity) { switch (model) { - case ShockerModelType::PetTrainer: - return Rmt::PetTrainerEncoder::GetSequence(shockerId, type, intensity); + case ShockerModelType::Petrainer: + return Rmt::PetrainerEncoder::GetSequence(shockerId, type, intensity); case ShockerModelType::CaiXianlin: - return Rmt::XlcEncoder::GetSequence(shockerId, 0, type, intensity); + return Rmt::CaiXianlinEncoder::GetSequence(shockerId, 0, type, intensity); default: ESP_LOGE(TAG, "Unknown shocker model: %u", model); return {}; @@ -30,11 +29,11 @@ std::shared_ptr> Rmt::GetZeroSequence(ShockerModelType m std::shared_ptr> sequence; switch (model) { - case ShockerModelType::PetTrainer: - sequence = std::make_shared>(Rmt::PetTrainerEncoder::GetSequence(shockerId, ShockerCommandType::Vibrate, 0)); + case ShockerModelType::Petrainer: + sequence = std::make_shared>(Rmt::PetrainerEncoder::GetSequence(shockerId, ShockerCommandType::Vibrate, 0)); break; case ShockerModelType::CaiXianlin: - sequence = std::make_shared>(Rmt::XlcEncoder::GetSequence(shockerId, 0, ShockerCommandType::Vibrate, 0)); + sequence = std::make_shared>(Rmt::CaiXianlinEncoder::GetSequence(shockerId, 0, ShockerCommandType::Vibrate, 0)); break; default: ESP_LOGE(TAG, "Unknown shocker model: %u", model); diff --git a/src/radio/rmt/PetTrainerEncoder.cpp b/src/radio/rmt/PetrainerEncoder.cpp similarity index 74% rename from src/radio/rmt/PetTrainerEncoder.cpp rename to src/radio/rmt/PetrainerEncoder.cpp index 9ae3344b..065f21c5 100644 --- a/src/radio/rmt/PetTrainerEncoder.cpp +++ b/src/radio/rmt/PetrainerEncoder.cpp @@ -1,4 +1,4 @@ -#include "radio/rmt/PetTrainerEncoder.h" +#include "radio/rmt/PetrainerEncoder.h" const rmt_data_t kRmtPreamble = {750, 1, 750, 0}; const rmt_data_t kRmtOne = {200, 1, 1500, 0}; @@ -7,9 +7,9 @@ const rmt_data_t kRmtPostamble = {200, 1, 7000, 0}; using namespace OpenShock; -std::vector Rmt::PetTrainerEncoder::GetSequence(std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity) { - // Intensity must be between 0 and ?? (guessing 99) - intensity = std::min(intensity, (std::uint8_t)99); +std::vector Rmt::PetrainerEncoder::GetSequence(std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity) { + // Intensity must be between 0 and 100 + intensity = std::min(intensity, (std::uint8_t)100); std::uint8_t methodBit = (0x80 | (1 << ((std::uint8_t)type - 1))) & 0xFF; std::uint8_t methodChecksum = 0xFF ^ ((1 << (8 - (std::uint8_t)type)) | 1); diff --git a/src/serialization/JsonAPI.cpp b/src/serialization/JsonAPI.cpp index b486d749..044468de 100644 --- a/src/serialization/JsonAPI.cpp +++ b/src/serialization/JsonAPI.cpp @@ -105,10 +105,10 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: } OpenShock::ShockerModelType shockerModelType; - if (strcmp(shockerModelStr, "CaiXianlin") == 0 || strcmp(shockerModelStr, "CaiXianLin") == 0 || strcmp(shockerModelStr, "XLC") == 0 || strcmp(shockerModelStr, "CXL") == 0) { + if (strcmp(shockerModelStr, "caixianlin") == 0 || strcmp(shockerModelStr, "cai-xianlin") == 0 || strcmp(shockerModelStr, "CaiXianlin") == 0) { shockerModelType = OpenShock::ShockerModelType::CaiXianlin; - } else if (strcmp(shockerModelStr, "PetTrainer") == 0 || strcmp(shockerModelStr, "PT") == 0) { - shockerModelType = OpenShock::ShockerModelType::PetTrainer; + } else if (strcmp(shockerModelStr, "petrainer") == 0 || strcmp(shockerModelStr, "Petrainer") == 0) { + shockerModelType = OpenShock::ShockerModelType::Petrainer; } else { ESP_LOGJSONE("value at 'shocker.model' is not a valid shocker model", shocker); return false; diff --git a/src/serialization/JsonSerial.cpp b/src/serialization/JsonSerial.cpp index 4e284ac7..aa40815a 100644 --- a/src/serialization/JsonSerial.cpp +++ b/src/serialization/JsonSerial.cpp @@ -22,12 +22,12 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma return false; } ShockerModelType modelType; - if (strcmp(model->valuestring, "CaiXianlin") == 0 || strcmp(model->valuestring, "CaiXianLin") == 0 || strcmp(model->valuestring, "CXL") == 0) { + if (strcmp(model->valuestring, "caixianlin") == 0) { modelType = ShockerModelType::CaiXianlin; - } else if (strcmp(model->valuestring, "PetTrainer") == 0 || strcmp(model->valuestring, "PT") == 0) { - modelType = ShockerModelType::PetTrainer; + } else if (strcmp(model->valuestring, "petrainer") == 0) { + modelType = ShockerModelType::Petrainer; } else { - ESP_LOGE(TAG, "value at 'model' is not a valid shocker model (CaiXianlin, PetTrainer)"); + ESP_LOGE(TAG, "value at 'model' is not a valid shocker model (caixianlin, petrainer)"); return false; } @@ -57,16 +57,16 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma return false; } ShockerCommandType commandType; - if (strcmp(command->valuestring, "Stop") == 0) { + if (strcmp(command->valuestring, "stop") == 0) { commandType = ShockerCommandType::Stop; - } else if (strcmp(command->valuestring, "Shock") == 0) { + } else if (strcmp(command->valuestring, "shock") == 0) { commandType = ShockerCommandType::Shock; - } else if (strcmp(command->valuestring, "Vibrate") == 0) { + } else if (strcmp(command->valuestring, "vibrate") == 0) { commandType = ShockerCommandType::Vibrate; - } else if (strcmp(command->valuestring, "Sound") == 0) { + } else if (strcmp(command->valuestring, "sound") == 0) { commandType = ShockerCommandType::Sound; } else { - ESP_LOGE(TAG, "value at 'type' is not a valid shocker command (Stop, Shock, Vibrate, Sound)"); + ESP_LOGE(TAG, "value at 'type' is not a valid shocker command (stop, shock, vibrate, sound)"); return false; } From 10930a989e04594bd9e28cd632af0e79578f5f04 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Mon, 4 Dec 2023 15:17:39 +0100 Subject: [PATCH 033/147] Bugfix: xlc rmt encoder postamble (#148) * Fix postamble and add BitEncoder * Simplify (ish) Petrainer encoder --- include/radio/rmt/internal/Shared.h | 21 +++++++++++++++++ src/radio/rmt/CaiXianlinEncoder.cpp | 36 +++++++++++++++++++++++------ src/radio/rmt/PetrainerEncoder.cpp | 32 ++++++++++++++++++++----- 3 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 include/radio/rmt/internal/Shared.h diff --git a/include/radio/rmt/internal/Shared.h b/include/radio/rmt/internal/Shared.h new file mode 100644 index 00000000..6f627e9e --- /dev/null +++ b/include/radio/rmt/internal/Shared.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include +#include +#include +#include + +namespace OpenShock::Rmt::Internal { + template + inline void EncodeBits(std::vector& pulses, T data, const rmt_data_t& rmtOne, const rmt_data_t& rmtZero) { + static_assert(std::is_unsigned::value, "T must be an unsigned integer"); + static_assert(N > 0, "N must be greater than 0"); + static_assert(N < std::numeric_limits::digits, "N must be less or equal to the number of bits in T"); + + for (std::size_t bit_pos = N - 1; bit_pos >= 0; --bit_pos) { + pulses.push_back((data >> bit_pos) & 1 ? rmtOne : rmtZero); + } + } +} diff --git a/src/radio/rmt/CaiXianlinEncoder.cpp b/src/radio/rmt/CaiXianlinEncoder.cpp index 63aafe47..aa911fe2 100644 --- a/src/radio/rmt/CaiXianlinEncoder.cpp +++ b/src/radio/rmt/CaiXianlinEncoder.cpp @@ -1,5 +1,7 @@ #include "radio/rmt/CaiXianlinEncoder.h" +#include "radio/rmt/internal/Shared.h" + #include "Checksum.h" // This is the encoder for the CaiXianlin shocker. @@ -17,19 +19,39 @@ std::vector Rmt::CaiXianlinEncoder::GetSequence(std::uint16_t transm // Intensity must be between 0 and 99 intensity = std::min(intensity, (std::uint8_t)99); - std::uint64_t data = (std::uint64_t(transmitterId) << 24) | (std::uint64_t(channelId & 0xF) << 20) | (std::uint64_t((std::uint8_t)type & 0xF) << 16) | (std::uint64_t(intensity & 0xFF) << 8); + std::uint8_t typeVal = 0; + switch (type) { + case ShockerCommandType::Shock: + typeVal = 0x01; + break; + case ShockerCommandType::Vibrate: + typeVal = 0x02; + break; + case ShockerCommandType::Sound: + typeVal = 0x03; + break; + default: + return {}; // Invalid type + } + + // Payload layout: [transmitterId:16][channelId:4][type:4][intensity:8] + std::uint32_t payload = (std::uint32_t(transmitterId & 0xFFFF) << 16) | (std::uint32_t(channelId & 0xF) << 12) | (std::uint32_t(typeVal) << 8) | std::uint32_t(intensity & 0xFF); - data |= Checksum::CRC8(data) & 0xFF; + // Calculate the checksum of the payload + std::uint8_t checksum = Checksum::CRC8(payload); - data <<= 2; // The 2 last bits are always 0. this is the postamble of the packet. + // Add the checksum to the payload + std::uint64_t data = (std::uint64_t(payload) << 8) | std::uint64_t(checksum); + + // Shift the data left by 3 bits to add the postamble (3 bits of 0) + data <<= 3; std::vector pulses; - pulses.reserve(43); + pulses.reserve(44); + // Generate the sequence pulses.push_back(kRmtPreamble); - for (int bit_pos = 41; bit_pos >= 0; --bit_pos) { - pulses.push_back((data >> bit_pos) & 1 ? kRmtOne : kRmtZero); - } + Internal::EncodeBits<43>(pulses, data, kRmtOne, kRmtZero); return pulses; } diff --git a/src/radio/rmt/PetrainerEncoder.cpp b/src/radio/rmt/PetrainerEncoder.cpp index 065f21c5..128b3dd5 100644 --- a/src/radio/rmt/PetrainerEncoder.cpp +++ b/src/radio/rmt/PetrainerEncoder.cpp @@ -1,5 +1,7 @@ #include "radio/rmt/PetrainerEncoder.h" +#include "radio/rmt/internal/Shared.h" + const rmt_data_t kRmtPreamble = {750, 1, 750, 0}; const rmt_data_t kRmtOne = {200, 1, 1500, 0}; const rmt_data_t kRmtZero = {200, 1, 750, 0}; @@ -11,18 +13,36 @@ std::vector Rmt::PetrainerEncoder::GetSequence(std::uint16_t shocker // Intensity must be between 0 and 100 intensity = std::min(intensity, (std::uint8_t)100); - std::uint8_t methodBit = (0x80 | (1 << ((std::uint8_t)type - 1))) & 0xFF; - std::uint8_t methodChecksum = 0xFF ^ ((1 << (8 - (std::uint8_t)type)) | 1); + std::uint8_t nShift = 0; + switch (type) { + case ShockerCommandType::Shock: + nShift = 0; + break; + case ShockerCommandType::Vibrate: + nShift = 1; + break; + case ShockerCommandType::Sound: + nShift = 2; + break; + default: + return {}; // Invalid type + } + + // Type is 0x80 | (0x01 << nShift) + std::uint8_t typeVal = (0x80 | (0x01 << nShift)) & 0xFF; - std::uint64_t data = (std::uint64_t(methodBit) << 32) | (std::uint64_t(shockerId) << 16) | (std::uint64_t(intensity) << 8) | (std::uint64_t(methodChecksum) << 0); + // TypeSum is NOT(0x01 | (0x80 >> nShift)) + std::uint8_t typeSum = (~(0x01 | (0x80 >> nShift))) & 0xFF; + + // Payload layout: [methodBit:8][shockerId:16][intensity:8][methodChecksum:8] + std::uint64_t data = (std::uint64_t(typeVal) << 32) | (std::uint64_t(shockerId) << 16) | (std::uint64_t(intensity) << 8) | std::uint64_t(typeSum); std::vector pulses; pulses.reserve(42); + // Generate the sequence pulses.push_back(kRmtPreamble); - for (int bit_pos = 39; bit_pos >= 0; --bit_pos) { - pulses.push_back((data >> bit_pos) & 1 ? kRmtOne : kRmtZero); - } + Internal::EncodeBits<40>(pulses, data, kRmtOne, kRmtZero); pulses.push_back(kRmtPostamble); return pulses; From 173e4c8319813279c7b8d1774136adf5cd259f1f Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Mon, 4 Dec 2023 23:50:16 -0800 Subject: [PATCH 034/147] Better checking for shocker types, fix rmt sending causing crashes (#149) * Better checking for shocker types, fix rmt sending causing crashes * Actually fix RMT binary encoder crash * Move string compare logic to common method --------- Co-authored-by: hhvrc --- include/ShockerModelType.h | 20 ++++++++++++++++++++ include/radio/rmt/internal/Shared.h | 2 +- src/serialization/JsonAPI.cpp | 6 +----- src/serialization/JsonSerial.cpp | 6 +----- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/include/ShockerModelType.h b/include/ShockerModelType.h index 1c89876a..aa2e7f61 100644 --- a/include/ShockerModelType.h +++ b/include/ShockerModelType.h @@ -3,7 +3,27 @@ #include "serialization/_fbs/ShockerModelType_generated.h" #include +#include namespace OpenShock { typedef OpenShock::Serialization::Types::ShockerModelType ShockerModelType; + + inline bool ShockerModelTypeFromString(const char* str, ShockerModelType& out, bool allowTypo = false) { + if (strcasecmp(str, "caixianlin") == 0 || strcasecmp(str, "cai-xianlin") == 0) { + out = ShockerModelType::CaiXianlin; + return true; + } + + if (strcasecmp(str, "petrainer") == 0) { + out = ShockerModelType::Petrainer; + return true; + } + + if (allowTypo && strcasecmp(str, "pettrainer") == 0) { + out = ShockerModelType::Petrainer; + return true; + } + + return false; + } } // namespace OpenShock diff --git a/include/radio/rmt/internal/Shared.h b/include/radio/rmt/internal/Shared.h index 6f627e9e..f83de246 100644 --- a/include/radio/rmt/internal/Shared.h +++ b/include/radio/rmt/internal/Shared.h @@ -14,7 +14,7 @@ namespace OpenShock::Rmt::Internal { static_assert(N > 0, "N must be greater than 0"); static_assert(N < std::numeric_limits::digits, "N must be less or equal to the number of bits in T"); - for (std::size_t bit_pos = N - 1; bit_pos >= 0; --bit_pos) { + for (std::int64_t bit_pos = N - 1; bit_pos >= 0; --bit_pos) { pulses.push_back((data >> bit_pos) & 1 ? rmtOne : rmtZero); } } diff --git a/src/serialization/JsonAPI.cpp b/src/serialization/JsonAPI.cpp index 044468de..76fe8af6 100644 --- a/src/serialization/JsonAPI.cpp +++ b/src/serialization/JsonAPI.cpp @@ -105,11 +105,7 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: } OpenShock::ShockerModelType shockerModelType; - if (strcmp(shockerModelStr, "caixianlin") == 0 || strcmp(shockerModelStr, "cai-xianlin") == 0 || strcmp(shockerModelStr, "CaiXianlin") == 0) { - shockerModelType = OpenShock::ShockerModelType::CaiXianlin; - } else if (strcmp(shockerModelStr, "petrainer") == 0 || strcmp(shockerModelStr, "Petrainer") == 0) { - shockerModelType = OpenShock::ShockerModelType::Petrainer; - } else { + if (!OpenShock::ShockerModelTypeFromString(shockerModelStr, shockerModelType, true)) { // PetTrainer is a typo in the API, we pass true to allow it ESP_LOGJSONE("value at 'shocker.model' is not a valid shocker model", shocker); return false; } diff --git a/src/serialization/JsonSerial.cpp b/src/serialization/JsonSerial.cpp index aa40815a..3db16b90 100644 --- a/src/serialization/JsonSerial.cpp +++ b/src/serialization/JsonSerial.cpp @@ -22,11 +22,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma return false; } ShockerModelType modelType; - if (strcmp(model->valuestring, "caixianlin") == 0) { - modelType = ShockerModelType::CaiXianlin; - } else if (strcmp(model->valuestring, "petrainer") == 0) { - modelType = ShockerModelType::Petrainer; - } else { + if (!ShockerModelTypeFromString(model->valuestring, modelType)) { ESP_LOGE(TAG, "value at 'model' is not a valid shocker model (caixianlin, petrainer)"); return false; } From 91c17fec4c736bf114b4631375c8dafe2b23b5cc Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 5 Dec 2023 13:33:09 +0100 Subject: [PATCH 035/147] Move ShockerCommandType FromString logic to common place (#150) --- include/ShockerCommandType.h | 18 ++++++++++++++++++ src/serialization/JsonSerial.cpp | 10 +--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/ShockerCommandType.h b/include/ShockerCommandType.h index 03fce70e..862d180f 100644 --- a/include/ShockerCommandType.h +++ b/include/ShockerCommandType.h @@ -6,4 +6,22 @@ namespace OpenShock { typedef OpenShock::Serialization::Types::ShockerCommandType ShockerCommandType; + + inline bool ShockerCommandTypeFromString(const char* str, ShockerCommandType& out) { + if (strcasecmp(str, "stop") == 0) { + out = ShockerCommandType::Stop; + return true; + } else if (strcasecmp(str, "shock") == 0) { + out = ShockerCommandType::Shock; + return true; + } else if (strcasecmp(str, "vibrate") == 0) { + out = ShockerCommandType::Vibrate; + return true; + } else if (strcasecmp(str, "sound") == 0) { + out = ShockerCommandType::Sound; + return true; + } else { + return false; + } + } } // namespace OpenShock diff --git a/src/serialization/JsonSerial.cpp b/src/serialization/JsonSerial.cpp index 3db16b90..85fa3590 100644 --- a/src/serialization/JsonSerial.cpp +++ b/src/serialization/JsonSerial.cpp @@ -53,15 +53,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma return false; } ShockerCommandType commandType; - if (strcmp(command->valuestring, "stop") == 0) { - commandType = ShockerCommandType::Stop; - } else if (strcmp(command->valuestring, "shock") == 0) { - commandType = ShockerCommandType::Shock; - } else if (strcmp(command->valuestring, "vibrate") == 0) { - commandType = ShockerCommandType::Vibrate; - } else if (strcmp(command->valuestring, "sound") == 0) { - commandType = ShockerCommandType::Sound; - } else { + if (!ShockerCommandTypeFromString(command->valuestring, commandType)) { ESP_LOGE(TAG, "value at 'type' is not a valid shocker command (stop, shock, vibrate, sound)"); return false; } From 23e390b101d2a808556ee0222b11f02a0b4c2af3 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Wed, 6 Dec 2023 03:27:46 -0800 Subject: [PATCH 036/147] WiFi Scanning QOL: Hide duplicate SSIDs and restart stuck scans (#126) * WiFi Scanning QOL: Hide duplicate SSIDs and restart stuck scans * Add missing Time.h inclusion * Improve post-setup WiFi connection speed with WiFi.begin() * Clear ESP's saved WiFi credentials if LittleFS credentials are blank * Cleanup * Squashed commit of the following: commit b68fe895dafa5abe2c8799aed5969fe19f5f50ef Author: HentaiHeavenVR Date: Fri Dec 1 11:04:12 2023 +0100 Implement sending shocker commands via serial (#144) commit 2f775bfc79e0a6e36526143670d3f77c8bf76ae6 Author: HentaiHeavenVR Date: Fri Dec 1 09:49:11 2023 +0100 Fix weird logging of received command list commit 624774acae0a979ac000eaa84c40be700a162ec5 Author: HentaiHeavenVR Date: Fri Dec 1 09:43:28 2023 +0100 Show warning when no LED implementation is defined (#143) commit 635b9f5c0ff580301d1c97ebfb7b1579be7a9c60 Author: HentaiHeavenVR Date: Fri Dec 1 09:34:05 2023 +0100 Remove misleading comment commit 200ee2aa123c8ba9ce43e33c21d43d5a050fdb6e Author: HentaiHeavenVR Date: Fri Dec 1 09:31:11 2023 +0100 Implement serial command for reading and writing raw config (#142) * Implement getter and setter command to import/export raw config * Simplify function signatures * Return after config print * Fix base64 issues commit 55813c5082780e7c5a7b5833621153ea0c50732e Author: HentaiHeavenVR Date: Wed Nov 29 16:15:11 2023 +0100 RFTransmitter cleanup (#138) * Remove magic numbers in RFTransmitter * Move intensity limiters into sequence encoders commit 841ebb877254dc3afea925921938e4cc376ab62b Author: HentaiHeavenVR Date: Wed Nov 29 16:13:13 2023 +0100 Feature/config improvements (#140) * Some cleanup and make mainconfig static * More config improvements * Add more comments commit 85353e4be8694436f6f66c843f078b7195e4c6cd Author: HentaiHeavenVR Date: Wed Nov 29 15:51:06 2023 +0100 Feature/improve network config (#139) * Remove BSSID from config * Increase credentials id limit to 255 commit 202924e906726ecb288a425075c9fd9c4a3eafb2 Author: nullstalgia Date: Wed Nov 29 03:43:12 2023 -0800 Fix clearing E-Stop re-enabling keep-alive when disabled in config (#132) Keep-Alive consistency Co-authored-by: HentaiHeavenVR commit 49cedab9ac070853b6e7b11a1d3def524c28788e Author: HentaiHeavenVR Date: Wed Nov 29 12:34:36 2023 +0100 Remove code accidentally embedded in serial print strings (#136) commit 973d4e1e76a21977767d08bab40e3efc9d2baa46 Author: HentaiHeavenVR Date: Wed Nov 29 12:33:20 2023 +0100 Fix CommandHandler semaphore initialization (#135) commit 05db2b8b33a21ada19f7169e9159c5a11a443d97 Author: HentaiHeavenVR Date: Wed Nov 29 12:19:32 2023 +0100 Rework config (#134) commit 3c56492c030a958e7b66341aa9490582541c951c Author: HentaiHeavenVR Date: Wed Nov 29 10:36:50 2023 +0100 Cleanup & beautify strings and logging * Clean up SerialInputHandler print statements * Raw string literals go BRRR commit f4dbc8ce4ea9e72a80bdefd07c8926ec4c4a4b21 Author: HentaiHeavenVR Date: Tue Nov 28 08:30:42 2023 +0100 Reduce concurrent Github jobs (#131) commit 129ad0b372c158f721b9a970409ffcb4c4412742 Author: nullstalgia Date: Mon Nov 27 23:18:42 2023 -0800 Use WiFi.begin() for faster connect if we recognize the cached SSID (#128) * Use WiFi.begin() for faster connect if we recognize the cached SSID * Clean up SSID cache check --------- Co-authored-by: HentaiHeavenVR commit c20766527eba093e4040bdd738f88affe5874f92 Author: nullstalgia Date: Mon Nov 27 23:15:38 2023 -0800 Add optional (on by default) shocker Keep-Alive (#125) * Add optional (on by default) shocker Keep-Alive! * Move Keep-Alive manager into it's own task * Allow Idle Task to alongside Keep-Alive Task, plus iterator logic fix * Revert RFTransmitter Changes * CommandHandler Keep-Alive * Keep-Alive working in Command Handler Co-Authored-By: hhvrc * Switch to using a queue kill message to avoid panic when deleting a mid-listening queue * Gateway Keep-Alive wording :) * Some cleanup * Mini CommandHandler cleanup * Add keep-alive toggling to Serial commands * Fix USB Serial on OpenShock Core * Revert keep-alive duration used during testing --------- Co-authored-by: hhvrc commit 41199469fadb601984606c2e48736c854adeb8db Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Nov 27 23:17:50 2023 +0000 build(deps): Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] commit 1f621b8baa15ea251f7e7a05359464c32ad7bf1e Author: HentaiHeavenVR Date: Mon Nov 27 16:02:08 2023 +0100 Create codeql.yml (#129) * Condense grouping networks by SSID, and sort by signal strength! * Revert old WifiManager changes * Removed unused declarations and includes * Make network grouping global and have more context * Fix text and connect button for WiFiDetails * Restore sorting network groups by RSSI of strongest network. * Cleaner sort statement * Move group sorting into WiFiList --------- Co-authored-by: hhvrc --- .../serialization/types/wifi-scan-status.ts | 5 +- WebUI/src/lib/components/WiFiList.svelte | 36 ++++---- .../lib/components/modals/WiFiDetails.svelte | 89 +++++++++++++------ WebUI/src/lib/stores/DeviceStateStore.ts | 46 +++++++++- WebUI/src/lib/types/DeviceState.ts | 3 +- WebUI/src/lib/types/WiFiNetworkGroup.ts | 9 ++ WebUI/src/lib/types/index.ts | 3 + .../_fbs/WifiScanStatus_generated.h | 11 ++- schemas/Types/WifiScanStatus.fbs | 1 + src/wifi/WiFiScanManager.cpp | 43 +++++---- 10 files changed, 177 insertions(+), 69 deletions(-) create mode 100644 WebUI/src/lib/types/WiFiNetworkGroup.ts create mode 100644 WebUI/src/lib/types/index.ts diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts b/WebUI/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts index 2ed0ce38..e9a75cf5 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts @@ -4,6 +4,7 @@ export enum WifiScanStatus { Started = 0, InProgress = 1, Completed = 2, - Aborted = 3, - Error = 4 + TimedOut = 3, + Aborted = 4, + Error = 5 } diff --git a/WebUI/src/lib/components/WiFiList.svelte b/WebUI/src/lib/components/WiFiList.svelte index a072781c..7cb63b38 100644 --- a/WebUI/src/lib/components/WiFiList.svelte +++ b/WebUI/src/lib/components/WiFiList.svelte @@ -1,6 +1,5 @@
- {#if item} + {#if group}
-

WiFi Info

+

Network Info

{#each rows as row (row.key)} - {row.key}:{row.value} + {row.key}:{row.value} {/each}
+ +
+

Access Points

+ +
+ {#each group.networks as network} +
+ {network.bssid} + {network.rssi} dBm + Channel {network.channel} +
+ {/each} +
+
+ {#if showPasswordPrompt} + + {/if}
- {#if item.saved} - + {#if showPasswordPrompt} + + {/if} + + {#if group.saved} - {:else} - {/if}
diff --git a/WebUI/src/lib/stores/DeviceStateStore.ts b/WebUI/src/lib/stores/DeviceStateStore.ts index 3d654d92..15b9eb4c 100644 --- a/WebUI/src/lib/stores/DeviceStateStore.ts +++ b/WebUI/src/lib/stores/DeviceStateStore.ts @@ -1,16 +1,54 @@ import type { WifiScanStatus } from '$lib/_fbs/open-shock/serialization/types/wifi-scan-status'; -import type { WiFiNetwork } from '$lib/types/WiFiNetwork'; -import type { DeviceState } from '$lib/types/DeviceState'; +import type { WiFiNetwork, WiFiNetworkGroup, DeviceState } from '$lib/types'; import { writable } from 'svelte/store'; +import { WifiAuthMode } from '$lib/_fbs/open-shock/serialization/types/wifi-auth-mode'; const { subscribe, update } = writable({ wifiConnectedBSSID: null, wifiScanStatus: null, wifiNetworks: new Map(), + wifiNetworkGroups: new Map(), gatewayPaired: false, rfTxPin: null, }); +function insertSorted(array: T[], value: T, compare: (a: T, b: T) => number) { + let low = 0, + high = array.length; + while (low < high) { + const mid = (low + high) >>> 1; + if (compare(array[mid], value) < 0) { + low = mid + 1; + } else { + high = mid; + } + } + array.splice(low, 0, value); +} + +function SsidMapReducer(groups: Map, [_, value]: [string, WiFiNetwork]): Map { + const key = `${value.ssid || value.bssid}_${WifiAuthMode[value.security]}`; + + // Get the group for this SSID, or create a new one + const group = groups.get(key) ?? ({ ssid: value.ssid, saved: false, security: value.security, networks: [] } as WiFiNetworkGroup); + + // Update the group's saved status + group.saved = group.saved || value.saved; + + // Add the network to the group, sorted by signal strength (RSSI, higher is stronger) + insertSorted(group.networks, value, (a, b) => b.rssi - a.rssi); + + // Update the group in the map + groups.set(key, group); + + // Return the updated groups object + return groups; +} + +function updateWifiNetworkGroups(store: DeviceState) { + store.wifiNetworkGroups = Array.from(store.wifiNetworks.entries()).reduce(SsidMapReducer, new Map()); +} + export const DeviceStateStore = { subscribe, update, @@ -29,6 +67,7 @@ export const DeviceStateStore = { setWifiNetwork(network: WiFiNetwork) { update((store) => { store.wifiNetworks.set(network.bssid, network); + updateWifiNetworkGroups(store); return store; }); }, @@ -37,6 +76,7 @@ export const DeviceStateStore = { const network = store.wifiNetworks.get(bssid); if (network) { store.wifiNetworks.set(bssid, updater(network)); + updateWifiNetworkGroups(store); } return store; }); @@ -44,12 +84,14 @@ export const DeviceStateStore = { removeWifiNetwork(bssid: string) { update((store) => { store.wifiNetworks.delete(bssid); + updateWifiNetworkGroups(store); return store; }); }, clearWifiNetworks() { update((store) => { store.wifiNetworks.clear(); + store.wifiNetworkGroups.clear(); return store; }); }, diff --git a/WebUI/src/lib/types/DeviceState.ts b/WebUI/src/lib/types/DeviceState.ts index 6fd1ee4a..a7019759 100644 --- a/WebUI/src/lib/types/DeviceState.ts +++ b/WebUI/src/lib/types/DeviceState.ts @@ -1,10 +1,11 @@ import type { WifiScanStatus } from '$lib/_fbs/open-shock/serialization/types/wifi-scan-status'; -import type { WiFiNetwork } from './WiFiNetwork'; +import type { WiFiNetwork, WiFiNetworkGroup } from './'; export type DeviceState = { wifiConnectedBSSID: string | null; wifiScanStatus: WifiScanStatus | null; wifiNetworks: Map; + wifiNetworkGroups: Map; gatewayPaired: boolean; rfTxPin: number | null; }; diff --git a/WebUI/src/lib/types/WiFiNetworkGroup.ts b/WebUI/src/lib/types/WiFiNetworkGroup.ts new file mode 100644 index 00000000..d68320a6 --- /dev/null +++ b/WebUI/src/lib/types/WiFiNetworkGroup.ts @@ -0,0 +1,9 @@ +import type { WifiAuthMode } from '$lib/_fbs/open-shock/serialization/types/wifi-auth-mode'; +import type { WiFiNetwork } from './WiFiNetwork'; + +export type WiFiNetworkGroup = { + ssid: string; + saved: boolean; + security: WifiAuthMode; + networks: WiFiNetwork[]; +}; diff --git a/WebUI/src/lib/types/index.ts b/WebUI/src/lib/types/index.ts new file mode 100644 index 00000000..3cbfd44e --- /dev/null +++ b/WebUI/src/lib/types/index.ts @@ -0,0 +1,3 @@ +export * from './DeviceState'; +export * from './WiFiNetwork'; +export * from './WiFiNetworkGroup'; diff --git a/include/serialization/_fbs/WifiScanStatus_generated.h b/include/serialization/_fbs/WifiScanStatus_generated.h index 2976861e..473682f0 100644 --- a/include/serialization/_fbs/WifiScanStatus_generated.h +++ b/include/serialization/_fbs/WifiScanStatus_generated.h @@ -21,17 +21,19 @@ enum class WifiScanStatus : uint8_t { Started = 0, InProgress = 1, Completed = 2, - Aborted = 3, - Error = 4, + TimedOut = 3, + Aborted = 4, + Error = 5, MIN = Started, MAX = Error }; -inline const WifiScanStatus (&EnumValuesWifiScanStatus())[5] { +inline const WifiScanStatus (&EnumValuesWifiScanStatus())[6] { static const WifiScanStatus values[] = { WifiScanStatus::Started, WifiScanStatus::InProgress, WifiScanStatus::Completed, + WifiScanStatus::TimedOut, WifiScanStatus::Aborted, WifiScanStatus::Error }; @@ -39,10 +41,11 @@ inline const WifiScanStatus (&EnumValuesWifiScanStatus())[5] { } inline const char * const *EnumNamesWifiScanStatus() { - static const char * const names[6] = { + static const char * const names[7] = { "Started", "InProgress", "Completed", + "TimedOut", "Aborted", "Error", nullptr diff --git a/schemas/Types/WifiScanStatus.fbs b/schemas/Types/WifiScanStatus.fbs index 94b0a212..06325ceb 100644 --- a/schemas/Types/WifiScanStatus.fbs +++ b/schemas/Types/WifiScanStatus.fbs @@ -4,6 +4,7 @@ enum WifiScanStatus : uint8 { Started, InProgress, Completed, + TimedOut, Aborted, Error } diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index e8562c5d..8beadaf2 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -10,7 +10,7 @@ const char* const TAG = "WiFiScanManager"; constexpr const std::uint8_t OPENSHOCK_WIFI_SCAN_MAX_CHANNEL = 13; constexpr const std::uint32_t OPENSHOCK_WIFI_SCAN_MAX_MS_PER_CHANNEL = 300; // Adjusting this value will affect the scan rate, but may also affect the scan results -constexpr const std::uint32_t OPENSHOCK_WIFI_SCAN_TIMEOUT_MS = 10 * 1000; +constexpr const std::uint32_t OPENSHOCK_WIFI_SCAN_TIMEOUT_MS = 10 * 1000; enum WiFiScanTaskNotificationFlags { CHANNEL_DONE = 1 << 0, @@ -23,7 +23,7 @@ using namespace OpenShock; static TaskHandle_t s_scanTaskHandle = nullptr; static SemaphoreHandle_t s_scanTaskMutex = xSemaphoreCreateBinary(); -static std::uint8_t s_currentChannel = 0; +static std::uint8_t s_currentChannel = 0; static std::map s_statusChangedHandlers; static std::map s_networkDiscoveredHandlers; @@ -50,7 +50,13 @@ void _notifyStatusChangedHandlers(OpenShock::WiFiScanStatus status) { } } +bool _isScanError(std::int16_t retval) { + return retval < 0 && retval != WIFI_SCAN_RUNNING; +} + void _handleScanError(std::int16_t retval) { + if (retval >= 0) return; + _notifyTask(WiFiScanTaskNotificationFlags::ERROR); if (retval == WIFI_SCAN_FAILED) { @@ -68,7 +74,7 @@ void _handleScanError(std::int16_t retval) { std::int16_t _scanChannel(std::uint8_t channel) { std::int16_t retval = WiFi.scanNetworks(true, true, false, OPENSHOCK_WIFI_SCAN_MAX_MS_PER_CHANNEL, channel); - if (retval == WIFI_SCAN_RUNNING || retval >= 0) { + if (!_isScanError(retval)) { return retval; } @@ -78,29 +84,30 @@ std::int16_t _scanChannel(std::uint8_t channel) { } WiFiScanStatus _scanningTaskImpl() { - WiFi.enableSTA(true); - WiFi.scanDelete(); - + // Start the scan on the highest channel and work our way down std::uint8_t channel = OPENSHOCK_WIFI_SCAN_MAX_CHANNEL; + // Start the scan on the first channel std::int16_t retval = _scanChannel(channel); - if (retval != WIFI_SCAN_RUNNING) { - // TODO: Handle this + if (_isScanError(retval)) { return WiFiScanStatus::Error; } + // Notify the status changed handlers that the scan has started and is in progress _notifyStatusChangedHandlers(WiFiScanStatus::Started); _notifyStatusChangedHandlers(WiFiScanStatus::InProgress); + // Scan each channel until we're done while (true) { std::uint32_t notificationFlags = 0; - // Wait for the scan to complete + // Wait for the scan to complete, _evScanCompleted will notify us when it's done if (xTaskNotifyWait(0, WiFiScanTaskNotificationFlags::CLEAR_FLAGS, ¬ificationFlags, pdMS_TO_TICKS(OPENSHOCK_WIFI_SCAN_TIMEOUT_MS)) != pdTRUE) { ESP_LOGE(TAG, "Scan timed out"); - return WiFiScanStatus::Error; // TODO: Add a "timed out" status + return WiFiScanStatus::TimedOut; } + // Check if we were notified of an error or if WiFi was disabled if (notificationFlags != WiFiScanTaskNotificationFlags::CHANNEL_DONE) { if (notificationFlags & WiFiScanTaskNotificationFlags::WIFI_DISABLED) { ESP_LOGE(TAG, "Scan task exiting due to being notified that WiFi was disabled"); @@ -115,7 +122,6 @@ WiFiScanStatus _scanningTaskImpl() { return WiFiScanStatus::Error; } - // Select the next channel, or break if we're done if (--channel <= 0) { break; @@ -123,8 +129,7 @@ WiFiScanStatus _scanningTaskImpl() { // Start the scan on the next channel retval = _scanChannel(channel); - if (retval != WIFI_SCAN_RUNNING) { - // TODO: Handle this + if (_isScanError(retval)) { return WiFiScanStatus::Error; } } @@ -133,7 +138,10 @@ WiFiScanStatus _scanningTaskImpl() { } void _scanningTask(void* arg) { + // Start the scan WiFiScanStatus status = _scanningTaskImpl(); + + // Notify the status changed handlers of the scan result _notifyStatusChangedHandlers(status); // Clear the task handle @@ -141,17 +149,22 @@ void _scanningTask(void* arg) { s_scanTaskHandle = nullptr; xSemaphoreGive(s_scanTaskMutex); - // Commit suicide + // Kill this task vTaskDelete(nullptr); } void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { std::int16_t numNetworks = WiFi.scanComplete(); - if (numNetworks < 0) { + if (_isScanError(numNetworks)) { _handleScanError(numNetworks); return; } + if (numNetworks == WIFI_SCAN_RUNNING) { + ESP_LOGE(TAG, "Scan completed but scan is still running... WTF?"); + return; + } + for (std::int16_t i = 0; i < numNetworks; i++) { wifi_ap_record_t* record = reinterpret_cast(WiFi.getScanInfoByIndex(i)); if (record == nullptr) { From 694952f881c42716287ec0eb9d9d31f7c8c3e234 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Wed, 6 Dec 2023 05:04:59 -0800 Subject: [PATCH 037/147] Make sure to use OPENSHOCK_TX_PIN when resetting TX Pin (#151) * Make sure to use OPENSHOCK_TX_PIN when resetting TX Pin * Make sure RADIO_TX is always set Falling back to UINT8_MAX if its not * Revert back to RF --------- Co-authored-by: hhvrc --- include/Constants.h | 8 +++++++- platformio.ini | 8 ++++---- src/CommandHandler.cpp | 12 +++++++++--- src/config/RFConfig.cpp | 3 ++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/Constants.h b/include/Constants.h index 01be0ced..515af76f 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -16,6 +16,12 @@ #error "OPENSHOCK_FW_VERSION must be defined" #endif +#ifndef OPENSHOCK_RF_TX_GPIO +#warning "OPENSHOCK_RF_TX_GPIO is not defined, using default value of UINT8_MAX" +#define OPENSHOCK_RF_TX_GPIO UINT8_MAX +#endif + namespace OpenShock::Constants { - constexpr std::uint8_t GPIO_INVALID = UINT8_MAX; + constexpr std::uint8_t GPIO_INVALID = UINT8_MAX; + constexpr std::uint8_t GPIO_RF_TX = OPENSHOCK_RF_TX_GPIO; } // namespace OpenShock::Constants diff --git a/platformio.ini b/platformio.ini index 4dd98518..db0dad64 100644 --- a/platformio.ini +++ b/platformio.ini @@ -47,7 +47,7 @@ board = Wemos-D1-Mini-ESP32 custom_openshock.chip = ESP32-D0WDQ6 build_flags = -DOPENSHOCK_LED_GPIO=2 - -DOPENSHOCK_TX_PIN=15 + -DOPENSHOCK_RF_TX_GPIO=15 ; https://docs.platformio.org/en/latest/boards/espressif32/lolin_s2_mini.html [env:Wemos-Lolin-S2-Mini] @@ -70,14 +70,14 @@ board = Wemos-D1-Mini-ESP32 ; override custom_openshock.chip = ESP32-D0WD build_flags = -DOPENSHOCK_LED_GPIO=2 - -DOPENSHOCK_TX_PIN=12 + -DOPENSHOCK_RF_TX_GPIO=12 [env:Pishock-Lite-2021] board = Wemos-D1-Mini-ESP32 ; override custom_openshock.chip = ESP32-D0WDQ6 build_flags = -DOPENSHOCK_LED_GPIO=2 - -DOPENSHOCK_TX_PIN=15 + -DOPENSHOCK_RF_TX_GPIO=15 ; https://docs.platformio.org/en/latest//boards/espressif32/seeed_xiao_esp32s3.html [env:Seeed-Xiao-ESP32S3] @@ -96,7 +96,7 @@ custom_openshock.chip_variant = N8 build_flags = -DOPENSHOCK_LED_WS2812B=48 -DOPENSHOCK_LED_GPIO=35 - -DOPENSHOCK_TX_PIN=15 + -DOPENSHOCK_RF_TX_GPIO=15 -DOPENSHOCK_ESTOP_PIN=13 -DARDUINO_USB_CDC_ON_BOOT=1 diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 2954eb1d..5d6cc59d 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -167,9 +167,15 @@ bool CommandHandler::Init() { std::uint8_t txPin = rfConfig.txPin; if (!OpenShock::IsValidOutputPin(txPin)) { - ESP_LOGW(TAG, "Clearing invalid RF TX pin"); - Config::SetRFConfigTxPin(Constants::GPIO_INVALID); - return false; + if (!OpenShock::IsValidOutputPin(Constants::GPIO_RF_TX)) { + ESP_LOGE(TAG, "Configured RF TX pin is invalid, default pin is also invalid. Pausing RF transmitter"); + Config::SetRFConfigTxPin(Constants::GPIO_INVALID); + return false; + } + + ESP_LOGW(TAG, "Configured RF TX pin is invalid, using default pin (%u)", Constants::GPIO_RF_TX); + txPin = Constants::GPIO_RF_TX; + Config::SetRFConfigTxPin(txPin); } s_rfTransmitter = std::make_unique(txPin); diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp index f6f321b6..fa55f1f5 100644 --- a/src/config/RFConfig.cpp +++ b/src/config/RFConfig.cpp @@ -1,5 +1,6 @@ #include "config/RFConfig.h" +#include "Constants.h" #include "Logging.h" const char* const TAG = "Config::RFConfig"; @@ -7,7 +8,7 @@ const char* const TAG = "Config::RFConfig"; using namespace OpenShock::Config; void RFConfig::ToDefault() { - txPin = 0U; + txPin = OpenShock::Constants::GPIO_RF_TX; keepAliveEnabled = true; } From 9cf13aaffc5fb3f2e42154ca5beded797b90bc4f Mon Sep 17 00:00:00 2001 From: hhvrc Date: Fri, 8 Dec 2023 16:20:27 +0100 Subject: [PATCH 038/147] Bump required node version --- .github/workflows/ci-build.yml | 3 +-- .github/workflows/ci-tag.yml | 5 ++--- .github/workflows/codeql.yml | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 4b69b4bc..78ef3c71 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -12,7 +12,7 @@ on: name: ci-build env: - NODE_VERSION: 16 + NODE_VERSION: 18 PYTHON_VERSION: 3.12 OPENSHOCK_API_DOMAIN: api.shocklink.net # OPENSHOCK_FW_VERSION: @@ -22,7 +22,6 @@ env: OPENSHOCK_FW_COMMIT: ${{ github.sha }} jobs: - # Read platformio.ini and extract all specific targets. See the referenced file for more info. get-targets: uses: ./.github/workflows/get-targets.yml diff --git a/.github/workflows/ci-tag.yml b/.github/workflows/ci-tag.yml index c68c6bcd..b9af4214 100644 --- a/.github/workflows/ci-tag.yml +++ b/.github/workflows/ci-tag.yml @@ -5,10 +5,10 @@ on: - '[0-9]+.[0-9]+.[0-9]+-*' name: ci-tag -run-name: "ci-tag: ${{ github.ref_name }}" +run-name: 'ci-tag: ${{ github.ref_name }}' env: - NODE_VERSION: 16 + NODE_VERSION: 18 PYTHON_VERSION: 3.12 OPENSHOCK_API_DOMAIN: api.shocklink.net # OPENSHOCK_FW_VERSION: @@ -17,7 +17,6 @@ env: OPENSHOCK_FW_COMMIT: ${{ github.sha }} jobs: - # Read platformio.ini and extract all specific targets. See the referenced file for more info. get-targets: uses: ./.github/workflows/get-targets.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 8ab3c990..dffafe36 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -9,7 +9,7 @@ on: - cron: '0 6 * * 1' env: - NODE_VERSION: 16 + NODE_VERSION: 18 PYTHON_VERSION: 3.12 OPENSHOCK_API_DOMAIN: api.shocklink.net # OPENSHOCK_FW_VERSION: From 82d556f9f774a5594b4d421489adb7b3ac51f02b Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 8 Dec 2023 16:26:25 +0100 Subject: [PATCH 039/147] Update dependencies (#152) * Update dependencies This includes a minor SkeletonUI release which should speed up compilation times * Fix build issues --- WebUI/package-lock.json | 1720 +++++++++++++++++++++++++++++++++------ WebUI/package.json | 20 +- 2 files changed, 1486 insertions(+), 254 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 42df5bd2..b50544f9 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -12,15 +12,15 @@ }, "devDependencies": { "@playwright/test": "1.40.1", - "@skeletonlabs/skeleton": "2.5.1", - "@skeletonlabs/tw-plugin": "0.2.4", + "@skeletonlabs/skeleton": "2.6.0", + "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.6", + "@sveltejs/kit": "1.27.7", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.3", - "@typescript-eslint/eslint-plugin": "6.13.1", - "@typescript-eslint/parser": "6.13.1", + "@types/node": "20.10.4", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", "autoprefixer": "10.4.16", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", @@ -32,12 +32,12 @@ "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.3.5", + "tailwindcss": "3.3.6", "tslib": "2.6.2", - "typescript": "5.3.2", - "vite": "^4.5.0", + "typescript": "5.3.3", + "vite": "^4.5.1", "vite-plugin-tailwind-purgecss": "0.1.4", - "vitest": "0.34.6" + "vitest": "1.0.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -928,6 +928,175 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", + "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", + "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", + "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", + "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", + "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", + "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", + "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", + "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", + "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz", + "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", + "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", + "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", + "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sigstore/bundle": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", @@ -995,9 +1164,9 @@ } }, "node_modules/@skeletonlabs/skeleton": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.5.1.tgz", - "integrity": "sha512-llzzKr6PQV1MUsJybdo3Z0SaVwm00KDf8DKhlVTt3X3fbCjIbS9rK6sLzJKZO01L/cQYtAzdVXv9CxALtIuy0w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.6.0.tgz", + "integrity": "sha512-4+Fa7b5qGwKGTnQS5S3+XQQ8CQHfL6GIofPJc1ibhT/idi/4whotq0UAvgzdeAILFhvey5jlS9InqXDQFDXdyA==", "dev": true, "dependencies": { "esm-env": "1.0.0" @@ -1007,9 +1176,9 @@ } }, "node_modules/@skeletonlabs/tw-plugin": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.2.4.tgz", - "integrity": "sha512-DmOFMV6jhhvnub/TANB62nJJqxfMBby5Kxwe/Mn3DTxHuJLZj8B47Ta2K5sl/or2B8MaMfny8ocvPAzd6lrMtQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@skeletonlabs/tw-plugin/-/tw-plugin-0.3.0.tgz", + "integrity": "sha512-0tBlZSHk791jvDTC41FlIafa8ZmaODjvOwmghcbla96Fbv9dI1u9+OJ2ScSxzy7xI6qjuQ80Uhw9kn53MMYi4Q==", "dev": true, "peerDependencies": { "tailwindcss": ">=3.0.0" @@ -1025,9 +1194,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.27.6", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", - "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", + "version": "1.27.7", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.7.tgz", + "integrity": "sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1189,21 +1358,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, "node_modules/@types/cookie": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", @@ -1229,9 +1383,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1250,16 +1404,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", - "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/type-utils": "6.13.1", - "@typescript-eslint/utils": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1285,15 +1439,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", - "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4" }, "engines": { @@ -1313,13 +1467,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", - "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1" + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1330,13 +1484,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", - "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1357,9 +1511,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", - "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1370,13 +1524,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", - "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1397,17 +1551,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", - "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", "semver": "^7.5.4" }, "engines": { @@ -1422,12 +1576,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", - "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/types": "6.13.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1445,13 +1599,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.2.tgz", + "integrity": "sha512-mAIo/8uddSWkjQMLFcjqZP3WmkwvvN0OtlyZIu33jFnwme3vZds8m8EDMxtj+Uzni2DwtPfHNjJcTM8zTV1f4A==", "dev": true, "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", + "@vitest/spy": "1.0.2", + "@vitest/utils": "1.0.2", "chai": "^4.3.10" }, "funding": { @@ -1459,13 +1613,13 @@ } }, "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.2.tgz", + "integrity": "sha512-ZcHJXPT2kg/9Hc4fNkCbItlsgZSs3m4vQbxB8LCSdzpbG85bExCmSvu6K9lWpMNdoKfAr1Jn0BwS9SWUcGnbTQ==", "dev": true, "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", + "@vitest/utils": "1.0.2", + "p-limit": "^5.0.0", "pathe": "^1.1.1" }, "funding": { @@ -1473,15 +1627,15 @@ } }, "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, "dependencies": { "yocto-queue": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1500,40 +1654,40 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.2.tgz", + "integrity": "sha512-9ClDz2/aV5TfWA4reV7XR9p+hE0e7bifhwxlURugj3Fw0YXeTFzHmKCNEHd6wOIFMfthbGGwhlq7TOJ2jDO4/g==", "dev": true, "dependencies": { - "magic-string": "^0.30.1", + "magic-string": "^0.30.5", "pathe": "^1.1.1", - "pretty-format": "^29.5.0" + "pretty-format": "^29.7.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.2.tgz", + "integrity": "sha512-YlnHmDntp+zNV3QoTVFI5EVHV0AXpiThd7+xnDEbWnD6fw0TH/J4/+3GFPClLimR39h6nA5m0W4Bjm5Edg4A/A==", "dev": true, "dependencies": { - "tinyspy": "^2.1.1" + "tinyspy": "^2.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.2.tgz", + "integrity": "sha512-GPQkGHAnFAP/+seSbB9pCsj339yRrMgILoI5H2sPevTLCYgBq0VRjF8QSllmnQyvf0EontF6KUIt2t5s2SmqoQ==", "dev": true, "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -1567,9 +1721,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "dev": true, "engines": { "node": ">=0.4.0" @@ -3007,6 +3161,53 @@ "node": ">=0.10.0" } }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -3227,9 +3428,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3544,6 +3745,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -3821,6 +4031,18 @@ "@types/estree": "*" } }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -4024,10 +4246,14 @@ "dev": true }, "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, "engines": { "node": ">=14" }, @@ -4081,12 +4307,12 @@ "dev": true }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lowercase-keys": { @@ -4166,6 +4392,12 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4188,6 +4420,18 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mimic-response": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", @@ -4906,6 +5150,33 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -4948,6 +5219,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -5263,6 +5549,20 @@ "node": ">=16" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.4.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", @@ -6352,9 +6652,9 @@ "dev": true }, "node_modules/std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", + "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==", "dev": true }, "node_modules/string_decoder": { @@ -6420,6 +6720,18 @@ "node": ">=8" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -6707,9 +7019,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", + "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -6891,18 +7203,18 @@ "dev": true }, "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz", + "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", + "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", "dev": true, "engines": { "node": ">=14.0.0" @@ -7010,9 +7322,9 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7023,9 +7335,9 @@ } }, "node_modules/ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", "dev": true }, "node_modules/undici": { @@ -7257,142 +7569,1062 @@ } }, "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.2.tgz", + "integrity": "sha512-h7BbMJf46fLvFW/9Ygo3snkIBEHFh6fHpB4lge98H5quYrDhPFeI3S0LREz328uqPWSnii2yeJXktQ+Pmqk5BQ==", "dev": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", - "mlly": "^1.4.0", "pathe": "^1.1.1", "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=v14.18.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-plugin-tailwind-purgecss": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.4.tgz", - "integrity": "sha512-iL43Amym6/TWKHcHwCjQl2LLLKhil7WQH7oMtDSOCzINFuKS3STaQrI5SDCl+waqheezv9WmI2gNuIWY+o5hsA==", + "node_modules/vite-node/node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "estree-walker": "^3.0.3", - "purgecss": "6.0.0-alpha.0" - }, - "peerDependencies": { - "vite": "^4.1.1" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=12" } }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/esbuild": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" + } + }, + "node_modules/vite-node/node_modules/rollup": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", + "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.7.0", + "@rollup/rollup-android-arm64": "4.7.0", + "@rollup/rollup-darwin-arm64": "4.7.0", + "@rollup/rollup-darwin-x64": "4.7.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", + "@rollup/rollup-linux-arm64-gnu": "4.7.0", + "@rollup/rollup-linux-arm64-musl": "4.7.0", + "@rollup/rollup-linux-riscv64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-musl": "4.7.0", + "@rollup/rollup-win32-arm64-msvc": "4.7.0", + "@rollup/rollup-win32-ia32-msvc": "4.7.0", + "@rollup/rollup-win32-x64-msvc": "4.7.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", + "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-tailwind-purgecss": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.4.tgz", + "integrity": "sha512-iL43Amym6/TWKHcHwCjQl2LLLKhil7WQH7oMtDSOCzINFuKS3STaQrI5SDCl+waqheezv9WmI2gNuIWY+o5hsA==", + "dev": true, + "dependencies": { + "estree-walker": "^3.0.3", + "purgecss": "6.0.0-alpha.0" + }, + "peerDependencies": { + "vite": "^4.1.1" + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.2.tgz", + "integrity": "sha512-F3NVwwpXfRSDnJmyv+ALPwSRVt0zDkRRE18pwUHSUPXAlWQ47rY1dc99ziMW5bBHyqwK2ERjMisLNoef64qk9w==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.0.2", + "@vitest/runner": "1.0.2", + "@vitest/snapshot": "1.0.2", + "@vitest/spy": "1.0.2", + "@vitest/utils": "1.0.2", + "acorn-walk": "^8.3.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^1.3.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.1", + "vite": "^5.0.0", + "vite-node": "1.0.2", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "^1.0.0", + "@vitest/ui": "^1.0.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" + } + }, + "node_modules/vitest/node_modules/rollup": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", + "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.7.0", + "@rollup/rollup-android-arm64": "4.7.0", + "@rollup/rollup-darwin-arm64": "4.7.0", + "@rollup/rollup-darwin-x64": "4.7.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", + "@rollup/rollup-linux-arm64-gnu": "4.7.0", + "@rollup/rollup-linux-arm64-musl": "4.7.0", + "@rollup/rollup-linux-riscv64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-musl": "4.7.0", + "@rollup/rollup-win32-arm64-msvc": "4.7.0", + "@rollup/rollup-win32-ia32-msvc": "4.7.0", + "@rollup/rollup-win32-x64-msvc": "4.7.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", + "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } diff --git a/WebUI/package.json b/WebUI/package.json index 806ac0e8..896a6324 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -16,15 +16,15 @@ }, "devDependencies": { "@playwright/test": "1.40.1", - "@skeletonlabs/skeleton": "2.5.1", - "@skeletonlabs/tw-plugin": "0.2.4", + "@skeletonlabs/skeleton": "2.6.0", + "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.6", + "@sveltejs/kit": "1.27.7", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.3", - "@typescript-eslint/eslint-plugin": "6.13.1", - "@typescript-eslint/parser": "6.13.1", + "@types/node": "20.10.4", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", "autoprefixer": "10.4.16", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", @@ -36,12 +36,12 @@ "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.3.5", + "tailwindcss": "3.3.6", "tslib": "2.6.2", - "typescript": "5.3.2", - "vite": "^4.5.0", + "typescript": "5.3.3", + "vite": "^4.5.1", "vite-plugin-tailwind-purgecss": "0.1.4", - "vitest": "0.34.6" + "vitest": "1.0.2" }, "type": "module", "dependencies": { From e823cc38f1f5389bdb1c4ebfc0da0d14870412bd Mon Sep 17 00:00:00 2001 From: hhvrc Date: Mon, 11 Dec 2023 02:11:17 +0100 Subject: [PATCH 040/147] Fuck you VSCode, BGone --- .vscode/extensions.json | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 7f9c4c45..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "recommendations": [ - "ardenivanov.svelte-intellisense", - "bradlc.vscode-tailwindcss", - "dbaeumer.vscode-eslint", - "editorconfig.editorconfig", - "esbenp.prettier-vscode", - "fivethree.vscode-svelte-snippets", - "gaborv.flatbuffers", - "ms-python.black-formatter", - "ms-vscode.cpptools", - "ms-vscode.cpptools-extension-pack", - "platformio.platformio-ide", - "svelte.svelte-vscode", - "xaver.clang-format" - ] -} From b5c7b972a091c77fb24553fadfbf7ddf94158659 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:12:48 +0100 Subject: [PATCH 041/147] build(deps-dev): Bump the npm-dependencies group in /WebUI with 4 updates (#158) * build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 4 updates: [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit), [prettier](https://github.com/prettier/prettier), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Updates `@sveltejs/kit` from 1.27.7 to 1.28.0 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/master/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@1.28.0/packages/kit) Updates `prettier` from 3.1.0 to 3.1.1 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.1.0...3.1.1) Updates `vite` from 4.5.1 to 5.0.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.7/packages/vite) Updates `vitest` from 1.0.2 to 1.0.4 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.0.4/packages/vitest) --- updated-dependencies: - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-dependencies - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] * Downgrade vite --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: hhvrc --- WebUI/package-lock.json | 584 ++++++++++++++++++++-------------------- WebUI/package.json | 6 +- 2 files changed, 295 insertions(+), 295 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index b50544f9..f58b8088 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -15,7 +15,7 @@ "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.7", + "@sveltejs/kit": "1.28.0", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.4", @@ -28,7 +28,7 @@ "flatbuffers": "23.5.26", "npm-check-updates": "16.14.11", "postcss": "8.4.32", - "prettier": "3.1.0", + "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", @@ -37,7 +37,7 @@ "typescript": "5.3.3", "vite": "^4.5.1", "vite-plugin-tailwind-purgecss": "0.1.4", - "vitest": "1.0.2" + "vitest": "1.0.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -929,9 +929,9 @@ "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", - "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz", + "integrity": "sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q==", "cpu": [ "arm" ], @@ -942,9 +942,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", - "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz", + "integrity": "sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ==", "cpu": [ "arm64" ], @@ -955,9 +955,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", - "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz", + "integrity": "sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g==", "cpu": [ "arm64" ], @@ -968,9 +968,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", - "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz", + "integrity": "sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA==", "cpu": [ "x64" ], @@ -981,9 +981,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", - "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz", + "integrity": "sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A==", "cpu": [ "arm" ], @@ -994,9 +994,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", - "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz", + "integrity": "sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g==", "cpu": [ "arm64" ], @@ -1007,9 +1007,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", - "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz", + "integrity": "sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA==", "cpu": [ "arm64" ], @@ -1020,9 +1020,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", - "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz", + "integrity": "sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw==", "cpu": [ "riscv64" ], @@ -1033,9 +1033,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", - "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz", + "integrity": "sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q==", "cpu": [ "x64" ], @@ -1046,9 +1046,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz", - "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz", + "integrity": "sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg==", "cpu": [ "x64" ], @@ -1059,9 +1059,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", - "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz", + "integrity": "sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA==", "cpu": [ "arm64" ], @@ -1072,9 +1072,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", - "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz", + "integrity": "sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw==", "cpu": [ "ia32" ], @@ -1085,9 +1085,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", - "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz", + "integrity": "sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg==", "cpu": [ "x64" ], @@ -1194,9 +1194,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.27.7", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.7.tgz", - "integrity": "sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.28.0.tgz", + "integrity": "sha512-T9hoS6XM840W4ZUgf3kKAoBt2dsupumUxBtlxt3ddu2yRLrqsKcC3gledBB/e5NtTC8zEZyR5qWBNFT9WAWmIA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1599,13 +1599,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.2.tgz", - "integrity": "sha512-mAIo/8uddSWkjQMLFcjqZP3WmkwvvN0OtlyZIu33jFnwme3vZds8m8EDMxtj+Uzni2DwtPfHNjJcTM8zTV1f4A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.4.tgz", + "integrity": "sha512-/NRN9N88qjg3dkhmFcCBwhn/Ie4h064pY3iv7WLRsDJW7dXnEgeoa8W9zy7gIPluhz6CkgqiB3HmpIXgmEY5dQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.0.2", - "@vitest/utils": "1.0.2", + "@vitest/spy": "1.0.4", + "@vitest/utils": "1.0.4", "chai": "^4.3.10" }, "funding": { @@ -1613,12 +1613,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.2.tgz", - "integrity": "sha512-ZcHJXPT2kg/9Hc4fNkCbItlsgZSs3m4vQbxB8LCSdzpbG85bExCmSvu6K9lWpMNdoKfAr1Jn0BwS9SWUcGnbTQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.4.tgz", + "integrity": "sha512-rhOQ9FZTEkV41JWXozFM8YgOqaG9zA7QXbhg5gy6mFOVqh4PcupirIJ+wN7QjeJt8S8nJRYuZH1OjJjsbxAXTQ==", "dev": true, "dependencies": { - "@vitest/utils": "1.0.2", + "@vitest/utils": "1.0.4", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1654,9 +1654,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.2.tgz", - "integrity": "sha512-9ClDz2/aV5TfWA4reV7XR9p+hE0e7bifhwxlURugj3Fw0YXeTFzHmKCNEHd6wOIFMfthbGGwhlq7TOJ2jDO4/g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.4.tgz", + "integrity": "sha512-vkfXUrNyNRA/Gzsp2lpyJxh94vU2OHT1amoD6WuvUAA12n32xeVZQ0KjjQIf8F6u7bcq2A2k969fMVxEsxeKYA==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1668,9 +1668,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.2.tgz", - "integrity": "sha512-YlnHmDntp+zNV3QoTVFI5EVHV0AXpiThd7+xnDEbWnD6fw0TH/J4/+3GFPClLimR39h6nA5m0W4Bjm5Edg4A/A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.4.tgz", + "integrity": "sha512-9ojTFRL1AJVh0hvfzAQpm0QS6xIS+1HFIw94kl/1ucTfGCaj1LV/iuJU4Y6cdR03EzPDygxTHwE1JOm+5RCcvA==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1680,9 +1680,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.2.tgz", - "integrity": "sha512-GPQkGHAnFAP/+seSbB9pCsj339yRrMgILoI5H2sPevTLCYgBq0VRjF8QSllmnQyvf0EontF6KUIt2t5s2SmqoQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.4.tgz", + "integrity": "sha512-gsswWDXxtt0QvtK/y/LWukN7sGMYmnCcv1qv05CsY6cU/Y1zpGX1QuvLs+GO1inczpE6Owixeel3ShkjhYtGfA==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -5759,9 +5759,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -7569,9 +7569,9 @@ } }, "node_modules/vite-node": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.2.tgz", - "integrity": "sha512-h7BbMJf46fLvFW/9Ygo3snkIBEHFh6fHpB4lge98H5quYrDhPFeI3S0LREz328uqPWSnii2yeJXktQ+Pmqk5BQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.4.tgz", + "integrity": "sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -7591,9 +7591,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -7607,9 +7607,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -7623,9 +7623,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -7639,9 +7639,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -7655,9 +7655,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -7671,9 +7671,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -7687,9 +7687,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -7703,9 +7703,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -7719,9 +7719,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -7735,9 +7735,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -7751,9 +7751,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -7767,9 +7767,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -7783,9 +7783,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -7799,9 +7799,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -7815,9 +7815,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -7831,9 +7831,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", - "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -7847,9 +7847,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -7863,9 +7863,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -7879,9 +7879,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -7895,9 +7895,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -7911,9 +7911,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -7927,9 +7927,9 @@ } }, "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -7943,9 +7943,9 @@ } }, "node_modules/vite-node/node_modules/esbuild": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", - "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "dev": true, "hasInstallScript": true, "bin": { @@ -7955,34 +7955,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.8", - "@esbuild/android-arm64": "0.19.8", - "@esbuild/android-x64": "0.19.8", - "@esbuild/darwin-arm64": "0.19.8", - "@esbuild/darwin-x64": "0.19.8", - "@esbuild/freebsd-arm64": "0.19.8", - "@esbuild/freebsd-x64": "0.19.8", - "@esbuild/linux-arm": "0.19.8", - "@esbuild/linux-arm64": "0.19.8", - "@esbuild/linux-ia32": "0.19.8", - "@esbuild/linux-loong64": "0.19.8", - "@esbuild/linux-mips64el": "0.19.8", - "@esbuild/linux-ppc64": "0.19.8", - "@esbuild/linux-riscv64": "0.19.8", - "@esbuild/linux-s390x": "0.19.8", - "@esbuild/linux-x64": "0.19.8", - "@esbuild/netbsd-x64": "0.19.8", - "@esbuild/openbsd-x64": "0.19.8", - "@esbuild/sunos-x64": "0.19.8", - "@esbuild/win32-arm64": "0.19.8", - "@esbuild/win32-ia32": "0.19.8", - "@esbuild/win32-x64": "0.19.8" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/vite-node/node_modules/rollup": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", - "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", + "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -7992,19 +7992,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.7.0", - "@rollup/rollup-android-arm64": "4.7.0", - "@rollup/rollup-darwin-arm64": "4.7.0", - "@rollup/rollup-darwin-x64": "4.7.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", - "@rollup/rollup-linux-arm64-gnu": "4.7.0", - "@rollup/rollup-linux-arm64-musl": "4.7.0", - "@rollup/rollup-linux-riscv64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-musl": "4.7.0", - "@rollup/rollup-win32-arm64-msvc": "4.7.0", - "@rollup/rollup-win32-ia32-msvc": "4.7.0", - "@rollup/rollup-win32-x64-msvc": "4.7.0", + "@rollup/rollup-android-arm-eabi": "4.8.0", + "@rollup/rollup-android-arm64": "4.8.0", + "@rollup/rollup-darwin-arm64": "4.8.0", + "@rollup/rollup-darwin-x64": "4.8.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", + "@rollup/rollup-linux-arm64-gnu": "4.8.0", + "@rollup/rollup-linux-arm64-musl": "4.8.0", + "@rollup/rollup-linux-riscv64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-musl": "4.8.0", + "@rollup/rollup-win32-arm64-msvc": "4.8.0", + "@rollup/rollup-win32-ia32-msvc": "4.8.0", + "@rollup/rollup-win32-x64-msvc": "4.8.0", "fsevents": "~2.3.2" } }, @@ -8091,16 +8091,16 @@ } }, "node_modules/vitest": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.2.tgz", - "integrity": "sha512-F3NVwwpXfRSDnJmyv+ALPwSRVt0zDkRRE18pwUHSUPXAlWQ47rY1dc99ziMW5bBHyqwK2ERjMisLNoef64qk9w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.4.tgz", + "integrity": "sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==", "dev": true, "dependencies": { - "@vitest/expect": "1.0.2", - "@vitest/runner": "1.0.2", - "@vitest/snapshot": "1.0.2", - "@vitest/spy": "1.0.2", - "@vitest/utils": "1.0.2", + "@vitest/expect": "1.0.4", + "@vitest/runner": "1.0.4", + "@vitest/snapshot": "1.0.4", + "@vitest/spy": "1.0.4", + "@vitest/utils": "1.0.4", "acorn-walk": "^8.3.0", "cac": "^6.7.14", "chai": "^4.3.10", @@ -8115,7 +8115,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.1", "vite": "^5.0.0", - "vite-node": "1.0.2", + "vite-node": "1.0.4", "why-is-node-running": "^2.2.2" }, "bin": { @@ -8157,9 +8157,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -8173,9 +8173,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -8189,9 +8189,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -8205,9 +8205,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -8221,9 +8221,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -8237,9 +8237,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -8253,9 +8253,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -8269,9 +8269,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -8285,9 +8285,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -8301,9 +8301,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -8317,9 +8317,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -8333,9 +8333,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -8349,9 +8349,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -8365,9 +8365,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -8381,9 +8381,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -8397,9 +8397,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", - "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -8413,9 +8413,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -8429,9 +8429,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -8445,9 +8445,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -8461,9 +8461,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -8477,9 +8477,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -8493,9 +8493,9 @@ } }, "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -8509,9 +8509,9 @@ } }, "node_modules/vitest/node_modules/esbuild": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", - "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "dev": true, "hasInstallScript": true, "bin": { @@ -8521,34 +8521,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.8", - "@esbuild/android-arm64": "0.19.8", - "@esbuild/android-x64": "0.19.8", - "@esbuild/darwin-arm64": "0.19.8", - "@esbuild/darwin-x64": "0.19.8", - "@esbuild/freebsd-arm64": "0.19.8", - "@esbuild/freebsd-x64": "0.19.8", - "@esbuild/linux-arm": "0.19.8", - "@esbuild/linux-arm64": "0.19.8", - "@esbuild/linux-ia32": "0.19.8", - "@esbuild/linux-loong64": "0.19.8", - "@esbuild/linux-mips64el": "0.19.8", - "@esbuild/linux-ppc64": "0.19.8", - "@esbuild/linux-riscv64": "0.19.8", - "@esbuild/linux-s390x": "0.19.8", - "@esbuild/linux-x64": "0.19.8", - "@esbuild/netbsd-x64": "0.19.8", - "@esbuild/openbsd-x64": "0.19.8", - "@esbuild/sunos-x64": "0.19.8", - "@esbuild/win32-arm64": "0.19.8", - "@esbuild/win32-ia32": "0.19.8", - "@esbuild/win32-x64": "0.19.8" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/vitest/node_modules/rollup": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", - "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", + "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -8558,19 +8558,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.7.0", - "@rollup/rollup-android-arm64": "4.7.0", - "@rollup/rollup-darwin-arm64": "4.7.0", - "@rollup/rollup-darwin-x64": "4.7.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", - "@rollup/rollup-linux-arm64-gnu": "4.7.0", - "@rollup/rollup-linux-arm64-musl": "4.7.0", - "@rollup/rollup-linux-riscv64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-gnu": "4.7.0", - "@rollup/rollup-linux-x64-musl": "4.7.0", - "@rollup/rollup-win32-arm64-msvc": "4.7.0", - "@rollup/rollup-win32-ia32-msvc": "4.7.0", - "@rollup/rollup-win32-x64-msvc": "4.7.0", + "@rollup/rollup-android-arm-eabi": "4.8.0", + "@rollup/rollup-android-arm64": "4.8.0", + "@rollup/rollup-darwin-arm64": "4.8.0", + "@rollup/rollup-darwin-x64": "4.8.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", + "@rollup/rollup-linux-arm64-gnu": "4.8.0", + "@rollup/rollup-linux-arm64-musl": "4.8.0", + "@rollup/rollup-linux-riscv64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-gnu": "4.8.0", + "@rollup/rollup-linux-x64-musl": "4.8.0", + "@rollup/rollup-win32-arm64-msvc": "4.8.0", + "@rollup/rollup-win32-ia32-msvc": "4.8.0", + "@rollup/rollup-win32-x64-msvc": "4.8.0", "fsevents": "~2.3.2" } }, diff --git a/WebUI/package.json b/WebUI/package.json index 896a6324..2970c138 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -19,7 +19,7 @@ "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.7", + "@sveltejs/kit": "1.28.0", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.4", @@ -32,7 +32,7 @@ "flatbuffers": "23.5.26", "npm-check-updates": "16.14.11", "postcss": "8.4.32", - "prettier": "3.1.0", + "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", @@ -41,7 +41,7 @@ "typescript": "5.3.3", "vite": "^4.5.1", "vite-plugin-tailwind-purgecss": "0.1.4", - "vitest": "1.0.2" + "vitest": "1.0.4" }, "type": "module", "dependencies": { From 9ea9df512006bd468258d9c2fbb2f106e82e458b Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Tue, 12 Dec 2023 02:58:07 -0800 Subject: [PATCH 042/147] Transform all binary semaphores into mutexes (#156) * Transform all semaphores into mutexes * Remove unneccesary locking --------- Co-authored-by: HentaiHeavenVR --- include/PinPatternManager.h | 2 +- include/RGBPatternManager.h | 2 +- src/CommandHandler.cpp | 44 +++++++++++++++++------------------- src/PinPatternManager.cpp | 11 ++++----- src/RGBPatternManager.cpp | 12 ++++------ src/wifi/WiFiScanManager.cpp | 12 ++++++---- 6 files changed, 40 insertions(+), 43 deletions(-) diff --git a/include/PinPatternManager.h b/include/PinPatternManager.h index ceb8cf53..6255e8fc 100644 --- a/include/PinPatternManager.h +++ b/include/PinPatternManager.h @@ -30,6 +30,6 @@ namespace OpenShock { State* m_pattern; std::size_t m_patternLength; TaskHandle_t m_taskHandle; - SemaphoreHandle_t m_taskSemaphore; + SemaphoreHandle_t m_taskMutex; }; } // namespace OpenShock diff --git a/include/RGBPatternManager.h b/include/RGBPatternManager.h index 7f98c11e..d4513739 100644 --- a/include/RGBPatternManager.h +++ b/include/RGBPatternManager.h @@ -38,6 +38,6 @@ namespace OpenShock { RGBState* m_pattern; std::size_t m_patternLength; TaskHandle_t m_taskHandle; - SemaphoreHandle_t m_taskSemaphore; + SemaphoreHandle_t m_taskMutex; }; } // namespace OpenShock diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 5d6cc59d..86a6941b 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -38,12 +38,12 @@ struct KnownShocker { bool killTask; }; -static SemaphoreHandle_t s_rfTransmitterSemaphore = nullptr; +static SemaphoreHandle_t s_rfTransmitterMutex = nullptr; static std::unique_ptr s_rfTransmitter = nullptr; -static SemaphoreHandle_t s_keepAliveSemaphore = nullptr; -static QueueHandle_t s_keepAliveQueue = nullptr; -static TaskHandle_t s_keepAliveTaskHandle = nullptr; +static SemaphoreHandle_t s_keepAliveMutex = nullptr; +static QueueHandle_t s_keepAliveQueue = nullptr; +static TaskHandle_t s_keepAliveTaskHandle = nullptr; void _keepAliveTask(void* arg) { std::int64_t timeToKeepAlive = KEEP_ALIVE_INTERVAL; @@ -106,7 +106,7 @@ bool _internalSetKeepAliveEnabled(bool enabled) { return true; } - xSemaphoreTake(s_keepAliveSemaphore, portMAX_DELAY); + xSemaphoreTake(s_keepAliveMutex, portMAX_DELAY); if (enabled) { ESP_LOGV(TAG, "Enabling keep-alive task"); @@ -115,7 +115,7 @@ bool _internalSetKeepAliveEnabled(bool enabled) { if (s_keepAliveQueue == nullptr) { ESP_LOGE(TAG, "Failed to create keep-alive task"); - xSemaphoreGive(s_keepAliveSemaphore); + xSemaphoreGive(s_keepAliveMutex); return false; } @@ -125,7 +125,7 @@ bool _internalSetKeepAliveEnabled(bool enabled) { vQueueDelete(s_keepAliveQueue); s_keepAliveQueue = nullptr; - xSemaphoreGive(s_keepAliveSemaphore); + xSemaphoreGive(s_keepAliveMutex); return false; } } else { @@ -146,22 +146,20 @@ bool _internalSetKeepAliveEnabled(bool enabled) { } } - xSemaphoreGive(s_keepAliveSemaphore); + xSemaphoreGive(s_keepAliveMutex); return true; } bool CommandHandler::Init() { - if (s_rfTransmitterSemaphore != nullptr) { + if (s_rfTransmitterMutex != nullptr) { ESP_LOGW(TAG, "RF Transmitter is already initialized"); return true; } - // Initialize semaphores - s_rfTransmitterSemaphore = xSemaphoreCreateBinary(); - xSemaphoreGive(s_rfTransmitterSemaphore); - s_keepAliveSemaphore = xSemaphoreCreateBinary(); - xSemaphoreGive(s_keepAliveSemaphore); + // Initialize mutexes + s_rfTransmitterMutex = xSemaphoreCreateMutex(); + s_keepAliveMutex = xSemaphoreCreateMutex(); auto& rfConfig = Config::GetRFConfig(); @@ -201,7 +199,7 @@ SetRfPinResultCode CommandHandler::SetRfTxPin(std::uint8_t txPin) { return SetRfPinResultCode::InvalidPin; } - xSemaphoreTake(s_rfTransmitterSemaphore, portMAX_DELAY); + xSemaphoreTake(s_rfTransmitterMutex, portMAX_DELAY); if (s_rfTransmitter != nullptr) { ESP_LOGV(TAG, "Destroying existing RF transmitter"); @@ -213,20 +211,20 @@ SetRfPinResultCode CommandHandler::SetRfTxPin(std::uint8_t txPin) { if (!rfxmit->ok()) { ESP_LOGE(TAG, "Failed to initialize RF transmitter"); - xSemaphoreGive(s_rfTransmitterSemaphore); + xSemaphoreGive(s_rfTransmitterMutex); return SetRfPinResultCode::InternalError; } if (!Config::SetRFConfigTxPin(txPin)) { ESP_LOGE(TAG, "Failed to set RF TX pin in config"); - xSemaphoreGive(s_rfTransmitterSemaphore); + xSemaphoreGive(s_rfTransmitterMutex); return SetRfPinResultCode::InternalError; } s_rfTransmitter = std::move(rfxmit); - xSemaphoreGive(s_rfTransmitterSemaphore); + xSemaphoreGive(s_rfTransmitterMutex); return SetRfPinResultCode::Success; } @@ -260,12 +258,12 @@ std::uint8_t CommandHandler::GetRfTxPin() { } bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs) { - xSemaphoreTake(s_rfTransmitterSemaphore, portMAX_DELAY); + xSemaphoreTake(s_rfTransmitterMutex, portMAX_DELAY); if (s_rfTransmitter == nullptr) { ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring command"); - xSemaphoreGive(s_rfTransmitterSemaphore); + xSemaphoreGive(s_rfTransmitterMutex); return false; } @@ -284,8 +282,8 @@ bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shocker bool ok = s_rfTransmitter->SendCommand(model, shockerId, type, intensity, durationMs); - xSemaphoreGive(s_rfTransmitterSemaphore); - xSemaphoreTake(s_keepAliveSemaphore, portMAX_DELAY); + xSemaphoreGive(s_rfTransmitterMutex); + xSemaphoreTake(s_keepAliveMutex, portMAX_DELAY); if (ok && s_keepAliveQueue != nullptr) { KnownShocker cmd {.model = model, .shockerId = shockerId, .lastActivityTimestamp = OpenShock::millis() + durationMs}; @@ -294,7 +292,7 @@ bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shocker } } - xSemaphoreGive(s_keepAliveSemaphore); + xSemaphoreGive(s_keepAliveMutex); return ok; } diff --git a/src/PinPatternManager.cpp b/src/PinPatternManager.cpp index 4db7c2fc..c43323c8 100644 --- a/src/PinPatternManager.cpp +++ b/src/PinPatternManager.cpp @@ -8,15 +8,14 @@ const char* const TAG = "PinPatternManager"; using namespace OpenShock; -PinPatternManager::PinPatternManager(std::uint8_t gpioPin) : m_gpioPin(gpioPin), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskSemaphore(xSemaphoreCreateBinary()) { +PinPatternManager::PinPatternManager(std::uint8_t gpioPin) : m_gpioPin(gpioPin), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskMutex(xSemaphoreCreateMutex()) { pinMode(gpioPin, OUTPUT); - xSemaphoreGive(m_taskSemaphore); } PinPatternManager::~PinPatternManager() { ClearPattern(); - vSemaphoreDelete(m_taskSemaphore); + vSemaphoreDelete(m_taskMutex); } void PinPatternManager::SetPattern(nonstd::span pattern) { @@ -45,16 +44,16 @@ void PinPatternManager::SetPattern(nonstd::span pattern) { } // Give the semaphore back - xSemaphoreGive(m_taskSemaphore); + xSemaphoreGive(m_taskMutex); } void PinPatternManager::ClearPattern() { ClearPatternInternal(); - xSemaphoreGive(m_taskSemaphore); + xSemaphoreGive(m_taskMutex); } void PinPatternManager::ClearPatternInternal() { - xSemaphoreTake(m_taskSemaphore, portMAX_DELAY); + xSemaphoreTake(m_taskMutex, portMAX_DELAY); if (m_taskHandle != nullptr) { vTaskDelete(m_taskHandle); diff --git a/src/RGBPatternManager.cpp b/src/RGBPatternManager.cpp index 6440b391..b1b94338 100644 --- a/src/RGBPatternManager.cpp +++ b/src/RGBPatternManager.cpp @@ -13,7 +13,7 @@ using namespace OpenShock; // TODO: Support multiple LEDs ? // TODO: Support other LED types ? -RGBPatternManager::RGBPatternManager(std::uint8_t rgbPin) : m_rgbPin(rgbPin), m_rgbBrightness(255), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskSemaphore(xSemaphoreCreateBinary()) { +RGBPatternManager::RGBPatternManager(std::uint8_t rgbPin) : m_rgbPin(rgbPin), m_rgbBrightness(255), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskMutex(xSemaphoreCreateMutex()) { if ((m_rmtHandle = rmtInit(m_rgbPin, RMT_TX_MODE, RMT_MEM_64)) == NULL) { ESP_LOGE(TAG, "[pin-%u] Failed to create rgb rmt object", m_rgbPin); } @@ -22,14 +22,12 @@ RGBPatternManager::RGBPatternManager(std::uint8_t rgbPin) : m_rgbPin(rgbPin), m_ ESP_LOGD(TAG, "[pin-%u] real tick set to: %fns", m_rgbPin, realTick); SetBrightness(20); - - xSemaphoreGive(m_taskSemaphore); } RGBPatternManager::~RGBPatternManager() { ClearPattern(); - vSemaphoreDelete(m_taskSemaphore); + vSemaphoreDelete(m_taskMutex); } void RGBPatternManager::SetPattern(nonstd::span pattern) { @@ -55,16 +53,16 @@ void RGBPatternManager::SetPattern(nonstd::span pattern) { } // Give the semaphore back - xSemaphoreGive(m_taskSemaphore); + xSemaphoreGive(m_taskMutex); } void RGBPatternManager::ClearPattern() { ClearPatternInternal(); - xSemaphoreGive(m_taskSemaphore); + xSemaphoreGive(m_taskMutex); } void RGBPatternManager::ClearPatternInternal() { - xSemaphoreTake(m_taskSemaphore, portMAX_DELAY); + xSemaphoreTake(m_taskMutex, portMAX_DELAY); if (m_taskHandle != nullptr) { vTaskDelete(m_taskHandle); diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index 8beadaf2..8b61763e 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -21,8 +21,9 @@ enum WiFiScanTaskNotificationFlags { using namespace OpenShock; +static bool s_initialized = false; static TaskHandle_t s_scanTaskHandle = nullptr; -static SemaphoreHandle_t s_scanTaskMutex = xSemaphoreCreateBinary(); +static SemaphoreHandle_t s_scanTaskMutex = xSemaphoreCreateMutex(); static std::uint8_t s_currentChannel = 0; static std::map s_statusChangedHandlers; static std::map s_networkDiscoveredHandlers; @@ -185,15 +186,16 @@ void _evSTAStopped(arduino_event_id_t event, arduino_event_info_t info) { } bool WiFiScanManager::Init() { - // Initialize the scan semaphore - if (xSemaphoreGive(s_scanTaskMutex) != pdTRUE) { - ESP_LOGE(TAG, "Initialize function called more than once"); - return false; + if (s_initialized) { + ESP_LOGW(TAG, "WiFiScanManager is already initialized"); + return true; } WiFi.onEvent(_evScanCompleted, ARDUINO_EVENT_WIFI_SCAN_DONE); WiFi.onEvent(_evSTAStopped, ARDUINO_EVENT_WIFI_STA_STOP); + s_initialized = true; + return true; } From f3e81c699850c594f5720198e9ac2cdd13d6ece4 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Tue, 12 Dec 2023 03:02:44 -0800 Subject: [PATCH 043/147] Add missing nullptr check for Captive Portal Deconstructor (would delete loopTask) (#154) Co-authored-by: HentaiHeavenVR --- src/CaptivePortalInstance.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index d0a513ab..862006a9 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -95,14 +95,15 @@ CaptivePortalInstance::CaptivePortalInstance() request->send( 200, "text/plain", -// Raw string literal (1+ to remove the first newline) -1+R"( + // Raw string literal (1+ to remove the first newline) + 1 + R"( You probably forgot to upload the Filesystem with PlatformIO! Go to PlatformIO -> Platform -> Upload Filesystem Image! If this happened with a file we provided or you just need help, come to the Discord! -discord.gg/openshock -)"); +discord.gg/OpenShock +)" + ); }); } @@ -116,8 +117,10 @@ discord.gg/openshock } CaptivePortalInstance::~CaptivePortalInstance() { - vTaskDelete(m_taskHandle); - + if (m_taskHandle != nullptr) { + vTaskDelete(m_taskHandle); + m_taskHandle = nullptr; + } m_webServer.end(); m_socketServer.close(); } From bfa117e3559ad6cff730ca1fe5c7760c7d0bc14f Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 13 Dec 2023 15:12:38 +0100 Subject: [PATCH 044/147] [Feature] Better chip unsafe pin definitions (#153) * Start implementing per-chip constants * Implement more chip limitations * Add valid pin listing methods * Fix Pico naming * Add compile time pin definition check --- include/Board.h | 47 -------- include/Chipset.h | 234 ++++++++++++++++++++++++++++++++++++++ include/Constants.h | 4 + scripts/embed_env_vars.py | 12 +- src/CommandHandler.cpp | 2 +- 5 files changed, 249 insertions(+), 50 deletions(-) delete mode 100644 include/Board.h create mode 100644 include/Chipset.h diff --git a/include/Board.h b/include/Board.h deleted file mode 100644 index e75b9865..00000000 --- a/include/Board.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include - -namespace OpenShock { - constexpr bool IsValidGPIOPin(std::uint8_t pin) { - if (pin >= GPIO_NUM_MAX) { - return false; - } - - // Normally used for UART0 TXD and RXD. - // See: ESP32 Series Datasheet Version 4.3 Section 2.2 Pin Overview - if (pin == GPIO_NUM_1 || pin == GPIO_NUM_3) { - return false; - } - - // Used to control the boot mode of the chip. - // See: ESP32 Series Datasheet Version 4.3 Section 2.4 Strapping Pins - if (pin == GPIO_NUM_0 || pin == GPIO_NUM_2) { - return false; - } - - // Note: 5 and 15 are used for SDIO slave timing selection, but 15 is already widely used for RF, so we'll let these slide. - - // Allocated for communication with in-package flash/PSRAM and NOT recommended for other uses. - // See: ESP32 Series Datasheet Version 4.3 Section 2.2.1 Restrictions for GPIOs and RTC_GPIOs - if (pin == GPIO_NUM_6 || pin == GPIO_NUM_7 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9 || pin == GPIO_NUM_10 || pin == GPIO_NUM_11 || pin == GPIO_NUM_16 || pin == GPIO_NUM_17) { - return false; - } - - return true; - } - constexpr bool IsValidInputPin(std::uint8_t pin) { - if (!IsValidGPIOPin(pin)) { - return false; - } - - return GPIO_IS_VALID_GPIO(pin) && !GPIO_IS_VALID_OUTPUT_GPIO(pin); - } - constexpr bool IsValidOutputPin(std::uint8_t pin) { - if (!IsValidGPIOPin(pin)) { - return false; - } - - return GPIO_IS_VALID_OUTPUT_GPIO(pin); - } -} // namespace OpenShock diff --git a/include/Chipset.h b/include/Chipset.h new file mode 100644 index 00000000..75310b3b --- /dev/null +++ b/include/Chipset.h @@ -0,0 +1,234 @@ +#pragma once + +#include + +#include + +// The following chipsets are supported by the OpenShock firmware. +// To find documentation for a specific chipset, see the docs link. +// You need to navigate to the datasheets pin's section, the unsafe pins are usually listed under the "Strapping Pins" section. +// We want to avoid using these pins as they are used for boot mode and SDIO slave timing selection, and its easy to encounter issues if we use them. +#pragma region Chipset Definitions +// ESP8266EX +// +// Chips: ESP8266EX +// +// Docs: https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP8266EX +#define OPENSHOCK_FW_CHIP_NAME "ESP8266EX" +// GPIO3, GPIO1 is used for UART0 RXD/TXD. +// GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_0 || pin == GPIO_NUM_1 || pin == GPIO_NUM_2 || pin == GPIO_NUM_3 || pin == GPIO_NUM_15) +#endif + +// ESP8285 +// +// Chips: ESP8285N08, ESP8285H16 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/0a-esp8285_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP8285 +#define OPENSHOCK_FW_CHIP_NAME "ESP8285" +// GPIO3, GPIO1 is used for UART0 RXD/TXD. +// GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_0 || pin == GPIO_NUM_1 || pin == GPIO_NUM_2 || pin == GPIO_NUM_3 || pin == GPIO_NUM_15) +#endif + +// ESP8684 +// +// Chips: ESP8684H1, ESP8684H2, ESP8684H4 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp8684_datasheet_en.pdf +// Docs: https://www.espressif.com/sites/default/files/documentation/esp8684_technical_reference_manual_en.pdf#bootctrl +#ifdef OPENSHOCK_FW_CHIP_ESP8684 +#define OPENSHOCK_FW_CHIP_NAME "ESP8684" +// GPIO3, GPIO1 is used for UART0 RXD/TXD. +// GPIO8, GPIO9 are strapping pins used to control the boot mode adn ROM code printing +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_1 || pin == GPIO_NUM_3 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9) +#endif + +// ESP8685 +// +// Chips: ESP8685H2, ESP8685H4 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp8685_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP8685 +#define OPENSHOCK_FW_CHIP_NAME "ESP8685" +// GPIO20, GPIO21 is used for UART0 RXD/TXD. +// GPIO2, GPIO8, GPIO9 are strapping pins. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_2 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9 || pin == GPIO_NUM_20 || pin == GPIO_NUM_21) +#endif + +// ESP32 +// +// Chips: ESP32-D0WD-V3, ESP32-D0WDR2-V3, ESP32-U4WDH, ESP32-S0WD, ESP32-D0WD, ESP32-D0WDQ6, ESP32-D0WDQ6-V3 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32 +#define OPENSHOCK_FW_CHIP_NAME "ESP32" + +// GPIO1, GPIO3 is used for UART0 RXD/TXD. +// GPIO0, GPIO2 is used to control the boot mode of the chip. +// GPIO5, GPIO15 is used for SDIO slave timing selection. +// GPIO6, GPIO7, GPIO8, GPIO9, GPIO11, GPIO16, GPIO17 is used for SPI flash connection. (DO NOT TOUCH) +// +// See: ESP32 Series Datasheet Version 4.3 Section 2.2 Pin Overview +// See: ESP32 Series Datasheet Version 4.3 Section 2.4 Strapping Pins +#define CHIP_UNSAFE_GPIO(pin) \ + (pin == GPIO_NUM_1 || pin == GPIO_NUM_3 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_5 || pin == GPIO_NUM_15 || pin == GPIO_NUM_6 || pin == GPIO_NUM_7 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9 || pin == GPIO_NUM_11 || pin == GPIO_NUM_16 \ + || pin == GPIO_NUM_17) +#endif + +// ESP32-PICO-D4 +// +// Chips: ESP32-PICO-D4 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-pico_series_datasheet_en.pdf (Section 2.1.2 - 2.1.3 Pin Description and Pin Mapping between ESP and Flash/PSRAM) +#ifdef OPENSHOCK_FW_CHIP_ESP32PICOD4 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-PICO-D4" +// GPIO3, GPIO1 is used for UART0 RXD/TXD. +// GPIO25, GPIO27, GPIO29, GPIO30, GPIO31, GPIO32, GPIO33 is used for SPI flash connection. (DO NOT TOUCH) +// GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_3 || pin == GPIO_NUM_1 || pin == GPIO_NUM_25 || pin == GPIO_NUM_27 || pin == GPIO_NUM_29 || pin == GPIO_NUM_30 || pin == GPIO_NUM_31 || pin == GPIO_NUM_32 || pin == GPIO_NUM_33 || pin == GPIO_NUM_12 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_15 || pin == GPIO_NUM_5) +#endif + +// ESP32-PICO-V3 +// +// Chips:, ESP32-PICO-V3, ESP32-PICO-V3-02 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-pico_series_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32PICOV3 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-PICO-V3" +// GPIO3, GPIO1 is used for UART0 RXD/TXD. +// GPIO6, GPIO11, GPIO9, GPIO10 is used for SPI flash connection. (DO NOT TOUCH) +// GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_3 || pin == GPIO_NUM_1 || pin == GPIO_NUM_6 || pin == GPIO_NUM_11 || pin == GPIO_NUM_9 || pin == GPIO_NUM_10 || pin == GPIO_NUM_12 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_15 || pin == GPIO_NUM_5) +#endif + +// ESP32-S2 +// +// Chips: ESP32-S2, ESP32-S2FH2, ESP32-S2FH4, ESP32-S2FN4R2, ESP32-S2R2 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32S2 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-S2" +// GPIO44, GPIO43 is used for UART0 RXD/TXD. +// GPIO29, GPIO26, GPIO32, GPIO31, GPIO30, GPIO28, GPIO27 is used for SPI flash connection. (DO NOT TOUCH) +// GPIO0, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_30 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_0 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) +#endif + +// ESP32-S3 +// +// Chips: ESP32-S3, ESP32-S3FN8, ESP32-S3R2, ESP32-S3R8, ESP32-S3R8V, ESP32-S3R16V, ESP32-S3FH4R2 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32S3 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-S3" +// GPIO44, GPIO43 is used for UART0 RXD/TXD. +// GPIO30, GPIO29, GPIO26, GPIO32, GPIO31, GPIO28, GPIO27, GPIO33, GPIO34, GPIO35, GPIO36, GPIO37 is used for SPI flash connection. (DO NOT TOUCH) +// GPIO0, GPIO3, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_30 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_33 || pin == GPIO_NUM_34 || pin == GPIO_NUM_35 || pin == GPIO_NUM_36 || pin == GPIO_NUM_37 || pin == GPIO_NUM_0 || pin == GPIO_NUM_3 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) +#endif + +// ESP32-S3-PICO-1 +// +// Chips: ESP32-S3-PICO-1-N8R2, ESP32-S3-PICO-1-N8R8 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s3-pico-1_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32S3PICO1 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-S3-PICO-1" +#error "ESP32-S3-PICO-1 is not supported yet." +#endif + +// ESP32-C3 +// +// Chips: ESP32-C3, ESP32-C3FN4, ESP32-C3FH4, ESP32-C3FH4AZ +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32C3 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-C3" +#error "ESP32-C3 is not supported yet." +#endif + +// ESP32-C6 +// +// Chips: ESP32-C6, ESP32-C6FH4 +// +// Docs: https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf +#ifdef OPENSHOCK_FW_CHIP_ESP32C6 +#define OPENSHOCK_FW_CHIP_NAME "ESP32-C6" +#error "ESP32-C6 is not supported yet." +#endif + +#pragma endregion + +/// Board specific bad-pin bypasses for compatibility reasons. +/// To be clear, these pins are still unsafe, but we need to use them for compatibility reasons. +#pragma region Board Specific Bypasses + +#ifdef OPENSHOCK_FW_BOARD_WEMOSD1MINIESP32 +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#endif +#ifdef OPENSHOCK_FW_BOARD_WEMOSLOLINS2MINI +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#endif +#ifdef OPENSHOCK_FW_BOARD_PISHOCK2023 +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 12) +#endif +#ifdef OPENSHOCK_FW_BOARD_PISHOCKLITE2021 +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#endif +#ifdef OPENSHOCK_FW_BOARD_SEEEDXIAOESP32S3 +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 21) +#endif +#ifdef OPENSHOCK_FW_BOARD_OPENSHOCKCOREV1 +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#endif +#ifndef OPENSHOCK_BYPASSED_GPIO +#define OPENSHOCK_BYPASSED_GPIO(pin) (false) +#endif + +#pragma endregion + +#define OPENSHOCK_IS_VALID_GPIO(pin) ((pin < GPIO_NUM_MAX && !CHIP_UNSAFE_GPIO(pin)) || OPENSHOCK_BYPASSED_GPIO(pin)) +#define OPENSHOCK_IS_VALID_INPUT_GPIO(pin) ((OPENSHOCK_IS_VALID_GPIO(pin) && (GPIO_IS_VALID_GPIO(pin) && !GPIO_IS_VALID_OUTPUT_GPIO(pin))) || OPENSHOCK_BYPASSED_GPIO(pin)) +#define OPENSHOCK_IS_VALID_OUTPUT_GPIO(pin) ((OPENSHOCK_IS_VALID_GPIO(pin) && GPIO_IS_VALID_OUTPUT_GPIO(pin)) || OPENSHOCK_BYPASSED_GPIO(pin)) + +namespace OpenShock { + constexpr bool IsValidGPIOPin(std::uint8_t pin) { + return OPENSHOCK_IS_VALID_GPIO(pin); + } + constexpr bool IsValidInputPin(std::uint8_t pin) { + return OPENSHOCK_IS_VALID_INPUT_GPIO(pin); + } + constexpr bool IsValidOutputPin(std::uint8_t pin) { + return OPENSHOCK_IS_VALID_OUTPUT_GPIO(pin); + } + constexpr std::bitset GetValidGPIOPins() { + std::bitset pins; + for (std::uint8_t i = 0; i < GPIO_NUM_MAX; i++) { + if (IsValidGPIOPin(i)) { + pins.set(i); + } + } + return pins; + } + constexpr std::bitset GetValidInputPins() { + std::bitset pins; + for (std::uint8_t i = 0; i < GPIO_NUM_MAX; i++) { + if (IsValidInputPin(i)) { + pins.set(i); + } + } + return pins; + } + constexpr std::bitset GetValidOutputPins() { + std::bitset pins; + for (std::uint8_t i = 0; i < GPIO_NUM_MAX; i++) { + if (IsValidOutputPin(i)) { + pins.set(i); + } + } + return pins; + } +} // namespace OpenShock diff --git a/include/Constants.h b/include/Constants.h index 515af76f..28a22537 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -1,5 +1,7 @@ #pragma once +#include "Chipset.h" + #include #ifndef OPENSHOCK_API_DOMAIN @@ -19,6 +21,8 @@ #ifndef OPENSHOCK_RF_TX_GPIO #warning "OPENSHOCK_RF_TX_GPIO is not defined, using default value of UINT8_MAX" #define OPENSHOCK_RF_TX_GPIO UINT8_MAX +#elif !OPENSHOCK_IS_VALID_OUTPUT_GPIO(OPENSHOCK_RF_TX_GPIO) +#error "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile" #endif namespace OpenShock::Constants { diff --git a/scripts/embed_env_vars.py b/scripts/embed_env_vars.py index a999506e..e9a78e7c 100644 --- a/scripts/embed_env_vars.py +++ b/scripts/embed_env_vars.py @@ -45,9 +45,17 @@ def get_git_commit() -> str | None: # Find env variables based on only the pioenv and sysenv. def get_pio_firmware_vars() -> dict[str, str | int | bool]: + fw_board = pio.get_string('PIOENV') + fw_chip = pio.get_string('BOARD_MCU') + + def macroify(s: str) -> str: + return s.upper().replace('-', '').replace('_', '') + vars = {} - vars['OPENSHOCK_FW_BOARD'] = pio.get_string('PIOENV') - vars['OPENSHOCK_FW_CHIP'] = pio.get_string('BOARD_MCU') + vars['OPENSHOCK_FW_BOARD'] = fw_board + vars['OPENSHOCK_FW_BOARD_' + macroify(fw_board)] = True # Used for conditional compilation. + vars['OPENSHOCK_FW_CHIP'] = fw_chip + vars['OPENSHOCK_FW_CHIP_' + macroify(fw_chip)] = True # Used for conditional compilation. vars['OPENSHOCK_FW_MODE'] = pio_build_type git_commit = get_git_commit() if git_commit is not None: diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 86a6941b..cd7b7931 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -1,6 +1,6 @@ #include "CommandHandler.h" -#include "Board.h" +#include "Chipset.h" #include "config/Config.h" #include "Constants.h" #include "Logging.h" From 99ef17bcc6452067fab2d47f3bc88cf5365aff5e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 13 Dec 2023 16:18:00 +0100 Subject: [PATCH 045/147] Fix compile time checks Macros cant compare enums to numerical values --- include/Chipset.h | 38 +++++++++++++++++++++++++++++++------- include/Constants.h | 4 ---- src/CompabilityChecks.cpp | 15 +++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 src/CompabilityChecks.cpp diff --git a/include/Chipset.h b/include/Chipset.h index 75310b3b..5a95d12a 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -160,6 +160,10 @@ #error "ESP32-C6 is not supported yet." #endif +#ifndef OPENSHOCK_FW_CHIP_NAME +#error "Selected chipset is misspelled or not supported by OpenShock." +#endif + #pragma endregion /// Board specific bad-pin bypasses for compatibility reasons. @@ -190,19 +194,39 @@ #pragma endregion -#define OPENSHOCK_IS_VALID_GPIO(pin) ((pin < GPIO_NUM_MAX && !CHIP_UNSAFE_GPIO(pin)) || OPENSHOCK_BYPASSED_GPIO(pin)) -#define OPENSHOCK_IS_VALID_INPUT_GPIO(pin) ((OPENSHOCK_IS_VALID_GPIO(pin) && (GPIO_IS_VALID_GPIO(pin) && !GPIO_IS_VALID_OUTPUT_GPIO(pin))) || OPENSHOCK_BYPASSED_GPIO(pin)) -#define OPENSHOCK_IS_VALID_OUTPUT_GPIO(pin) ((OPENSHOCK_IS_VALID_GPIO(pin) && GPIO_IS_VALID_OUTPUT_GPIO(pin)) || OPENSHOCK_BYPASSED_GPIO(pin)) - namespace OpenShock { constexpr bool IsValidGPIOPin(std::uint8_t pin) { - return OPENSHOCK_IS_VALID_GPIO(pin); + if (pin >= GPIO_NUM_MAX) { + return false; + } + + if (!GPIO_IS_VALID_GPIO(pin)) { + return false; + } + + if (OPENSHOCK_BYPASSED_GPIO(pin)) { + return true; + } + + if (CHIP_UNSAFE_GPIO(pin)) { + return false; + } + + return true; } constexpr bool IsValidInputPin(std::uint8_t pin) { - return OPENSHOCK_IS_VALID_INPUT_GPIO(pin); + return IsValidGPIOPin(pin); } constexpr bool IsValidOutputPin(std::uint8_t pin) { - return OPENSHOCK_IS_VALID_OUTPUT_GPIO(pin); + if (!IsValidGPIOPin(pin)) { + return false; + } + + if (!GPIO_IS_VALID_OUTPUT_GPIO(pin)) { + return false; + } + + return true; } constexpr std::bitset GetValidGPIOPins() { std::bitset pins; diff --git a/include/Constants.h b/include/Constants.h index 28a22537..515af76f 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -1,7 +1,5 @@ #pragma once -#include "Chipset.h" - #include #ifndef OPENSHOCK_API_DOMAIN @@ -21,8 +19,6 @@ #ifndef OPENSHOCK_RF_TX_GPIO #warning "OPENSHOCK_RF_TX_GPIO is not defined, using default value of UINT8_MAX" #define OPENSHOCK_RF_TX_GPIO UINT8_MAX -#elif !OPENSHOCK_IS_VALID_OUTPUT_GPIO(OPENSHOCK_RF_TX_GPIO) -#error "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile" #endif namespace OpenShock::Constants { diff --git a/src/CompabilityChecks.cpp b/src/CompabilityChecks.cpp new file mode 100644 index 00000000..cede1d30 --- /dev/null +++ b/src/CompabilityChecks.cpp @@ -0,0 +1,15 @@ +#include "Constants.h" +#include "Chipset.h" + +constexpr bool kIsValidRfTxPin = OpenShock::IsValidOutputPin(OPENSHOCK_RF_TX_GPIO) || OPENSHOCK_RF_TX_GPIO == UINT8_MAX; +static_assert(kIsValidRfTxPin , "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); + +#ifdef OPENSHOCK_LED_GPIO +constexpr bool kIsValidLedPin = OpenShock::IsValidOutputPin(OPENSHOCK_LED_GPIO); +static_assert(kIsValidLedPin, "OPENSHOCK_LED_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); +#endif + +#ifdef OPENSHOCK_LED_WS2812B +constexpr bool kIsValidLedPin = OpenShock::IsValidOutputPin(OPENSHOCK_LED_WS2812B); +static_assert(kIsValidLedPin, "OPENSHOCK_LED_WS2812B is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); +#endif From 526d7fe60edf5099b24c57b23712d633f24d5ee5 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 13 Dec 2023 16:32:55 +0100 Subject: [PATCH 046/147] Add more gpio rule bypasses, and fix duplicate define --- include/Chipset.h | 8 ++++---- src/CompabilityChecks.cpp | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/include/Chipset.h b/include/Chipset.h index 5a95d12a..74eae2a4 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -171,22 +171,22 @@ #pragma region Board Specific Bypasses #ifdef OPENSHOCK_FW_BOARD_WEMOSD1MINIESP32 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 2) #endif #ifdef OPENSHOCK_FW_BOARD_WEMOSLOLINS2MINI #define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) #endif #ifdef OPENSHOCK_FW_BOARD_PISHOCK2023 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 12) +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 12 || pin == 2) #endif #ifdef OPENSHOCK_FW_BOARD_PISHOCKLITE2021 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 2) #endif #ifdef OPENSHOCK_FW_BOARD_SEEEDXIAOESP32S3 #define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 21) #endif #ifdef OPENSHOCK_FW_BOARD_OPENSHOCKCOREV1 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 35) #endif #ifndef OPENSHOCK_BYPASSED_GPIO #define OPENSHOCK_BYPASSED_GPIO(pin) (false) diff --git a/src/CompabilityChecks.cpp b/src/CompabilityChecks.cpp index cede1d30..34691f19 100644 --- a/src/CompabilityChecks.cpp +++ b/src/CompabilityChecks.cpp @@ -5,11 +5,9 @@ constexpr bool kIsValidRfTxPin = OpenShock::IsValidOutputPin(OPENSHOCK_RF_TX_GPI static_assert(kIsValidRfTxPin , "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); #ifdef OPENSHOCK_LED_GPIO -constexpr bool kIsValidLedPin = OpenShock::IsValidOutputPin(OPENSHOCK_LED_GPIO); -static_assert(kIsValidLedPin, "OPENSHOCK_LED_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); +static_assert(OpenShock::IsValidOutputPin(OPENSHOCK_LED_GPIO), "OPENSHOCK_LED_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); #endif #ifdef OPENSHOCK_LED_WS2812B -constexpr bool kIsValidLedPin = OpenShock::IsValidOutputPin(OPENSHOCK_LED_WS2812B); -static_assert(kIsValidLedPin, "OPENSHOCK_LED_WS2812B is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); +static_assert(OpenShock::IsValidOutputPin(OPENSHOCK_LED_WS2812B), "OPENSHOCK_LED_WS2812B is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); #endif From e88741958a6ac527e25250473eef8a7e9b27c427 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Wed, 13 Dec 2023 13:18:29 -0800 Subject: [PATCH 047/147] Config/WWW/OTA Partition and data access rework (#157) * Use separate partition from WWW Data for device configuration * Have ALL chips use the same 4MB OTA partition table * Forgot to use new label for www data in setup() * Specify flash sizes and MCUs in platformio.ini * Set flash size to fallback if none specified during final image merging * Make FS building use new partition scheme * Rename www0 to static * zero :D * Lock down config Implement Read/Write mutex so that access to Config is threadsafe * Fix compilation errors * Use filesystem partition hash instead of contents hash * Fix static route --------- Co-authored-by: HentaiHeavenVR --- chips/ESP32-D0WD/partitions.csv | 6 - chips/ESP32-D0WDQ6/merge-image.py | 15 - chips/ESP32-D0WDQ6/partitions.csv | 6 - chips/ESP32-S2/{N4R2 => 4MB}/merge-image.py | 2 +- chips/ESP32-S2/N4R2/partitions.csv | 6 - chips/ESP32-S3/{N8 => 4MB}/merge-image.py | 4 +- chips/ESP32-S3/N16R8/merge-image.py | 16 - chips/ESP32-S3/N16R8/partitions.csv | 6 - chips/ESP32-S3/N8/partitions.csv | 6 - chips/ESP32-S3/N8R8/merge-image.py | 16 - chips/ESP32-S3/N8R8/partitions.csv | 6 - .../{ESP32-D0WD => ESP32/4MB}/merge-image.py | 2 +- chips/partitions_4MB.csv | 9 + chips/partitions_4MB_OTA.csv | 9 + include/ReadWriteMutex.h | 102 ++++++ include/config/Config.h | 17 +- platformio.ini | 19 +- scripts/build_frontend.py | 65 ++-- scripts/use_openshock_params.py | 29 +- scripts/utils/boardconf.py | 90 ++++-- src/CaptivePortalInstance.cpp | 72 +++-- src/CommandHandler.cpp | 22 +- src/GatewayConnectionManager.cpp | 18 +- src/ReadWriteMutex.cpp | 58 ++++ src/SerialInputHandler.cpp | 28 +- src/config/Config.cpp | 305 +++++++++++++++--- src/main.cpp | 2 +- src/wifi/WiFiManager.cpp | 4 +- 28 files changed, 678 insertions(+), 262 deletions(-) delete mode 100644 chips/ESP32-D0WD/partitions.csv delete mode 100644 chips/ESP32-D0WDQ6/merge-image.py delete mode 100644 chips/ESP32-D0WDQ6/partitions.csv rename chips/ESP32-S2/{N4R2 => 4MB}/merge-image.py (88%) delete mode 100644 chips/ESP32-S2/N4R2/partitions.csv rename chips/ESP32-S3/{N8 => 4MB}/merge-image.py (84%) delete mode 100644 chips/ESP32-S3/N16R8/merge-image.py delete mode 100644 chips/ESP32-S3/N16R8/partitions.csv delete mode 100644 chips/ESP32-S3/N8/partitions.csv delete mode 100644 chips/ESP32-S3/N8R8/merge-image.py delete mode 100644 chips/ESP32-S3/N8R8/partitions.csv rename chips/{ESP32-D0WD => ESP32/4MB}/merge-image.py (88%) create mode 100644 chips/partitions_4MB.csv create mode 100644 chips/partitions_4MB_OTA.csv create mode 100644 include/ReadWriteMutex.h create mode 100644 src/ReadWriteMutex.cpp diff --git a/chips/ESP32-D0WD/partitions.csv b/chips/ESP32-D0WD/partitions.csv deleted file mode 100644 index 1d00925f..00000000 --- a/chips/ESP32-D0WD/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x300000, -spiffs, data, spiffs, 0x310000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, diff --git a/chips/ESP32-D0WDQ6/merge-image.py b/chips/ESP32-D0WDQ6/merge-image.py deleted file mode 100644 index 9fbf817c..00000000 --- a/chips/ESP32-D0WDQ6/merge-image.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/python3 - -import esptool - -# fmt: off -esptool.main([ - '--chip', 'esp32', - 'merge_bin', '-o', 'merged.bin', - '--flash_size', '4MB', - '0x1000', './bootloader.bin', - '0x8000', './partitions.bin', - '0x10000', './firmware.bin', - '0x310000', './filesystem.bin' -]) -# fmt: on diff --git a/chips/ESP32-D0WDQ6/partitions.csv b/chips/ESP32-D0WDQ6/partitions.csv deleted file mode 100644 index 1d00925f..00000000 --- a/chips/ESP32-D0WDQ6/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x300000, -spiffs, data, spiffs, 0x310000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, diff --git a/chips/ESP32-S2/N4R2/merge-image.py b/chips/ESP32-S2/4MB/merge-image.py similarity index 88% rename from chips/ESP32-S2/N4R2/merge-image.py rename to chips/ESP32-S2/4MB/merge-image.py index b5f9e741..a0af628f 100644 --- a/chips/ESP32-S2/N4R2/merge-image.py +++ b/chips/ESP32-S2/4MB/merge-image.py @@ -10,6 +10,6 @@ '0x1000', './bootloader.bin', '0x8000', './partitions.bin', '0x10000', './firmware.bin', - '0x310000', './filesystem.bin' + '0x353000', './filesystem.bin' ]) # fmt: on diff --git a/chips/ESP32-S2/N4R2/partitions.csv b/chips/ESP32-S2/N4R2/partitions.csv deleted file mode 100644 index 61254fca..00000000 --- a/chips/ESP32-S2/N4R2/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x300000, -spiffs, data, spiffs, 0x310000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, \ No newline at end of file diff --git a/chips/ESP32-S3/N8/merge-image.py b/chips/ESP32-S3/4MB/merge-image.py similarity index 84% rename from chips/ESP32-S3/N8/merge-image.py rename to chips/ESP32-S3/4MB/merge-image.py index 190b5fb0..91b5dac1 100644 --- a/chips/ESP32-S3/N8/merge-image.py +++ b/chips/ESP32-S3/4MB/merge-image.py @@ -7,10 +7,10 @@ esptool.main([ '--chip', 'esp32s3', 'merge_bin', '-o', 'merged.bin', - '--flash_size', '8MB', + '--flash_size', '4MB', '0x0', './bootloader.bin', '0x8000', './partitions.bin', '0x10000', './firmware.bin', - '0x310000', './filesystem.bin' + '0x353000', './filesystem.bin' ]) # fmt: on diff --git a/chips/ESP32-S3/N16R8/merge-image.py b/chips/ESP32-S3/N16R8/merge-image.py deleted file mode 100644 index c2fcacfb..00000000 --- a/chips/ESP32-S3/N16R8/merge-image.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/python3 - -import esptool - -# fmt: off -# Note: Bootloader for esp32-s3 starts at 0x0000, unlike several other ESP32 variants that start at 0x1000. -esptool.main([ - '--chip', 'esp32s3', - 'merge_bin', '-o', 'merged.bin', - '--flash_size', '16MB', # This board has 16MiB of flash. - '0x0', './bootloader.bin', - '0x8000', './partitions.bin', - '0x10000', './firmware.bin', - '0x310000', './filesystem.bin' -]) -# fmt: on diff --git a/chips/ESP32-S3/N16R8/partitions.csv b/chips/ESP32-S3/N16R8/partitions.csv deleted file mode 100644 index 1d00925f..00000000 --- a/chips/ESP32-S3/N16R8/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x300000, -spiffs, data, spiffs, 0x310000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, diff --git a/chips/ESP32-S3/N8/partitions.csv b/chips/ESP32-S3/N8/partitions.csv deleted file mode 100644 index 61254fca..00000000 --- a/chips/ESP32-S3/N8/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x300000, -spiffs, data, spiffs, 0x310000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, \ No newline at end of file diff --git a/chips/ESP32-S3/N8R8/merge-image.py b/chips/ESP32-S3/N8R8/merge-image.py deleted file mode 100644 index e27ec4b3..00000000 --- a/chips/ESP32-S3/N8R8/merge-image.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/python3 - -import esptool - -# fmt: off -# Note: Bootloader for esp32-s3 starts at 0x0000, unlike several other ESP32 variants that start at 0x1000. -esptool.main([ - '--chip', 'esp32s3', - 'merge_bin', '-o', 'merged.bin', - '--flash_size', '8MB', - '0x0', './bootloader.bin', - '0x8000', './partitions.bin', - '0x10000', './firmware.bin', - '0x280000', './filesystem.bin' -]) -# fmt: on diff --git a/chips/ESP32-S3/N8R8/partitions.csv b/chips/ESP32-S3/N8R8/partitions.csv deleted file mode 100644 index 31b1dfac..00000000 --- a/chips/ESP32-S3/N8R8/partitions.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x270000, -spiffs, data, spiffs, 0x280000,0xE0000, -coredump, data, coredump,0x3F0000,0x10000, diff --git a/chips/ESP32-D0WD/merge-image.py b/chips/ESP32/4MB/merge-image.py similarity index 88% rename from chips/ESP32-D0WD/merge-image.py rename to chips/ESP32/4MB/merge-image.py index 9fbf817c..be39744f 100644 --- a/chips/ESP32-D0WD/merge-image.py +++ b/chips/ESP32/4MB/merge-image.py @@ -10,6 +10,6 @@ '0x1000', './bootloader.bin', '0x8000', './partitions.bin', '0x10000', './firmware.bin', - '0x310000', './filesystem.bin' + '0x353000', './filesystem.bin' ]) # fmt: on diff --git a/chips/partitions_4MB.csv b/chips/partitions_4MB.csv new file mode 100644 index 00000000..42a5ccae --- /dev/null +++ b/chips/partitions_4MB.csv @@ -0,0 +1,9 @@ +# CURRENTLY NOT USED - KEPT FOR REFERENCE +# OpenShock 4MB Partition Table - without OTA +# Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x009000, 0x005000, +# otadata, data, ota, 0x00e000, 0x002000, +# app0, app, ota_0, 0x010000, 0x340000, +# config, data, spiffs, 0x350000, 0x003000, +# static0, data, spiffs, 0x353000, 0x09D000, +# coredump, data, coredump, 0x3F0000, 0x010000, \ No newline at end of file diff --git a/chips/partitions_4MB_OTA.csv b/chips/partitions_4MB_OTA.csv new file mode 100644 index 00000000..778817c4 --- /dev/null +++ b/chips/partitions_4MB_OTA.csv @@ -0,0 +1,9 @@ +# OpenShock 4MB Partition Table - with OTA +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x009000, 0x005000, +otadata, data, ota, 0x00e000, 0x002000, +app0, app, ota_0, 0x010000, 0x1A0000, +app1, app, ota_1, 0x1B0000, 0x1A0000, +config, data, spiffs, 0x350000, 0x003000, +static0, data, spiffs, 0x353000, 0x09D000, +coredump, data, coredump, 0x3F0000, 0x010000, \ No newline at end of file diff --git a/include/ReadWriteMutex.h b/include/ReadWriteMutex.h new file mode 100644 index 00000000..6f3ac8ae --- /dev/null +++ b/include/ReadWriteMutex.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include + +namespace OpenShock { + class ReadWriteMutex { + public: + ReadWriteMutex(); + ~ReadWriteMutex(); + + bool lockRead(TickType_t xTicksToWait); + void unlockRead(); + + bool lockWrite(TickType_t xTicksToWait); + void unlockWrite(); + private: + SemaphoreHandle_t m_mutex; + SemaphoreHandle_t m_readSem; + int m_readers; + }; + + class ScopedReadLock { + public: + ScopedReadLock(ReadWriteMutex* mutex, TickType_t xTicksToWait = portMAX_DELAY) : m_mutex(mutex) { + bool result = false; + if (m_mutex != nullptr) { + result = m_mutex->lockRead(xTicksToWait); + } + + if (!result) { + m_mutex = nullptr; + } + } + + ~ScopedReadLock() { + if (m_mutex != nullptr) { + m_mutex->unlockRead(); + } + } + + bool isLocked() const { + return m_mutex != nullptr; + } + + bool unlock() { + if (m_mutex != nullptr) { + m_mutex->unlockRead(); + m_mutex = nullptr; + return true; + } + + return false; + } + + ReadWriteMutex* getMutex() const { + return m_mutex; + } + private: + ReadWriteMutex* m_mutex; + }; + + class ScopedWriteLock { + public: + ScopedWriteLock(ReadWriteMutex* mutex, TickType_t xTicksToWait = portMAX_DELAY) : m_mutex(mutex) { + bool result = false; + if (m_mutex != nullptr) { + result = m_mutex->lockWrite(xTicksToWait); + } + + if (!result) { + m_mutex = nullptr; + } + } + + ~ScopedWriteLock() { + if (m_mutex != nullptr) { + m_mutex->unlockWrite(); + } + } + + bool isLocked() const { + return m_mutex != nullptr; + } + + bool unlock() { + if (m_mutex != nullptr) { + m_mutex->unlockWrite(); + m_mutex = nullptr; + return true; + } + + return false; + } + + ReadWriteMutex* getMutex() const { + return m_mutex; + } + private: + ReadWriteMutex* m_mutex; + }; +} // namespace OpenShock diff --git a/include/config/Config.h b/include/config/Config.h index 8fbe50e9..c19cdc9b 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -28,11 +28,10 @@ namespace OpenShock::Config { */ void FactoryReset(); - const RFConfig& GetRFConfig(); - const WiFiConfig& GetWiFiConfig(); - const std::vector& GetWiFiCredentials(); - const CaptivePortalConfig& GetCaptivePortalConfig(); - const BackendConfig& GetBackendConfig(); + bool GetRFConfig(RFConfig& out); + bool GetWiFiConfig(WiFiConfig& out); + bool GetWiFiCredentials(cJSON* array); + bool GetWiFiCredentials(std::vector& out); bool SetRFConfig(const RFConfig& config); bool SetWiFiConfig(const WiFiConfig& config); @@ -40,18 +39,22 @@ namespace OpenShock::Config { bool SetCaptivePortalConfig(const CaptivePortalConfig& config); bool SetBackendConfig(const BackendConfig& config); + bool GetRFConfigTxPin(std::uint8_t& out); bool SetRFConfigTxPin(std::uint8_t txPin); + bool GetRFConfigKeepAliveEnabled(bool& out); bool SetRFConfigKeepAliveEnabled(bool enabled); + bool AnyWiFiCredentials(std::function predicate); + std::uint8_t AddWiFiCredentials(const std::string& ssid, const std::string& password); bool TryGetWiFiCredentialsByID(std::uint8_t id, WiFiCredentials& out); bool TryGetWiFiCredentialsBySSID(const char* ssid, WiFiCredentials& out); std::uint8_t GetWiFiCredentialsIDbySSID(const char* ssid); bool RemoveWiFiCredentials(std::uint8_t id); - void ClearWiFiCredentials(); + bool ClearWiFiCredentials(); bool HasBackendAuthToken(); - const std::string& GetBackendAuthToken(); + bool GetBackendAuthToken(std::string& out); bool SetBackendAuthToken(const std::string& token); bool ClearBackendAuthToken(); diff --git a/platformio.ini b/platformio.ini index db0dad64..d47df2ea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,7 +21,7 @@ lib_deps = https://github.com/martinmoene/span-lite https://github.com/OpenShock/ESPAsyncWebServer https://github.com/Links2004/arduinoWebSockets -board_build.partitions = huge_app.csv ; Overridden per board by custom_openshock selections +custom_openshock.flash_size = 4MB; Can be overridden per board board_build.filesystem = littlefs board_build.embed_files = certificates/x509_crt_bundle extra_scripts = @@ -39,12 +39,14 @@ monitor_filters = esp32_exception_decoder check_tool = cppcheck [env:fs] -; This exists so we don't build a filesystem per board. +custom_openshock.chip = ESP32 +custom_openshock.flash_size = 4MB +; This exists so we don't build individual filesystems per board. ; https://docs.platformio.org/en/stable/boards/espressif32/wemos_d1_mini32.html [env:Wemos-D1-Mini-ESP32] board = Wemos-D1-Mini-ESP32 -custom_openshock.chip = ESP32-D0WDQ6 +custom_openshock.chip = ESP32 build_flags = -DOPENSHOCK_LED_GPIO=2 -DOPENSHOCK_RF_TX_GPIO=15 @@ -53,7 +55,6 @@ build_flags = [env:Wemos-Lolin-S2-Mini] board = Wemos-Lolin-S2-Mini ; override custom_openshock.chip = ESP32-S2 -custom_openshock.chip_variant = N4R2 build_flags = -DOPENSHOCK_LED_GPIO=15 @@ -61,20 +62,20 @@ build_flags = [env:Wemos-Lolin-S3] board = Wemos-Lolin-S3 ; override custom_openshock.chip = ESP32-S3 -custom_openshock.chip_variant = N16R8 +custom_openshock.flash_size = 16MB build_flags = -DOPENSHOCK_LED_WS2812B=38 [env:Pishock-2023] board = Wemos-D1-Mini-ESP32 ; override -custom_openshock.chip = ESP32-D0WD +custom_openshock.chip = ESP32 build_flags = -DOPENSHOCK_LED_GPIO=2 -DOPENSHOCK_RF_TX_GPIO=12 [env:Pishock-Lite-2021] board = Wemos-D1-Mini-ESP32 ; override -custom_openshock.chip = ESP32-D0WDQ6 +custom_openshock.chip = ESP32 build_flags = -DOPENSHOCK_LED_GPIO=2 -DOPENSHOCK_RF_TX_GPIO=15 @@ -83,7 +84,7 @@ build_flags = [env:Seeed-Xiao-ESP32S3] board = seeed_xiao_esp32s3 ; builtin custom_openshock.chip = ESP32-S3 -custom_openshock.chip_variant = N8R8 +custom_openshock.flash_size = 8MB build_flags = -DOPENSHOCK_LED_GPIO=21 @@ -92,7 +93,7 @@ build_flags = [env:OpenShock-Core-V1] board = esp32-s3-devkitc-1 ; builtin custom_openshock.chip = ESP32-S3 -custom_openshock.chip_variant = N8 +custom_openshock.flash_size = 8MB build_flags = -DOPENSHOCK_LED_WS2812B=48 -DOPENSHOCK_LED_GPIO=35 diff --git a/scripts/build_frontend.py b/scripts/build_frontend.py index e8eed1f3..da930586 100644 --- a/scripts/build_frontend.py +++ b/scripts/build_frontend.py @@ -263,35 +263,48 @@ def build_frontend(source, target, env): with gzip.open(dst_path + '.gz', 'wb') as f_out: f_out.write(s) - # Hash the data/www directory. + +def hash_file_update(md5, sha1, sha256, filepath): + with open(filepath, 'rb') as f: + while True: + chunk = f.read(65536) + if not chunk: + break + md5.update(chunk) + sha1.update(chunk) + sha256.update(chunk) + + +def hash_file(filepath): hashMd5 = hashlib.md5() hashSha1 = hashlib.sha1() hashSha256 = hashlib.sha256() - for root, _, files in os.walk('data/www'): - root = root.replace('\\', '/') - for filename in files: - filepath = os.path.join(root, filename) - with open(filepath, 'rb') as f: - while True: - chunk = f.read(65536) - if not chunk: - break - hashMd5.update(chunk) - hashSha1.update(chunk) - hashSha256.update(chunk) - hashMd5 = hashMd5.hexdigest() - hashSha1 = hashSha1.hexdigest() - hashSha256 = hashSha256.hexdigest() - - print('Build hash:') - print(' MD5: ' + hashMd5) - print(' SHA1: ' + hashSha1) - print(' SHA256: ' + hashSha256) - - # Write the hashes to data/www files - file_write_text('data/www/hash.md5', hashMd5, None) - file_write_text('data/www/hash.sha1', hashSha1, None) - file_write_text('data/www/hash.sha256', hashSha256, None) + + hash_file_update(hashMd5, hashSha1, hashSha256, filepath) + + return { + 'MD5': hashMd5.hexdigest(), + 'SHA1': hashSha1.hexdigest(), + 'SHA256': hashSha256.hexdigest(), + } + + +def get_littlefs_bin_statistics(source, target, env): + nTargets = len(target) + if nTargets != 1: + raise Exception('Expected 1 target, got ' + str(nTargets)) + + bin_path = target[0].get_abspath() + + bin_size = os.path.getsize(bin_path) + bin_hashes = hash_file(bin_path) + + print('FileSystem Size: ' + str(bin_size) + ' bytes') + print('FileSystem Hashes:') + print('MD5: ' + bin_hashes['MD5']) + print('SHA1: ' + bin_hashes['SHA1']) + print('SHA256: ' + bin_hashes['SHA256']) env.AddPreAction('$BUILD_DIR/littlefs.bin', build_frontend) +env.AddPostAction('$BUILD_DIR/littlefs.bin', get_littlefs_bin_statistics) diff --git a/scripts/use_openshock_params.py b/scripts/use_openshock_params.py index fed0cfe5..18066721 100644 --- a/scripts/use_openshock_params.py +++ b/scripts/use_openshock_params.py @@ -1,11 +1,15 @@ import os from pathlib import Path -from utils.boardconf import BoardConf, from_pio_env, validate, print_header, print_footer +from utils.boardconf import BoardConf, from_pio_env, validate, print_header, print_footer, fallback_flash_size +import csv # # This file is responsible for processing the "custom_openshock.*" # parameters declared in `platformio.ini`. # +# And for updating the `partitions.csv` file to include the +# `config` partition. +# # This file is invoked by PlatformIO during build. # See 'extra_scripts' in 'platformio.ini'. # @@ -16,21 +20,34 @@ # Parse the board/chip specific configuration from the current pio `env` variable. boardconf: BoardConf = from_pio_env(env) +# In case we need to blacklist certain flash sizes from OTA support. +blacklisted_OTA_sizes = [ + # '4MB' + ] def use_openshock_params(): if not validate(boardconf): + print('Failed to validate OpenShock board configuration.') return # Handle partitions file not existing - if not boardconf.does_partitions_file_exists(): - print('WARNING: PARTITIONS FILE DOES NOT EXIST.') - print('Not overriding default value.') - return + if not boardconf.do_partitions_files_exists(boardconf.get_flash_size()): + if boardconf.do_partitions_files_exists(fallback_flash_size): + print(f'WARNING: PARTITIONS FILES DON\'T EXIST FOR THIS FLASH SIZE, FALLING BACK TO {fallback_flash_size}.') + boardconf.override_flash_size(fallback_flash_size) # Set partition file to chip dir. # https://docs.platformio.org/en/latest/scripting/examples/override_board_configuration.html board_config = env.BoardConfig() - board_config.update('build.partitions', str(boardconf.get_partitions_file())) + + partitions, partitions_ota = boardconf.get_partitions_files(boardconf.get_flash_size()) + + if boardconf.get_flash_size() in blacklisted_OTA_sizes: + print('WARNING: OTA NOT SUPPORTED FOR THIS FLASH SIZE.') + print('Using Non-OTA partition layout.') + board_config.update('build.partitions', str(partitions)) + else: + board_config.update('build.partitions', str(partitions_ota)) print_header() diff --git a/scripts/utils/boardconf.py b/scripts/utils/boardconf.py index f416a25a..6fe35397 100644 --- a/scripts/utils/boardconf.py +++ b/scripts/utils/boardconf.py @@ -2,25 +2,28 @@ from pathlib import Path from configparser import ConfigParser +fallback_flash_size = '4MB' class BoardConf: - def __init__(self, chip: str, chip_variant: str): + def __init__(self, chip: str, flash_size: str): self.chip = chip - self.chip_variant = chip_variant + self.flash_size = flash_size + if flash_size == '': + self.flash_size = fallback_flash_size # Set dirs self.root_dir = Path().absolute() self.chips_dir = self.root_dir / 'chips' self.chip_base_dir = self.chips_dir / self.chip - self.chip_variant_dir = ( - (self.chip_base_dir / self.chip_variant) if self.chip_variant != '' else self.chip_base_dir + self.flash_size_dir = ( + (self.chip_base_dir / self.flash_size) if self.flash_size != '' else self.chip_base_dir ) def get_chip(self) -> str: return self.chip - def get_chip_variant(self) -> str: - return self.chip_variant + def get_flash_size(self) -> str: + return self.flash_size def get_chips_dir(self) -> Path: return self.chips_dir @@ -28,36 +31,44 @@ def get_chips_dir(self) -> Path: def get_chip_dir(self) -> Path: return self.chip_base_dir - def get_chip_variant_dir(self) -> Path: - return self.chip_variant_dir + def get_flash_size_dir(self) -> Path: + return self.flash_size_dir + + def override_flash_size(self, flash_size: str): + self.flash_size = flash_size + self.flash_size_dir = self.chip_base_dir / self.flash_size def get_merge_script(self) -> Path: - return self.chip_variant_dir / 'merge-image.py' + return self.flash_size_dir / 'merge-image.py' - def get_partitions_file(self) -> Path: - return self.chip_variant_dir / 'partitions.csv' + def get_partitions_files(self, size: str) -> tuple[Path, Path]: + return self.chips_dir / f'partitions_{size}.csv', self.chips_dir / f'partitions_{size}_OTA.csv', def is_chip_specified(self) -> bool: return self.chip != '' - def is_chip_variant_specified(self) -> bool: - return self.chip_variant != '' + def is_flash_size_specified(self) -> bool: + return self.flash_size != '' # Whether the chip folder exists. def does_chip_exist(self) -> bool: return os.path.exists(self.get_chip_dir()) - # Whether the chip variant folder exists. - def does_chip_variant_exist(self) -> bool: - return os.path.exists(self.get_chip_variant_dir()) + # Whether the flash size folder exists. + def does_flash_size_exist(self, size: str = "") -> bool: + if size == "": + return os.path.exists(self.get_flash_size_dir()) + else: + return os.path.exists(self.chip_base_dir / size) - # Whether the merge script for the current chip variant exists. + # Whether the merge script for the current flash size exists. def does_merge_script_exist(self) -> bool: return os.path.exists(self.get_merge_script()) - # Whether the partitiosn file for the current chip variant exists. - def does_partitions_file_exists(self) -> bool: - return os.path.exists(self.get_partitions_file()) + # Whether the partitions file for the current flash size exists. + def do_partitions_files_exists(self, size: str) -> bool: + partitions, partitions_ota = self.get_partitions_files(size) + return os.path.exists(partitions) and os.path.exists(partitions_ota) def from_pio_file(env_name: str) -> BoardConf: @@ -68,18 +79,23 @@ def from_pio_file(env_name: str) -> BoardConf: env = config['env:' + env_name] # Grab strings from platformio.ini env declaration + # TODO: Simplify platformio.ini to only have one env (Flash Size) + # Need to either pass in or figure out chip chip = env.get('custom_openshock.chip', '') - chip_variant = env.get('custom_openshock.chip_variant', '') + flash_size = env.get('custom_openshock.flash_size', '') - return BoardConf(chip, chip_variant) + return BoardConf(chip, flash_size) def from_pio_env(env): # Grab strings from current pio env + # TODO: Simplify platformio.ini to only have one env (Flash Size) + # env.BoardConfig().get('build.mcu') + # can be used to get chip chip = env.GetProjectOption('custom_openshock.chip', '') - chip_variant = env.GetProjectOption('custom_openshock.chip_variant', '') + flash_size = env.GetProjectOption('custom_openshock.flash_size', '') - return BoardConf(chip, chip_variant) + return BoardConf(chip, flash_size) def print_header(): @@ -98,12 +114,12 @@ def validate(boardconf) -> bool: # Handle missing chip declaration. if not boardconf.is_chip_specified(): print('No chip specified.') - print('Skipping further chip/chip-variant specific initialization.') + print('Skipping further chip/flash size-specific initialization.') return False - # Print info about determined chip/variant. - print('Chip: %s' % boardconf.get_chip()) - print('Variant: %s' % boardconf.get_chip_variant()) + # Print info about determined chip/flash size. + print('Chip Variant: %s' % boardconf.get_chip()) + print('Flash Size: %s' % boardconf.get_flash_size()) print('') # Handle chip not existing. @@ -112,15 +128,21 @@ def validate(boardconf) -> bool: print('Did you make a typo?') return False - # Handle specified variant not existing. - if not boardconf.does_chip_variant_exist(): - print('Chip VARIANT directory does not exist: %s' % boardconf.get_chip_variant_dir()) - print('Did you make a typo?') - return False + # Handle specified flash size not existing. + if not boardconf.does_flash_size_exist(): + print('Flash size directory does not exist: %s' % boardconf.get_flash_size_dir()) + # Attempt to try fallback flash size. + if boardconf.does_flash_size_exist(fallback_flash_size): + print(f'Falling back to {fallback_flash_size} flash size.') + boardconf.override_flash_size(fallback_flash_size) + else: + print(f'Failed to fallback to {fallback_flash_size} flash size.') + print('Did you make a typo?') + return False # Print expected location of merge script and partitions file print('Determined merge script: %s' % boardconf.get_merge_script()) - print('Determined partitions file: %s' % boardconf.get_partitions_file()) + print('Potential partition files: %s' % str(boardconf.get_partitions_files(boardconf.get_flash_size()))) print('') return True diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 862006a9..a37fcfb7 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -5,6 +5,7 @@ #include "GatewayConnectionManager.h" #include "Logging.h" #include "serialization/WSLocal.h" +#include "util/HexUtils.h" #include "util/TaskUtils.h" #include "wifi/WiFiManager.h" @@ -24,44 +25,55 @@ constexpr std::uint32_t WEBSOCKET_UPDATE_INTERVAL = 10; // 10ms / 100Hz using namespace OpenShock; -bool TryReadFile(const char* path, char* buffer, std::size_t& bufferSize) { - File file = LittleFS.open(path, "r"); - if (!file) { - ESP_LOGE(TAG, "Failed to open file %s for reading", path); - return false; +const esp_partition_t* _getStaticPartition() { + const esp_partition_t* partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "static0"); + if (partition != nullptr) { + return partition; } - std::size_t fileSize = file.size(); - if (fileSize > bufferSize) { - ESP_LOGE(TAG, "File %s is too large to fit in buffer", path); - file.close(); - return false; + partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "static1"); + if (partition != nullptr) { + return partition; } - file.readBytes(buffer, fileSize); + return nullptr; +} - bufferSize = fileSize; +bool _tryGetPartitionHash(char (&buffer)[65]) { + static bool initialized = false; + static std::uint8_t staticSha256[32] = {0}; - file.close(); + if (!initialized) { + initialized = true; - return true; -} + ESP_LOGI(TAG, "Looking for static partition"); -bool TryGetFsHash(char (&buffer)[65]) { - std::size_t bufferSize = sizeof(buffer); - if (TryReadFile("/www/hash.sha1", buffer, bufferSize)) { - buffer[bufferSize] = '\0'; - return true; - } - if (TryReadFile("/www/hash.sha256", buffer, bufferSize)) { - buffer[bufferSize] = '\0'; - return true; - } - if (TryReadFile("/www/hash.md5", buffer, bufferSize)) { - buffer[bufferSize] = '\0'; - return true; + // Get the static partition + const esp_partition_t* partition = _getStaticPartition(); + if (partition == nullptr) { + ESP_LOGE(TAG, "Failed to find static partition"); + return false; + } + + ESP_LOGI(TAG, "Found static partition, getting hash... (this may take a while)"); + + // Get the hash of the partition + esp_err_t err = esp_partition_get_sha256(partition, staticSha256); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to get partition hash: %s", esp_err_to_name(err)); + return false; + } + + ESP_LOGI(TAG, "Got partition hash"); } - return false; + + // Copy the hash to the output buffer + HexUtils::ToHex<32>(staticSha256, nonstd::span(buffer, 64), false); + + // Null-terminate the string + buffer[64] = '\0'; + + return true; } CaptivePortalInstance::CaptivePortalInstance() @@ -78,7 +90,7 @@ CaptivePortalInstance::CaptivePortalInstance() // Get the hash of the filesystem char fsHash[65]; - bool gotFsHash = TryGetFsHash(fsHash); + bool gotFsHash = _tryGetPartitionHash(fsHash); bool fsOk = indexExists && gotFsHash; if (fsOk) { diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index cd7b7931..4dfa3238 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -161,7 +161,11 @@ bool CommandHandler::Init() { s_rfTransmitterMutex = xSemaphoreCreateMutex(); s_keepAliveMutex = xSemaphoreCreateMutex(); - auto& rfConfig = Config::GetRFConfig(); + Config::RFConfig rfConfig; + if (!Config::GetRFConfig(rfConfig)) { + ESP_LOGE(TAG, "Failed to get RF config"); + return false; + } std::uint8_t txPin = rfConfig.txPin; if (!OpenShock::IsValidOutputPin(txPin)) { @@ -242,7 +246,13 @@ bool CommandHandler::SetKeepAliveEnabled(bool enabled) { } bool CommandHandler::SetKeepAlivePaused(bool paused) { - if (Config::GetRFConfig().keepAliveEnabled == false && paused == false) { + bool keepAliveEnabled = false; + if (!Config::GetRFConfigKeepAliveEnabled(keepAliveEnabled)) { + ESP_LOGE(TAG, "Failed to get keep-alive enabled from config"); + return false; + } + + if (keepAliveEnabled == false && paused == false) { ESP_LOGW(TAG, "Keep-alive is disabled in config, ignoring unpause command"); return false; } @@ -254,7 +264,13 @@ bool CommandHandler::SetKeepAlivePaused(bool paused) { } std::uint8_t CommandHandler::GetRfTxPin() { - return Config::GetRFConfig().txPin; + std::uint8_t txPin; + if (!Config::GetRFConfigTxPin(txPin)) { + ESP_LOGE(TAG, "Failed to get RF TX pin from config"); + txPin = Constants::GPIO_INVALID; + } + + return txPin; } bool CommandHandler::HandleCommand(ShockerModelType model, std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity, std::uint16_t durationMs) { diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 752e3139..51d004ed 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -178,9 +178,13 @@ bool ConnectToLCG() { return false; } - String authToken = Config::GetBackendAuthToken().c_str(); + std::string authToken; + if (!Config::GetBackendAuthToken(authToken)) { + ESP_LOGE(TAG, "Failed to get auth token"); + return false; + } - auto response = HTTP::JsonAPI::AssignLcg(authToken); + auto response = HTTP::JsonAPI::AssignLcg(authToken.c_str()); if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while fetching LCG endpoint: %d %d", response.result, response.code); @@ -211,17 +215,21 @@ void GatewayConnectionManager::Update() { return; } - String authToken = Config::GetBackendAuthToken().c_str(); + std::string authToken; + if (!Config::GetBackendAuthToken(authToken)) { + ESP_LOGE(TAG, "Failed to get auth token"); + return; + } // Fetch device info - if (!FetchDeviceInfo(authToken)) { + if (!FetchDeviceInfo(authToken.c_str())) { return; } s_flags |= FLAG_AUTHENTICATED; ESP_LOGD(TAG, "Successfully verified auth token"); - s_wsClient = std::make_unique(authToken.c_str()); + s_wsClient = std::make_unique(authToken); } if (s_wsClient->loop()) { diff --git a/src/ReadWriteMutex.cpp b/src/ReadWriteMutex.cpp new file mode 100644 index 00000000..2fadf901 --- /dev/null +++ b/src/ReadWriteMutex.cpp @@ -0,0 +1,58 @@ +#include "ReadWriteMutex.h" + +#include "Logging.h" + +const char* const TAG = "ReadWriteMutex"; + +OpenShock::ReadWriteMutex::ReadWriteMutex() : m_mutex(xSemaphoreCreateMutex()), m_readSem(xSemaphoreCreateBinary()), m_readers(0) { + xSemaphoreGive(m_readSem); +} + +OpenShock::ReadWriteMutex::~ReadWriteMutex() { + vSemaphoreDelete(m_mutex); + vSemaphoreDelete(m_readSem); +} + +bool OpenShock::ReadWriteMutex::lockRead(TickType_t xTicksToWait) { + if (xSemaphoreTake(m_readSem, xTicksToWait) == pdFALSE) { + ESP_LOGE(TAG, "Failed to take read semaphore"); + return false; + } + + if (++m_readers == 1) { + if (xSemaphoreTake(m_mutex, xTicksToWait) == pdFALSE) { + xSemaphoreGive(m_readSem); + return false; + } + } + + xSemaphoreGive(m_readSem); + + return true; +} + +void OpenShock::ReadWriteMutex::unlockRead() { + if (xSemaphoreTake(m_readSem, portMAX_DELAY) == pdFALSE) { + ESP_LOGE(TAG, "Failed to take read semaphore"); + return; + } + + if (--m_readers == 0) { + xSemaphoreGive(m_mutex); + } + + xSemaphoreGive(m_readSem); +} + +bool OpenShock::ReadWriteMutex::lockWrite(TickType_t xTicksToWait) { + if (xSemaphoreTake(m_mutex, xTicksToWait) == pdFALSE) { + ESP_LOGE(TAG, "Failed to take mutex"); + return false; + } + + return true; +} + +void OpenShock::ReadWriteMutex::unlockWrite() { + xSemaphoreGive(m_mutex); +} diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index d0d88880..0e8d6bb7 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -224,8 +224,14 @@ void _handleFactoryResetCommand(char* arg, std::size_t argLength) { void _handleRmtpinCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { + std::uint8_t txPin; + if (!Config::GetRFConfigTxPin(txPin)) { + SERPR_ERROR("Failed to get RF TX pin from config"); + return; + } + // Get rmt pin - SERPR_RESPONSE("RmtPin|%u", Config::GetRFConfig().txPin); + SERPR_RESPONSE("RmtPin|%u", txPin); return; } @@ -257,7 +263,6 @@ void _handleAuthtokenCommand(char* arg, std::size_t argLength) { } void _handleNetworksCommand(char* arg, std::size_t argLength) { - cJSON* network = nullptr; cJSON* root; if (arg == nullptr || argLength <= 0) { @@ -267,10 +272,9 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - for (auto& creds : Config::GetWiFiCredentials()) { - network = creds.ToJSON(); - - cJSON_AddItemToArray(root, network); + if (!Config::GetWiFiCredentials(root)) { + SERPR_ERROR("Failed to get WiFi credentials from config"); + return; } char* out = cJSON_PrintUnformatted(root); @@ -296,8 +300,10 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - std::uint8_t id = 1; std::vector creds; + + std::uint8_t id = 1; + cJSON* network = nullptr; cJSON_ArrayForEach(network, root) { Config::WiFiCredentials cred; @@ -324,7 +330,13 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { void _handleKeepAliveCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { // Get keep alive status - SERPR_RESPONSE("KeepAlive|%s", Config::GetRFConfig().keepAliveEnabled ? "true" : "false"); + bool keepAliveEnabled; + if (!Config::GetRFConfigKeepAliveEnabled(keepAliveEnabled)) { + SERPR_ERROR("Failed to get keep-alive status from config"); + return; + } + + SERPR_RESPONSE("KeepAlive|%s", keepAliveEnabled ? "true" : "false"); return; } diff --git a/src/config/Config.cpp b/src/config/Config.cpp index e3478279..a649c7ec 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -1,9 +1,11 @@ #include "config/Config.h" #include "config/RootConfig.h" +#include "ReadWriteMutex.h" #include "Constants.h" #include "Logging.h" +#include #include #include @@ -14,7 +16,9 @@ const char* const TAG = "Config"; using namespace OpenShock; -static Config::RootConfig _mainConfig; +static fs::LittleFSFS _configFS; +static Config::RootConfig _configData; +static ReadWriteMutex _configMutex; bool _tryDeserializeConfig(const std::uint8_t* buffer, std::size_t bufferLen, OpenShock::Config::RootConfig& config) { if (buffer == nullptr || bufferLen == 0) { @@ -48,7 +52,7 @@ bool _tryDeserializeConfig(const std::uint8_t* buffer, std::size_t bufferLen, Op return true; } bool _tryLoadConfig(std::vector& buffer) { - File file = LittleFS.open("/config", "rb"); + File file = _configFS.open("/config", "rb"); if (!file) { ESP_LOGE(TAG, "Failed to open config file for reading"); return false; @@ -76,10 +80,10 @@ bool _tryLoadConfig() { return false; } - return _tryDeserializeConfig(buffer.data(), buffer.size(), _mainConfig); + return _tryDeserializeConfig(buffer.data(), buffer.size(), _configData); } bool _trySaveConfig(const std::uint8_t* data, std::size_t dataLen) { - File file = LittleFS.open("/config", "wb"); + File file = _configFS.open("/config", "wb"); if (!file) { ESP_LOGE(TAG, "Failed to open config file for writing"); return false; @@ -98,7 +102,7 @@ bool _trySaveConfig(const std::uint8_t* data, std::size_t dataLen) { bool _trySaveConfig() { flatbuffers::FlatBufferBuilder builder; - auto fbsConfig = _mainConfig.ToFlatbuffers(builder); + auto fbsConfig = _configData.ToFlatbuffers(builder); builder.Finish(fbsConfig); @@ -106,13 +110,22 @@ bool _trySaveConfig() { } void Config::Init() { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + return; + } + + if (!_configFS.begin(true, "/config", 3, "config")) { + ESP_PANIC(TAG, "Unable to mount config LittleFS partition!"); + } + if (_tryLoadConfig()) { return; } ESP_LOGW(TAG, "Failed to load config, writing default config"); - _mainConfig.ToDefault(); + _configData.ToDefault(); if (!_trySaveConfig()) { ESP_PANIC(TAG, "Failed to save default config. Recommend formatting microcontroller and re-flashing firmware"); @@ -120,7 +133,14 @@ void Config::Init() { } std::string Config::GetAsJSON() { - cJSON* root = _mainConfig.ToJSON(); + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + return ""; + } + + cJSON* root = _configData.ToJSON(); + + lock.unlock(); char* json = cJSON_PrintUnformatted(root); @@ -139,7 +159,14 @@ bool Config::SaveFromJSON(const std::string& json) { return false; } - bool result = _mainConfig.FromJSON(root); + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + cJSON_Delete(root); + return false; + } + + bool result = _configData.FromJSON(root); cJSON_Delete(root); @@ -152,10 +179,22 @@ bool Config::SaveFromJSON(const std::string& json) { } bool Config::GetRaw(std::vector& buffer) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + return _tryLoadConfig(buffer); } bool Config::SetRaw(const std::uint8_t* buffer, std::size_t size) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + OpenShock::Config::RootConfig config; if (!_tryDeserializeConfig(buffer, size, config)) { ESP_LOGE(TAG, "Failed to deserialize config"); @@ -166,38 +205,90 @@ bool Config::SetRaw(const std::uint8_t* buffer, std::size_t size) { } void Config::FactoryReset() { - if (!LittleFS.remove("/config") && LittleFS.exists("/config")) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return; + } + + _configData.ToDefault(); + + if (!_configFS.remove("/config") && _configFS.exists("/config")) { ESP_PANIC(TAG, "Failed to remove existing config file for factory reset. Reccomend formatting microcontroller and re-flashing firmware"); } -} -const Config::RFConfig& Config::GetRFConfig() { - return _mainConfig.rf; + if (!_trySaveConfig()) { + ESP_PANIC(TAG, "Failed to save default config. Recommend formatting microcontroller and re-flashing firmware"); + } + + ESP_LOGI(TAG, "Factory reset complete"); } -const Config::WiFiConfig& Config::GetWiFiConfig() { - return _mainConfig.wifi; +bool Config::GetRFConfig(Config::RFConfig& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.rf; + + return true; } -const std::vector& Config::GetWiFiCredentials() { - return _mainConfig.wifi.credentialsList; +bool Config::GetWiFiConfig(Config::WiFiConfig& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.wifi; + + return true; } -const Config::CaptivePortalConfig& Config::GetCaptivePortalConfig() { - return _mainConfig.captivePortal; +bool Config::GetWiFiCredentials(cJSON* array) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + for (auto& creds : _configData.wifi.credentialsList) { + cJSON* jsonCreds = creds.ToJSON(); + + cJSON_AddItemToArray(array, jsonCreds); + } + + return true; } -const Config::BackendConfig& Config::GetBackendConfig() { - return _mainConfig.backend; +bool Config::GetWiFiCredentials(std::vector& out) { + out = _configData.wifi.credentialsList; + + return true; } bool Config::SetRFConfig(const Config::RFConfig& config) { - _mainConfig.rf = config; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.rf = config; return _trySaveConfig(); } bool Config::SetWiFiConfig(const Config::WiFiConfig& config) { - _mainConfig.wifi = config; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.wifi = config; return _trySaveConfig(); } @@ -209,35 +300,106 @@ bool Config::SetWiFiCredentials(const std::vector& cred } } - _mainConfig.wifi.credentialsList = credentials; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.wifi.credentialsList = credentials; return _trySaveConfig(); } bool Config::SetCaptivePortalConfig(const Config::CaptivePortalConfig& config) { - _mainConfig.captivePortal = config; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.captivePortal = config; return _trySaveConfig(); } bool Config::SetBackendConfig(const Config::BackendConfig& config) { - _mainConfig.backend = config; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.backend = config; return _trySaveConfig(); } +bool Config::GetRFConfigTxPin(std::uint8_t& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.rf.txPin; + + return true; +} + bool Config::SetRFConfigTxPin(std::uint8_t txPin) { - _mainConfig.rf.txPin = txPin; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.rf.txPin = txPin; return _trySaveConfig(); } +bool Config::GetRFConfigKeepAliveEnabled(bool& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.rf.keepAliveEnabled; + + return true; +} + bool Config::SetRFConfigKeepAliveEnabled(bool enabled) { - _mainConfig.rf.keepAliveEnabled = enabled; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.rf.keepAliveEnabled = enabled; return _trySaveConfig(); } +bool Config::AnyWiFiCredentials(std::function predicate) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + } + + auto& creds = _configData.wifi.credentialsList; + + return std::any_of(creds.begin(), creds.end(), predicate); +} + std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::string& password) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + std::uint8_t id = 0; std::bitset<255> bits; - for (auto it = _mainConfig.wifi.credentialsList.begin(); it != _mainConfig.wifi.credentialsList.end(); ++it) { + for (auto it = _configData.wifi.credentialsList.begin(); it != _configData.wifi.credentialsList.end(); ++it) { auto& creds = *it; if (creds.ssid == ssid) { @@ -250,7 +412,7 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::stri if (creds.id == 0) { ESP_LOGW(TAG, "Found WiFi credentials with ID 0, removing"); - it = _mainConfig.wifi.credentialsList.erase(it); + it = _configData.wifi.credentialsList.erase(it); continue; } @@ -271,7 +433,7 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::stri return 0; } - _mainConfig.wifi.credentialsList.push_back({ + _configData.wifi.credentialsList.push_back({ .id = id, .ssid = ssid, .password = password, @@ -282,7 +444,13 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::stri } bool Config::TryGetWiFiCredentialsByID(std::uint8_t id, Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentialsList) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + for (auto& creds : _configData.wifi.credentialsList) { if (creds.id == id) { credentials = creds; return true; @@ -293,7 +461,13 @@ bool Config::TryGetWiFiCredentialsByID(std::uint8_t id, Config::WiFiCredentials& } bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentials& credentials) { - for (auto& creds : _mainConfig.wifi.credentialsList) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + for (auto& creds : _configData.wifi.credentialsList) { if (creds.ssid == ssid) { credentials = creds; return true; @@ -304,7 +478,13 @@ bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentia } std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { - for (auto& creds : _mainConfig.wifi.credentialsList) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + for (auto& creds : _configData.wifi.credentialsList) { if (creds.ssid == ssid) { return creds.id; } @@ -314,9 +494,15 @@ std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { } bool Config::RemoveWiFiCredentials(std::uint8_t id) { - for (auto it = _mainConfig.wifi.credentialsList.begin(); it != _mainConfig.wifi.credentialsList.end(); ++it) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + for (auto it = _configData.wifi.credentialsList.begin(); it != _configData.wifi.credentialsList.end(); ++it) { if (it->id == id) { - _mainConfig.wifi.credentialsList.erase(it); + _configData.wifi.credentialsList.erase(it); _trySaveConfig(); return true; } @@ -325,25 +511,58 @@ bool Config::RemoveWiFiCredentials(std::uint8_t id) { return false; } -void Config::ClearWiFiCredentials() { - _mainConfig.wifi.credentialsList.clear(); - _trySaveConfig(); +bool Config::ClearWiFiCredentials() { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.wifi.credentialsList.clear(); + + return _trySaveConfig(); } bool Config::HasBackendAuthToken() { - return !_mainConfig.backend.authToken.empty(); + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + return !_configData.backend.authToken.empty(); } -const std::string& Config::GetBackendAuthToken() { - return _mainConfig.backend.authToken; +bool Config::GetBackendAuthToken(std::string& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.backend.authToken; + + return true; } bool Config::SetBackendAuthToken(const std::string& token) { - _mainConfig.backend.authToken = token; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.backend.authToken = token; return _trySaveConfig(); } bool Config::ClearBackendAuthToken() { - _mainConfig.backend.authToken = ""; + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + return false; + } + + _configData.backend.authToken = ""; return _trySaveConfig(); } diff --git a/src/main.cpp b/src/main.cpp index cc209f32..6d8e32d9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,7 +20,7 @@ const char* const TAG = "OpenShock"; void setup() { Serial.begin(115'200); - if (!LittleFS.begin(true)) { + if (!LittleFS.begin(true, "/static", 10, "static0")) { ESP_PANIC(TAG, "Unable to mount LittleFS"); } diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index b8c85f99..627107fa 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -72,9 +72,7 @@ bool _isConnectRateLimited(const WiFiNetwork& net) { } bool _isSaved(std::function predicate) { - const auto& credentials = Config::GetWiFiCredentials(); - - return std::any_of(credentials.begin(), credentials.end(), predicate); + return Config::AnyWiFiCredentials(predicate); } std::vector::iterator _findNetwork(std::function predicate, bool sortByAttractivity = true) { if (sortByAttractivity) { From c7c5a98e55fa50a3b6057f7bf266e271f06cbe12 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Wed, 13 Dec 2023 14:16:05 -0800 Subject: [PATCH 048/147] Serial Input Handler Cleanup and Improvements (#155) * Start of Serial Input Handler cleanup: RMT Pin to RF TX Pin Start of Serial Echo while typing More reliable handling of pasted commands Add alias for restart Add RTOS debug info command Switching to case-insensitive checks for command names Clearing serial buffer Allow adding networks without ID parameter in JSON * Make Serial Echo toggleable, add Init to Serial Input Handler * Add comments and always print out buffer being processed * Serial "Debug Info" command * Add missing Time.h inclusion * Add uptime to debug info command * Better ip address printing * Fix const violation error * IPAddress doesnt have implicit uint8_t* operator * Use BSSID FormatHelpers, Add On/Off to bool check * Remove multiple input options * Concise wording * Change "txpin" to "rftxpin" --------- Co-authored-by: HentaiHeavenVR --- .../open-shock/serialization/configuration.ts | 1 + .../serialization/configuration/config.ts | 15 +- .../configuration/serial-input-config.ts | 49 +++ include/FormatHelpers.h | 9 + include/SerialInputHandler.h | 1 + include/config/Config.h | 7 +- include/config/RootConfig.h | 8 +- include/config/SerialInputConfig.h | 20 ++ .../serialization/_fbs/ConfigFile_generated.h | 70 +++- include/wifi/WiFiManager.h | 10 + schemas/ConfigFile.fbs | 8 + src/SerialInputHandler.cpp | 328 ++++++++++++++---- src/config/Config.cpp | 17 +- src/config/RootConfig.cpp | 14 +- src/config/SerialInputConfig.cpp | 69 ++++ src/config/WiFiCredentials.cpp | 32 +- src/main.cpp | 7 +- src/wifi/WiFiManager.cpp | 39 ++- 18 files changed, 610 insertions(+), 94 deletions(-) create mode 100644 WebUI/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts create mode 100644 include/config/SerialInputConfig.h create mode 100644 src/config/SerialInputConfig.cpp diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts index 1f71591a..a1d1dbf0 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration.ts @@ -4,5 +4,6 @@ export { BackendConfig } from './serialization/configuration/backend-config.js'; export { CaptivePortalConfig } from './serialization/configuration/captive-portal-config.js'; export { Config } from './serialization/configuration/config.js'; export { RFConfig } from './serialization/configuration/rfconfig.js'; +export { SerialInputConfig } from './serialization/configuration/serial-input-config.js'; export { WiFiConfig } from './serialization/configuration/wi-fi-config.js'; export { WiFiCredentials } from './serialization/configuration/wi-fi-credentials.js'; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts index b4aecfd8..d076ee45 100644 --- a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/config.ts @@ -5,6 +5,7 @@ import * as flatbuffers from 'flatbuffers'; import { BackendConfig } from '../../../open-shock/serialization/configuration/backend-config.js'; import { CaptivePortalConfig } from '../../../open-shock/serialization/configuration/captive-portal-config.js'; import { RFConfig } from '../../../open-shock/serialization/configuration/rfconfig.js'; +import { SerialInputConfig } from '../../../open-shock/serialization/configuration/serial-input-config.js'; import { WiFiConfig } from '../../../open-shock/serialization/configuration/wi-fi-config.js'; @@ -58,8 +59,16 @@ backend(obj?:BackendConfig):BackendConfig|null { return offset ? (obj || new BackendConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; } +/** + * Serial input configuration + */ +serialInput(obj?:SerialInputConfig):SerialInputConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 12); + return offset ? (obj || new SerialInputConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + static startConfig(builder:flatbuffers.Builder) { - builder.startObject(4); + builder.startObject(5); } static addRf(builder:flatbuffers.Builder, rfOffset:flatbuffers.Offset) { @@ -78,6 +87,10 @@ static addBackend(builder:flatbuffers.Builder, backendOffset:flatbuffers.Offset) builder.addFieldOffset(3, backendOffset, 0); } +static addSerialInput(builder:flatbuffers.Builder, serialInputOffset:flatbuffers.Offset) { + builder.addFieldOffset(4, serialInputOffset, 0); +} + static endConfig(builder:flatbuffers.Builder):flatbuffers.Offset { const offset = builder.endObject(); return offset; diff --git a/WebUI/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts new file mode 100644 index 00000000..63bbe528 --- /dev/null +++ b/WebUI/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts @@ -0,0 +1,49 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +import * as flatbuffers from 'flatbuffers'; + +export class SerialInputConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):SerialInputConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { + return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Whether to echo typed characters back to the serial console + */ +echoEnabled():boolean { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true; +} + +static startSerialInputConfig(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addEchoEnabled(builder:flatbuffers.Builder, echoEnabled:boolean) { + builder.addFieldInt8(0, +echoEnabled, +true); +} + +static endSerialInputConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createSerialInputConfig(builder:flatbuffers.Builder, echoEnabled:boolean):flatbuffers.Offset { + SerialInputConfig.startSerialInputConfig(builder); + SerialInputConfig.addEchoEnabled(builder, echoEnabled); + return SerialInputConfig.endSerialInputConfig(builder); +} +} diff --git a/include/FormatHelpers.h b/include/FormatHelpers.h index abc74a3a..be5035b2 100644 --- a/include/FormatHelpers.h +++ b/include/FormatHelpers.h @@ -2,3 +2,12 @@ #define BSSID_FMT "%02X:%02X:%02X:%02X:%02X:%02X" #define BSSID_ARG(bssid) bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5] +#define BSSID_FMT_LEN 18 + +#define IPV4ADDR_FMT "%u.%u.%u.%u" +#define IPV4ADDR_ARG(addr) addr[0], addr[1], addr[2], addr[3] +#define IPV4ADDR_FMT_LEN 15 + +#define IPV6ADDR_FMT "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x" +#define IPV6ADDR_ARG(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15] +#define IPV6ADDR_FMT_LEN 39 diff --git a/include/SerialInputHandler.h b/include/SerialInputHandler.h index e6d52e00..448d6475 100644 --- a/include/SerialInputHandler.h +++ b/include/SerialInputHandler.h @@ -3,6 +3,7 @@ #include namespace OpenShock::SerialInputHandler { + bool Init(); void Update(); void PrintWelcomeHeader(); diff --git a/include/config/Config.h b/include/config/Config.h index c19cdc9b..5b9af733 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -3,6 +3,7 @@ #include "config/BackendConfig.h" #include "config/CaptivePortalConfig.h" #include "config/RFConfig.h" +#include "config/SerialInputConfig.h" #include "config/WiFiConfig.h" #include "config/WiFiCredentials.h" @@ -24,7 +25,7 @@ namespace OpenShock::Config { /** * @brief Resets the config file to the factory default values. * - * @note A reboot after calling this function is HIGHLY recommended. + * @note A restart after calling this function is HIGHLY recommended. */ void FactoryReset(); @@ -37,6 +38,7 @@ namespace OpenShock::Config { bool SetWiFiConfig(const WiFiConfig& config); bool SetWiFiCredentials(const std::vector& credentials); bool SetCaptivePortalConfig(const CaptivePortalConfig& config); + bool SetSerialInputConfig(const SerialInputConfig& config); bool SetBackendConfig(const BackendConfig& config); bool GetRFConfigTxPin(std::uint8_t& out); @@ -44,6 +46,9 @@ namespace OpenShock::Config { bool GetRFConfigKeepAliveEnabled(bool& out); bool SetRFConfigKeepAliveEnabled(bool enabled); + bool GetSerialInputConfigEchoEnabled(bool& out); + bool SetSerialInputConfigEchoEnabled(bool enabled); + bool AnyWiFiCredentials(std::function predicate); std::uint8_t AddWiFiCredentials(const std::string& ssid, const std::string& password); diff --git a/include/config/RootConfig.h b/include/config/RootConfig.h index 68299ed6..2d40f358 100644 --- a/include/config/RootConfig.h +++ b/include/config/RootConfig.h @@ -1,10 +1,11 @@ #pragma once -#include "config/RFConfig.h" -#include "config/WiFiConfig.h" -#include "config/CaptivePortalConfig.h" #include "config/BackendConfig.h" +#include "config/CaptivePortalConfig.h" #include "config/ConfigBase.h" +#include "config/RFConfig.h" +#include "config/SerialInputConfig.h" +#include "config/WiFiConfig.h" namespace OpenShock::Config { struct RootConfig : public ConfigBase { @@ -12,6 +13,7 @@ namespace OpenShock::Config { OpenShock::Config::WiFiConfig wifi; OpenShock::Config::CaptivePortalConfig captivePortal; OpenShock::Config::BackendConfig backend; + OpenShock::Config::SerialInputConfig serialInput; void ToDefault() override; diff --git a/include/config/SerialInputConfig.h b/include/config/SerialInputConfig.h new file mode 100644 index 00000000..d34c1dfa --- /dev/null +++ b/include/config/SerialInputConfig.h @@ -0,0 +1,20 @@ +#pragma once + +#include "config/ConfigBase.h" + +namespace OpenShock::Config { + struct SerialInputConfig : public ConfigBase { + SerialInputConfig(); + SerialInputConfig(bool echoEnabled); + + bool echoEnabled; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::SerialInputConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON() const override; + }; +} // namespace OpenShock::Config diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index bcdd0d53..06eeb171 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -32,6 +32,9 @@ struct CaptivePortalConfigBuilder; struct BackendConfig; struct BackendConfigBuilder; +struct SerialInputConfig; +struct SerialInputConfigBuilder; + struct Config; struct ConfigBuilder; @@ -406,6 +409,57 @@ inline ::flatbuffers::Offset CreateBackendConfigDirect( auth_token__); } +struct SerialInputConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef SerialInputConfigBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Configuration.SerialInputConfig"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ECHO_ENABLED = 4 + }; + /// Whether to echo typed characters back to the serial console + bool echo_enabled() const { + return GetField(VT_ECHO_ENABLED, 1) != 0; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ECHO_ENABLED, 1) && + verifier.EndTable(); + } +}; + +struct SerialInputConfigBuilder { + typedef SerialInputConfig Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_echo_enabled(bool echo_enabled) { + fbb_.AddElement(SerialInputConfig::VT_ECHO_ENABLED, static_cast(echo_enabled), 1); + } + explicit SerialInputConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateSerialInputConfig( + ::flatbuffers::FlatBufferBuilder &_fbb, + bool echo_enabled = true) { + SerialInputConfigBuilder builder_(_fbb); + builder_.add_echo_enabled(echo_enabled); + return builder_.Finish(); +} + +struct SerialInputConfig::Traits { + using type = SerialInputConfig; + static auto constexpr Create = CreateSerialInputConfig; +}; + struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef ConfigBuilder Builder; struct Traits; @@ -416,7 +470,8 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_RF = 4, VT_WIFI = 6, VT_CAPTIVE_PORTAL = 8, - VT_BACKEND = 10 + VT_BACKEND = 10, + VT_SERIAL_INPUT = 12 }; /// RF Transmitter configuration const OpenShock::Serialization::Configuration::RFConfig *rf() const { @@ -434,6 +489,10 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const OpenShock::Serialization::Configuration::BackendConfig *backend() const { return GetPointer(VT_BACKEND); } + /// Serial input configuration + const OpenShock::Serialization::Configuration::SerialInputConfig *serial_input() const { + return GetPointer(VT_SERIAL_INPUT); + } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_RF) && @@ -444,6 +503,8 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { verifier.VerifyTable(captive_portal()) && VerifyOffset(verifier, VT_BACKEND) && verifier.VerifyTable(backend()) && + VerifyOffset(verifier, VT_SERIAL_INPUT) && + verifier.VerifyTable(serial_input()) && verifier.EndTable(); } }; @@ -464,6 +525,9 @@ struct ConfigBuilder { void add_backend(::flatbuffers::Offset backend) { fbb_.AddOffset(Config::VT_BACKEND, backend); } + void add_serial_input(::flatbuffers::Offset serial_input) { + fbb_.AddOffset(Config::VT_SERIAL_INPUT, serial_input); + } explicit ConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -480,8 +544,10 @@ inline ::flatbuffers::Offset CreateConfig( ::flatbuffers::Offset rf = 0, ::flatbuffers::Offset wifi = 0, ::flatbuffers::Offset captive_portal = 0, - ::flatbuffers::Offset backend = 0) { + ::flatbuffers::Offset backend = 0, + ::flatbuffers::Offset serial_input = 0) { ConfigBuilder builder_(_fbb); + builder_.add_serial_input(serial_input); builder_.add_backend(backend); builder_.add_captive_portal(captive_portal); builder_.add_wifi(wifi); diff --git a/include/wifi/WiFiManager.h b/include/wifi/WiFiManager.h index 910e4c01..db22657b 100644 --- a/include/wifi/WiFiManager.h +++ b/include/wifi/WiFiManager.h @@ -52,6 +52,16 @@ namespace OpenShock::WiFiManager { /// @return True if the device is connected to a network bool GetConnectedNetwork(OpenShock::WiFiNetwork& network); + /// @brief Gets the devices IP address if it's connected to a network (IPv4) + /// @param ipAddress Variable to store the IP address in + /// @return True if the device is connected to a network + bool GetIPAddress(char* ipAddress); + + /// @brief Gets the devices IP address if it's connected to a network (IPv6) + /// @param ipAddress Variable to store the IP address in + /// @return True if the device is connected to a network + bool GetIPv6Address(char* ipAddress); + /// @brief Runs the WiFiManager loop void Update(); } // namespace OpenShock::WiFiManager diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index cf138c77..94b656c2 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -44,6 +44,11 @@ table BackendConfig { auth_token:string; } +table SerialInputConfig { + /// Whether to echo typed characters back to the serial console + echo_enabled:bool = true; +} + table Config { /// RF Transmitter configuration rf:RFConfig; @@ -56,4 +61,7 @@ table Config { /// Backend configuration backend:BackendConfig; + + /// Serial input configuration + serial_input:SerialInputConfig; } diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 0e8d6bb7..5d1350e6 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -2,8 +2,11 @@ #include "CommandHandler.h" #include "config/Config.h" +#include "config/SerialInputConfig.h" +#include "FormatHelpers.h" #include "Logging.h" #include "serialization/JsonSerial.h" +#include "Time.h" #include "util/Base64Utils.h" #include "wifi/WiFiManager.h" @@ -21,10 +24,17 @@ const char* const TAG = "SerialInputHandler"; using namespace OpenShock; +constexpr std::int64_t PASTE_INTERVAL_THRESHOLD_MS = 20; +constexpr std::size_t SERIAL_BUFFER_CLEAR_THRESHOLD = 512; + +static bool s_echoEnabled = true; + #define kCommandHelp "help" #define kCommandVersion "version" #define kCommandRestart "restart" -#define kCommandRmtpin "rmtpin" +#define kCommandSystemInfo "sysinfo" +#define kCommandSerialEcho "echo" +#define kCommandRfTxPin "rftxpin" #define kCommandAuthToken "authtoken" #define kCommandNetworks "networks" #define kCommandKeepAlive "keepalive" @@ -33,45 +43,52 @@ using namespace OpenShock; #define kCommandFactoryReset "factoryreset" void _handleHelpCommand(char* arg, std::size_t argLength) { - SerialInputHandler::PrintWelcomeHeader(); if (arg == nullptr || argLength <= 0) { + SerialInputHandler::PrintWelcomeHeader(); // Raw string literal (1+ to remove the first newline) Serial.print(1 + R"( help print this menu help print help for a command version print version information restart restart the board -rmtpin get radio pin -rmtpin set radio pin +sysinfo print debug information for various subsystems +echo get serial echo enabled +echo set serial echo enabled +rftxpin get radio transmit pin +rftxpin set radio transmit pin +authtoken get auth token authtoken set auth token networks get all saved networks networks set all saved networks -keepalive get shocker keep-alive status -keepalive enable/disable shocker keep-alive +keepalive get shocker keep-alive enabled +keepalive set shocker keep-alive enabled rawconfig get raw binary config rawconfig set raw binary config rftransmit transmit a RF command -factoryreset reset device to factory defaults and reboot +factoryreset reset device to factory defaults and restart )"); return; } - if (strcmp(arg, kCommandRmtpin) == 0) { - Serial.print(kCommandRmtpin R"( + if (strcasecmp(arg, kCommandRfTxPin) == 0) { + Serial.print(kCommandRfTxPin R"( Get the GPIO pin used for the radio transmitter. -rmtpin [] +rftxpin [] Set the GPIO pin used for the radio transmitter. Arguments: must be a number. Example: - rmtpin 15 + rftxpin 15 )"); return; } - if (strcmp(arg, kCommandAuthToken) == 0) { - Serial.print(kCommandAuthToken R"( + if (strcasecmp(arg, kCommandAuthToken) == 0) { + Serial.print(kCommandAuthToken R"( + Get the backend auth token. + +authtoken [] Set the auth token. Arguments: must be a string. @@ -81,7 +98,31 @@ rmtpin [] return; } - if (strcmp(arg, kCommandNetworks) == 0) { + if (strcasecmp(arg, kCommandSystemInfo) == 0) { + Serial.print(kCommandSystemInfo R"( + Get system information from RTOS, WiFi, etc. + Example: + sysinfo +)"); + return; + } + + if (strcasecmp(arg, kCommandSerialEcho) == 0) { + Serial.print(kCommandSerialEcho R"( + Get the serial echo status. + If enabled, typed characters are echoed back to the serial port. + +echo [] + Enable/disable serial echo. + Arguments: + must be a boolean. + Example: + echo true +)"); + return; + } + + if (strcasecmp(arg, kCommandNetworks) == 0) { Serial.print(kCommandNetworks R"( Get all saved networks. @@ -91,13 +132,14 @@ networks [] must be a array of objects with the following fields: ssid (string) SSID of the network password (string) Password of the network + id (number) ID of the network (optional) Example: networks [{\"ssid\":\"myssid\",\"password\":\"mypassword\"}] )"); return; } - if (strcmp(arg, kCommandKeepAlive) == 0) { + if (strcasecmp(arg, kCommandKeepAlive) == 0) { Serial.print(kCommandKeepAlive R"( Get the shocker keep-alive status. @@ -111,7 +153,7 @@ keepalive [] return; } - if (strcmp(arg, kCommandRestart) == 0) { + if (strcasecmp(arg, kCommandRestart) == 0) { Serial.print(kCommandRestart R"( Restart the board Example: @@ -120,14 +162,14 @@ keepalive [] return; } - if (strcmp(arg, kCommandRawConfig) == 0) { + if (strcasecmp(arg, kCommandRawConfig) == 0) { Serial.print(kCommandRawConfig R"( Get the raw binary config Example: rawconfig rawconfig - Set the raw binary config, and reboot + Set the raw binary config, and restart Arguments: must be a base64 encoded string Example: @@ -136,16 +178,16 @@ rawconfig return; } - if (strcmp(arg, kCommandFactoryReset) == 0) { + if (strcasecmp(arg, kCommandFactoryReset) == 0) { Serial.print(kCommandFactoryReset R"( - Reset the device to factory defaults and reboot + Reset the device to factory defaults and restart Example: factoryreset )"); return; } - if (strcmp(arg, kCommandVersion) == 0) { + if (strcasecmp(arg, kCommandVersion) == 0) { Serial.print(kCommandVersion R"( Print version information Example: @@ -154,7 +196,7 @@ rawconfig return; } - if (strcmp(arg, kCommandHelp) == 0) { + if (strcasecmp(arg, kCommandHelp) == 0) { Serial.print(kCommandHelp R"( [] Print help information Arguments: @@ -165,7 +207,7 @@ rawconfig return; } - if (strcmp(arg, kCommandRFTransmit) == 0) { + if (strcasecmp(arg, kCommandRFTransmit) == 0) { Serial.print(kCommandRFTransmit R"( Transmit a RF command Arguments: @@ -176,7 +218,7 @@ rawconfig intensity (number) Intensity of the command (0-255) durationMs (number) Duration of the command in milliseconds (0-65535) Example: - rftransmit {"model":"caixianlin","id":12345,"type":"shock","intensity":99,"duration_ms":500} + rftransmit {"model":"caixianlin","id":12345,"type":"vibrate","intensity":99,"durationMs":500} )"); return; } @@ -184,25 +226,25 @@ rawconfig Serial.println("Command not found"); } -// Checks if the given argument is a boolean -// Returns 0 if false, 1 if true, 255 if invalid -// Valid inputs: true, false, 1, 0, yes, no, y, n -// Case-insensitive -std::uint8_t _argToBool(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { - return 255; +/// @brief Tries to parse a boolean from a string (case-insensitive) +/// @param str Input string +/// @param strLen Length of input string +/// @param out Output boolean +/// @return True if the argument is a boolean, false otherwise +bool _tryParseBool(char* str, std::size_t strLen, bool& out) { + if (str == nullptr || strLen <= 0) { + return false; } - // Convert to lowercase - std::transform(arg, arg + argLength, arg, ::tolower); + if (strcasecmp(str, "true") == 0) { + return true; + } - if (strcmp(arg, "true") == 0 || strcmp(arg, "1") == 0 || strcmp(arg, "yes") == 0 || strcmp(arg, "y") == 0) { - return 1; - } else if (strcmp(arg, "false") == 0 || strcmp(arg, "0") == 0 || strcmp(arg, "no") == 0 || strcmp(arg, "n") == 0) { - return 0; - } else { - return 255; + if (strcasecmp(str, "false") == 0) { + return true; } + + return false; } void _handleVersionCommand(char* arg, std::size_t argLength) { @@ -218,11 +260,11 @@ void _handleRestartCommand(char* arg, std::size_t argLength) { void _handleFactoryResetCommand(char* arg, std::size_t argLength) { Serial.println("Resetting to factory defaults..."); Config::FactoryReset(); - Serial.println("Rebooting..."); + Serial.println("Restarting..."); ESP.restart(); } -void _handleRmtpinCommand(char* arg, std::size_t argLength) { +void _handleRfTxPinCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { std::uint8_t txPin; if (!Config::GetRFConfigTxPin(txPin)) { @@ -246,20 +288,47 @@ void _handleRmtpinCommand(char* arg, std::size_t argLength) { return; } - OpenShock::CommandHandler::SetRfTxPin(static_cast(pin)); + OpenShock::SetRfPinResultCode result = OpenShock::CommandHandler::SetRfTxPin(static_cast(pin)); - SERPR_SUCCESS("Saved config"); + switch (result) { + case OpenShock::SetRfPinResultCode::InvalidPin: + SERPR_ERROR("Invalid argument (invalid pin)"); + break; + + case OpenShock::SetRfPinResultCode::InternalError: + SERPR_ERROR("Internal error while setting RF TX pin"); + break; + + case OpenShock::SetRfPinResultCode::Success: + SERPR_SUCCESS("Saved config"); + break; + + default: + SERPR_ERROR("Unknown error while setting RF TX pin"); + break; + } } void _handleAuthtokenCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { - SERPR_ERROR("Invalid argument"); + std::string authToken; + if (!Config::GetBackendAuthToken(authToken)) { + SERPR_ERROR("Failed to get auth token from config"); + return; + } + + // Get auth token + SERPR_RESPONSE("AuthToken|%s", authToken.c_str()); return; } - OpenShock::Config::SetBackendAuthToken(std::string(arg, argLength)); + bool result = OpenShock::Config::SetBackendAuthToken(std::string(arg, argLength)); - SERPR_SUCCESS("Saved config"); + if (result) { + SERPR_SUCCESS("Saved config"); + } else { + SERPR_ERROR("Failed to save config"); + } } void _handleNetworksCommand(char* arg, std::size_t argLength) { @@ -312,7 +381,11 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - ESP_LOGI(TAG, "Adding network to config %s", cred.ssid.c_str()); + if (cred.id == 0) { + cred.id = id++; + } + + ESP_LOGI(TAG, "Adding network \"%s\" to config, id=%u", cred.ssid.c_str(), cred.id); creds.push_back(std::move(cred)); } @@ -328,9 +401,10 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { } void _handleKeepAliveCommand(char* arg, std::size_t argLength) { + bool keepAliveEnabled; + if (arg == nullptr || argLength <= 0) { // Get keep alive status - bool keepAliveEnabled; if (!Config::GetRFConfigKeepAliveEnabled(keepAliveEnabled)) { SERPR_ERROR("Failed to get keep-alive status from config"); return; @@ -340,16 +414,41 @@ void _handleKeepAliveCommand(char* arg, std::size_t argLength) { return; } - std::uint8_t enabled = _argToBool(arg, argLength); - - if (enabled == 255) { + if (!_tryParseBool(arg, argLength, keepAliveEnabled)) { SERPR_ERROR("Invalid argument (not a boolean)"); return; + } + + bool result = OpenShock::CommandHandler::SetKeepAliveEnabled(keepAliveEnabled); + + if (result) { + SERPR_SUCCESS("Saved config"); } else { - OpenShock::CommandHandler::SetKeepAliveEnabled(enabled); + SERPR_ERROR("Failed to save config"); } +} - SERPR_SUCCESS("Saved config"); +void _handleSerialEchoCommand(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength <= 0) { + // Get current serial echo status + SERPR_RESPONSE("SerialEcho|%s", s_echoEnabled ? "true" : "false"); + return; + } + + bool enabled; + if (!_tryParseBool(arg, argLength, enabled)) { + SERPR_ERROR("Invalid argument (not a boolean)"); + return; + } + + bool result = Config::SetSerialInputConfigEchoEnabled(enabled); + s_echoEnabled = enabled; + + if (result) { + SERPR_SUCCESS("Saved config"); + } else { + SERPR_ERROR("Failed to save config"); + } } void _handleRawConfigCommand(char* arg, std::size_t argLength) { @@ -383,12 +482,44 @@ void _handleRawConfigCommand(char* arg, std::size_t argLength) { return; } - SERPR_SUCCESS("Saved config"); + SERPR_SUCCESS("Saved config, restarting..."); ESP.restart(); } +void _handleDebugInfoCommand(char* arg, std::size_t argLength) { + SERPR_RESPONSE("RTOSInfo|Free Heap|%u", xPortGetFreeHeapSize()); + SERPR_RESPONSE("RTOSInfo|Min Free Heap|%u", xPortGetMinimumEverFreeHeapSize()); + + const std::int64_t now = OpenShock::millis(); + SERPR_RESPONSE("RTOSInfo|UptimeMS|%llu", now); + + const std::int64_t seconds = now / 1000; + const std::int64_t minutes = seconds / 60; + const std::int64_t hours = minutes / 60; + const std::int64_t days = hours / 24; + SERPR_RESPONSE("RTOSInfo|Uptime|%llud %lluh %llum %llus", days, hours % 24, minutes % 60, seconds % 60); + + OpenShock::WiFiNetwork network; + bool connected = OpenShock::WiFiManager::GetConnectedNetwork(network); + SERPR_RESPONSE("WiFiInfo|Connected|%s", connected ? "true" : "false"); + if (connected) { + SERPR_RESPONSE("WiFiInfo|SSID|%s", network.ssid); + SERPR_RESPONSE("WiFiInfo|BSSID|" BSSID_FMT, BSSID_ARG(network.bssid)); + + char ipAddressBuffer[64]; + OpenShock::WiFiManager::GetIPAddress(ipAddressBuffer); + SERPR_RESPONSE("WiFiInfo|IPv4|%s", ipAddressBuffer); + OpenShock::WiFiManager::GetIPv6Address(ipAddressBuffer); + SERPR_RESPONSE("WiFiInfo|IPv6|%s", ipAddressBuffer); + } +} + void _handleRFTransmitCommand(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength <= 0) { + SERPR_ERROR("No command"); + return; + } cJSON* root = cJSON_ParseWithLength(arg, argLength); if (root == nullptr) { SERPR_ERROR("Failed to parse JSON: %s", cJSON_GetErrorPtr()); @@ -417,7 +548,9 @@ static std::unordered_map s_commandHa { kCommandHelp, _handleHelpCommand}, { kCommandVersion, _handleVersionCommand}, { kCommandRestart, _handleRestartCommand}, - { kCommandRmtpin, _handleRmtpinCommand}, + { kCommandSystemInfo, _handleDebugInfoCommand}, + { kCommandSerialEcho, _handleSerialEchoCommand}, + { kCommandRfTxPin, _handleRfTxPinCommand}, { kCommandAuthToken, _handleAuthtokenCommand}, { kCommandNetworks, _handleNetworksCommand}, { kCommandKeepAlive, _handleKeepAliveCommand}, @@ -437,6 +570,8 @@ int findChar(const char* buffer, std::size_t bufferSize, char c) { } int findLineEnd(const char* buffer, int bufferSize) { + if (bufferSize <= 0) return -1; + for (int i = 0; i < bufferSize; i++) { if (buffer[i] == '\r' || buffer[i] == '\n' || buffer[i] == '\0') { return i; @@ -448,8 +583,9 @@ int findLineEnd(const char* buffer, int bufferSize) { int findLineStart(const char* buffer, int bufferSize, int lineEnd) { if (lineEnd < 0) return -1; + if (lineEnd >= bufferSize) return -1; - for (int i = lineEnd; i < bufferSize - lineEnd; i++) { + for (int i = lineEnd + 1; i < bufferSize; i++) { if (buffer[i] != '\r' && buffer[i] != '\n' && buffer[i] != '\0') { return i; } @@ -470,7 +606,7 @@ void processSerialLine(char* data, std::size_t length) { char* arg = nullptr; std::size_t argLength = 0; - // Handle arg-less commands + // If there is a delimiter, split the command and argument if (delimiter > 0) { data[delimiter] = '\0'; commandLength = delimiter; @@ -478,6 +614,9 @@ void processSerialLine(char* data, std::size_t length) { argLength = length - delimiter - 1; } + // Convert command to lowercase + std::transform(command, command + commandLength, command, ::tolower); + // TODO: Clean this up, test this auto it = s_commandHandlers.find(std::string(command, commandLength)); if (it != s_commandHandlers.end()) { @@ -485,17 +624,44 @@ void processSerialLine(char* data, std::size_t length) { return; } - Serial.println("$SYS$|Error|Command not found"); + if (commandLength > 0) { + SERPR_ERROR("Command \"%.*s\" not found", commandLength, command); + } else { + SERPR_ERROR("No command"); + } +} + +bool SerialInputHandler::Init() { + SerialInputHandler::PrintWelcomeHeader(); + SerialInputHandler::PrintVersionInfo(); + Serial.println(); + + if (!Config::GetSerialInputConfigEchoEnabled(s_echoEnabled)) { + ESP_LOGE(TAG, "Failed to get serial echo status from config"); + return false; + } + + return true; } void SerialInputHandler::Update() { static char* buffer = nullptr; // TODO: Clean up this buffer every once in a while static std::size_t bufferSize = 0; static std::size_t bufferIndex = 0; + static std::int64_t lastEcho = 0; + static bool suppressingPaste = false; while (true) { int available = Serial.available(); - if (available <= 0) { + if (available <= 0 && findLineEnd(buffer, bufferIndex) == -1) { + // If we're suppressing paste, and we haven't printed anything in a while, print the buffer and stop suppressing + if (s_echoEnabled && suppressingPaste && OpenShock::millis() - lastEcho > PASTE_INTERVAL_THRESHOLD_MS) { + // \r - carriage return, moves to start of line + // \x1B[K - clears rest of line + Serial.printf("\r\x1B[K> %.*s", bufferIndex, buffer); + lastEcho = OpenShock::millis(); + suppressingPaste = false; + } break; } @@ -504,21 +670,52 @@ void SerialInputHandler::Update() { buffer = static_cast(realloc(buffer, bufferSize)); } - bufferIndex += Serial.readBytes(buffer + bufferIndex, available); + while (available-- > 0) { + char c = Serial.read(); + // Handle backspace + if (c == '\b') { + if (bufferIndex > 0) { + bufferIndex--; + } + continue; + } + buffer[bufferIndex++] = c; + } int lineEnd = findLineEnd(buffer, bufferIndex); + // No newline found, wait for more input if (lineEnd == -1) { + if (s_echoEnabled) { + // If we're typing without pasting, echo the buffer + if (OpenShock::millis() - lastEcho > PASTE_INTERVAL_THRESHOLD_MS) { + // \r - carriage return, moves to start of line + // \x1B[K - clears rest of line + Serial.printf("\r\x1B[K> %.*s", bufferIndex, buffer); + lastEcho = OpenShock::millis(); + suppressingPaste = false; + } else { + lastEcho = OpenShock::millis(); + suppressingPaste = true; + } + } break; } buffer[lineEnd] = '\0'; - Serial.printf("> %s\n", buffer); + Serial.printf("\r> %s\n", buffer); processSerialLine(buffer, lineEnd); - int nextLine = findLineStart(buffer, bufferIndex, lineEnd + 1); + int nextLine = findLineStart(buffer, bufferSize, lineEnd + 1); if (nextLine < 0) { bufferIndex = 0; + // Free buffer if it's too big + if (bufferSize > SERIAL_BUFFER_CLEAR_THRESHOLD) { + ESP_LOGV(TAG, "Clearing serial input buffer"); + bufferSize = 0; + free(buffer); + buffer = nullptr; + } break; } @@ -528,6 +725,13 @@ void SerialInputHandler::Update() { bufferIndex = remaining; } else { bufferIndex = 0; + // Free buffer if it's too big + if (bufferSize > SERIAL_BUFFER_CLEAR_THRESHOLD) { + ESP_LOGV(TAG, "Clearing serial input buffer"); + bufferSize = 0; + free(buffer); + buffer = nullptr; + } } } } diff --git a/src/config/Config.cpp b/src/config/Config.cpp index a649c7ec..4e2b88e4 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -1,9 +1,9 @@ #include "config/Config.h" #include "config/RootConfig.h" -#include "ReadWriteMutex.h" #include "Constants.h" #include "Logging.h" +#include "ReadWriteMutex.h" #include #include @@ -321,6 +321,21 @@ bool Config::SetCaptivePortalConfig(const Config::CaptivePortalConfig& config) { return _trySaveConfig(); } +bool Config::SetSerialInputConfig(const Config::SerialInputConfig& config) { + _configData.serialInput = config; + return _trySaveConfig(); +} + +bool Config::GetSerialInputConfigEchoEnabled(bool& out) { + out = _configData.serialInput.echoEnabled; + return true; +} + +bool Config::SetSerialInputConfigEchoEnabled(bool enabled) { + _configData.serialInput.echoEnabled = enabled; + return _trySaveConfig(); +} + bool Config::SetBackendConfig(const Config::BackendConfig& config) { ScopedWriteLock lock(&_configMutex); if (!lock.isLocked()) { diff --git a/src/config/RootConfig.cpp b/src/config/RootConfig.cpp index 02f08482..22ba8c68 100644 --- a/src/config/RootConfig.cpp +++ b/src/config/RootConfig.cpp @@ -11,6 +11,7 @@ void RootConfig::ToDefault() { wifi.ToDefault(); captivePortal.ToDefault(); backend.ToDefault(); + serialInput.ToDefault(); } bool RootConfig::FromFlatbuffers(const Serialization::Configuration::Config* config) { @@ -39,11 +40,16 @@ bool RootConfig::FromFlatbuffers(const Serialization::Configuration::Config* con return false; } + if (!serialInput.FromFlatbuffers(config->serial_input())) { + ESP_LOGE(TAG, "Unable to load serial input config"); + return false; + } + return true; } flatbuffers::Offset RootConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - return Serialization::Configuration::CreateConfig(builder, rf.ToFlatbuffers(builder), wifi.ToFlatbuffers(builder), captivePortal.ToFlatbuffers(builder), backend.ToFlatbuffers(builder)); + return Serialization::Configuration::CreateConfig(builder, rf.ToFlatbuffers(builder), wifi.ToFlatbuffers(builder), captivePortal.ToFlatbuffers(builder), backend.ToFlatbuffers(builder), serialInput.ToFlatbuffers(builder)); } bool RootConfig::FromJSON(const cJSON* json) { @@ -77,6 +83,11 @@ bool RootConfig::FromJSON(const cJSON* json) { return false; } + if (!serialInput.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "serialInput"))) { + ESP_LOGE(TAG, "Unable to load serial input config"); + return false; + } + return true; } @@ -87,6 +98,7 @@ cJSON* RootConfig::ToJSON() const { cJSON_AddItemToObject(root, "wifi", wifi.ToJSON()); cJSON_AddItemToObject(root, "captivePortal", captivePortal.ToJSON()); cJSON_AddItemToObject(root, "backend", backend.ToJSON()); + cJSON_AddItemToObject(root, "serialInput", serialInput.ToJSON()); return root; } diff --git a/src/config/SerialInputConfig.cpp b/src/config/SerialInputConfig.cpp new file mode 100644 index 00000000..94abfaaf --- /dev/null +++ b/src/config/SerialInputConfig.cpp @@ -0,0 +1,69 @@ +#include "config/SerialInputConfig.h" + +#include "Logging.h" + +const char* const TAG = "Config::SerialInputConfig"; + +using namespace OpenShock::Config; + +SerialInputConfig::SerialInputConfig() { + ToDefault(); +} + +SerialInputConfig::SerialInputConfig(bool echoEnabled) { + this->echoEnabled = echoEnabled; +} + +void SerialInputConfig::ToDefault() { + echoEnabled = true; +} + +bool SerialInputConfig::FromFlatbuffers(const Serialization::Configuration::SerialInputConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + echoEnabled = config->echo_enabled(); + + return true; +} + +flatbuffers::Offset SerialInputConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { + return Serialization::Configuration::CreateSerialInputConfig(builder, echoEnabled); +} + +bool SerialInputConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + const cJSON* echoEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "echoEnabled"); + if (echoEnabledJson == nullptr) { + ESP_LOGE(TAG, "echoEnabled is null"); + return false; + } + + if (!cJSON_IsBool(echoEnabledJson)) { + ESP_LOGE(TAG, "echoEnabled is not a bool"); + return false; + } + + echoEnabled = cJSON_IsTrue(echoEnabledJson); + + return true; +} + +cJSON* SerialInputConfig::ToJSON() const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddBoolToObject(root, "echoEnabled", echoEnabled); + + return root; +} diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp index bc017ff4..1ceb72f3 100644 --- a/src/config/WiFiCredentials.cpp +++ b/src/config/WiFiCredentials.cpp @@ -19,8 +19,8 @@ WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const } void WiFiCredentials::ToDefault() { - id = 0; - ssid = ""; + id = 0; + ssid = ""; password = ""; } @@ -54,22 +54,22 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { const cJSON* idJson = cJSON_GetObjectItemCaseSensitive(json, "id"); if (idJson == nullptr) { - ESP_LOGE(TAG, "id is null"); - return false; - } - - if (!cJSON_IsNumber(idJson)) { - ESP_LOGE(TAG, "id is not a number"); - return false; + ESP_LOGV(TAG, "id was null"); + id = 0; + } else { + if (!cJSON_IsNumber(idJson)) { + ESP_LOGE(TAG, "id is not a number"); + return false; + } + + if (idJson->valueint < 0 || idJson->valueint > UINT8_MAX) { + ESP_LOGE(TAG, "id is out of range"); + return false; + } + + id = idJson->valueint; } - if (idJson->valueint < 0 || idJson->valueint > UINT8_MAX) { - ESP_LOGE(TAG, "id is out of range"); - return false; - } - - id = idJson->valueint; - const cJSON* ssidJson = cJSON_GetObjectItemCaseSensitive(json, "ssid"); if (ssidJson == nullptr) { ESP_LOGE(TAG, "ssid is null"); diff --git a/src/main.cpp b/src/main.cpp index 6d8e32d9..a550aad0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,13 +28,14 @@ void setup() { OpenShock::VisualStateManager::Init(); - OpenShock::SerialInputHandler::PrintWelcomeHeader(); - OpenShock::SerialInputHandler::PrintVersionInfo(); - OpenShock::EStopManager::Init(100); // 100ms update interval OpenShock::Config::Init(); + if (!OpenShock::SerialInputHandler::Init()) { + ESP_PANIC(TAG, "Unable to initialize SerialInputHandler"); + } + if (!OpenShock::CommandHandler::Init()) { ESP_LOGW(TAG, "Unable to initialize CommandHandler"); } diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 627107fa..f9e5949d 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -193,7 +193,7 @@ void _evWiFiConnected(arduino_event_t* event) { if (it == s_wifiNetworks.end()) { s_connectedCredentialsID = 0; - ESP_LOGW(TAG, "Connected to unknown network " BSSID_FMT, BSSID_ARG(info.bssid)); + ESP_LOGW(TAG, "Connected to unscanned network \"%s\", BSSID: " BSSID_FMT, reinterpret_cast(info.ssid), BSSID_ARG(info.bssid)); return; } @@ -215,10 +215,9 @@ void _evWiFiGotIP(arduino_event_t* event) { void _evWiFiGotIP6(arduino_event_t* event) { auto& info = event->event_info.got_ip6; - std::uint8_t ip6[16]; - memcpy(ip6, &info.ip6_info.ip.addr, sizeof(ip6)); + std::uint8_t* ip6 = reinterpret_cast(&info.ip6_info.ip.addr); - ESP_LOGI(TAG, "Got IPv6 address %02x%02x:%02x%02x:%02x%02x:%02x%02x from network " BSSID_FMT, ip6[0], ip6[1], ip6[2], ip6[3], ip6[4], ip6[5], ip6[6], ip6[7], BSSID_ARG(s_connectedBSSID)); + ESP_LOGI(TAG, "Got IPv6 address " IPV6ADDR_FMT " from network " BSSID_FMT, IPV6ADDR_ARG(ip6), BSSID_ARG(s_connectedBSSID)); } void _evWiFiDisconnected(arduino_event_t* event) { s_wifiState = WiFiState::Disconnected; @@ -439,6 +438,15 @@ bool WiFiManager::IsConnected() { } bool WiFiManager::GetConnectedNetwork(OpenShock::WiFiNetwork& network) { if (s_connectedCredentialsID == 0) { + if (IsConnected()) { + // We connected without a scan, so populate the network with the current connection info manually + network.credentialsID = 255; + memcpy(network.ssid, WiFi.SSID().c_str(), WiFi.SSID().length() + 1); + memcpy(network.bssid, WiFi.BSSID(), sizeof(network.bssid)); + network.channel = WiFi.channel(); + network.rssi = WiFi.RSSI(); + return true; + } return false; } @@ -452,6 +460,29 @@ bool WiFiManager::GetConnectedNetwork(OpenShock::WiFiNetwork& network) { return true; } +bool WiFiManager::GetIPAddress(char* ipAddress) { + if (!IsConnected()) { + return false; + } + + IPAddress ip = WiFi.localIP(); + snprintf(ipAddress, IPV4ADDR_FMT_LEN + 1, IPV4ADDR_FMT, IPV4ADDR_ARG(ip)); + + return true; +} + +bool WiFiManager::GetIPv6Address(char* ipAddress) { + if (!IsConnected()) { + return false; + } + + IPv6Address ip = WiFi.localIPv6(); + const std::uint8_t* ipPtr = ip; // Using the implicit conversion operator of IPv6Address + snprintf(ipAddress, IPV6ADDR_FMT_LEN + 1, IPV6ADDR_FMT, IPV6ADDR_ARG(ipPtr)); + + return true; +} + static std::int64_t s_lastScanRequest = 0; void WiFiManager::Update() { if (s_wifiState != WiFiState::Disconnected || WiFiScanManager::IsScanning()) return; From 532355f56fc9dc78c21853a3c402e245166ae34d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 01:33:26 +0100 Subject: [PATCH 049/147] build(deps): Bump github/codeql-action from 2 to 3 (#159) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index dffafe36..4df561a4 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -42,17 +42,17 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # Build stuff here - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: '/language:${{matrix.language}}' @@ -79,7 +79,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ env.language }} @@ -90,6 +90,6 @@ jobs: skip-checkout: true - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: '/language:${{ env.language }}' From d68c5538f0a7f773692ff85975883f98896a3552 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 14 Dec 2023 11:04:20 +0100 Subject: [PATCH 050/147] Restrict GPIO19 and GPIO20 on ESP32S3 These are used for USB communication --- include/Chipset.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/Chipset.h b/include/Chipset.h index 74eae2a4..6af1fb0c 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -125,9 +125,10 @@ #ifdef OPENSHOCK_FW_CHIP_ESP32S3 #define OPENSHOCK_FW_CHIP_NAME "ESP32-S3" // GPIO44, GPIO43 is used for UART0 RXD/TXD. +// GPIO19, GPIO20 is used for USB serial, flashing, and debugging. // GPIO30, GPIO29, GPIO26, GPIO32, GPIO31, GPIO28, GPIO27, GPIO33, GPIO34, GPIO35, GPIO36, GPIO37 is used for SPI flash connection. (DO NOT TOUCH) // GPIO0, GPIO3, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_30 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_33 || pin == GPIO_NUM_34 || pin == GPIO_NUM_35 || pin == GPIO_NUM_36 || pin == GPIO_NUM_37 || pin == GPIO_NUM_0 || pin == GPIO_NUM_3 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) +#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_19 || pin == GPIO_NUM_20 || pin == GPIO_NUM_30 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_33 || pin == GPIO_NUM_34 || pin == GPIO_NUM_35 || pin == GPIO_NUM_36 || pin == GPIO_NUM_37 || pin == GPIO_NUM_0 || pin == GPIO_NUM_3 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) #endif // ESP32-S3-PICO-1 From 8dd3af2b0aaa2af9ca1a616cc734b7006950892d Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 14 Dec 2023 12:11:33 +0100 Subject: [PATCH 051/147] Implement AvailGPIO command (#160) * Implement AvailGPIO command * Remove last comma * Change name to ValidGPIOs --- src/SerialInputHandler.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/SerialInputHandler.cpp b/src/SerialInputHandler.cpp index 5d1350e6..df759673 100644 --- a/src/SerialInputHandler.cpp +++ b/src/SerialInputHandler.cpp @@ -7,6 +7,7 @@ #include "Logging.h" #include "serialization/JsonSerial.h" #include "Time.h" +#include "Chipset.h" #include "util/Base64Utils.h" #include "wifi/WiFiManager.h" @@ -34,6 +35,7 @@ static bool s_echoEnabled = true; #define kCommandRestart "restart" #define kCommandSystemInfo "sysinfo" #define kCommandSerialEcho "echo" +#define kCommandValidGPIOs "validgpios" #define kCommandRfTxPin "rftxpin" #define kCommandAuthToken "authtoken" #define kCommandNetworks "networks" @@ -54,6 +56,7 @@ restart restart the board sysinfo print debug information for various subsystems echo get serial echo enabled echo set serial echo enabled +validgpios list all valid GPIO pins rftxpin get radio transmit pin rftxpin set radio transmit pin authtoken get auth token @@ -162,6 +165,15 @@ keepalive [] return; } + if (strcasecmp(arg, kCommandValidGPIOs) == 0) { + Serial.print(kCommandValidGPIOs R"( + List all valid GPIO pins + Example: + validgpios +)"); + return; + } + if (strcasecmp(arg, kCommandRawConfig) == 0) { Serial.print(kCommandRawConfig R"( Get the raw binary config @@ -451,6 +463,29 @@ void _handleSerialEchoCommand(char* arg, std::size_t argLength) { } } +void _handleValidGpiosCommand(char* arg, std::size_t argLength) { + if (arg != nullptr && argLength > 0) { + SERPR_ERROR("Invalid argument (too many arguments)"); + return; + } + + auto pins = OpenShock::GetValidGPIOPins(); + + std::string buffer; + buffer.reserve(pins.count() * 4); + + for (std::size_t i = 0; i < pins.size(); i++) { + if (pins[i]) { + buffer.append(std::to_string(i)); + buffer.append(","); + } + } + + buffer.pop_back(); + + SERPR_RESPONSE("ValidGPIOs|%s", buffer.c_str()); +} + void _handleRawConfigCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength <= 0) { std::vector buffer; @@ -550,6 +585,7 @@ static std::unordered_map s_commandHa { kCommandRestart, _handleRestartCommand}, { kCommandSystemInfo, _handleDebugInfoCommand}, { kCommandSerialEcho, _handleSerialEchoCommand}, + { kCommandValidGPIOs, _handleValidGpiosCommand}, { kCommandRfTxPin, _handleRfTxPinCommand}, { kCommandAuthToken, _handleAuthtokenCommand}, { kCommandNetworks, _handleNetworksCommand}, From 4e4dabe40650648f32ab2839dedcc68ac3b05d4d Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 14 Dec 2023 14:18:15 +0100 Subject: [PATCH 052/147] [Refactoring] SerialInputHandler (#161) * Move help logic into SerialCommandHandler struct * Move SerialInputManager to serial/ directory --- include/{ => serial}/SerialInputHandler.h | 0 src/main.cpp | 2 +- src/{ => serial}/SerialInputHandler.cpp | 466 +++++++++++----------- 3 files changed, 243 insertions(+), 225 deletions(-) rename include/{ => serial}/SerialInputHandler.h (100%) rename src/{ => serial}/SerialInputHandler.cpp (84%) diff --git a/include/SerialInputHandler.h b/include/serial/SerialInputHandler.h similarity index 100% rename from include/SerialInputHandler.h rename to include/serial/SerialInputHandler.h diff --git a/src/main.cpp b/src/main.cpp index a550aad0..a5bb283e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,7 +6,7 @@ #include "event_handlers/Init.h" #include "GatewayConnectionManager.h" #include "Logging.h" -#include "SerialInputHandler.h" +#include "serial/SerialInputHandler.h" #include "VisualStateManager.h" #include "wifi/WiFiManager.h" #include "wifi/WiFiScanManager.h" diff --git a/src/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp similarity index 84% rename from src/SerialInputHandler.cpp rename to src/serial/SerialInputHandler.cpp index df759673..5674dcb7 100644 --- a/src/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -1,4 +1,4 @@ -#include "SerialInputHandler.h" +#include "serial/SerialInputHandler.h" #include "CommandHandler.h" #include "config/Config.h" @@ -28,215 +28,14 @@ using namespace OpenShock; constexpr std::int64_t PASTE_INTERVAL_THRESHOLD_MS = 20; constexpr std::size_t SERIAL_BUFFER_CLEAR_THRESHOLD = 512; -static bool s_echoEnabled = true; - -#define kCommandHelp "help" -#define kCommandVersion "version" -#define kCommandRestart "restart" -#define kCommandSystemInfo "sysinfo" -#define kCommandSerialEcho "echo" -#define kCommandValidGPIOs "validgpios" -#define kCommandRfTxPin "rftxpin" -#define kCommandAuthToken "authtoken" -#define kCommandNetworks "networks" -#define kCommandKeepAlive "keepalive" -#define kCommandRawConfig "rawconfig" -#define kCommandRFTransmit "rftransmit" -#define kCommandFactoryReset "factoryreset" - -void _handleHelpCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { - SerialInputHandler::PrintWelcomeHeader(); - // Raw string literal (1+ to remove the first newline) - Serial.print(1 + R"( -help print this menu -help print help for a command -version print version information -restart restart the board -sysinfo print debug information for various subsystems -echo get serial echo enabled -echo set serial echo enabled -validgpios list all valid GPIO pins -rftxpin get radio transmit pin -rftxpin set radio transmit pin -authtoken get auth token -authtoken set auth token -networks get all saved networks -networks set all saved networks -keepalive get shocker keep-alive enabled -keepalive set shocker keep-alive enabled -rawconfig get raw binary config -rawconfig set raw binary config -rftransmit transmit a RF command -factoryreset reset device to factory defaults and restart -)"); - return; - } - - if (strcasecmp(arg, kCommandRfTxPin) == 0) { - Serial.print(kCommandRfTxPin R"( - Get the GPIO pin used for the radio transmitter. - -rftxpin [] - Set the GPIO pin used for the radio transmitter. - Arguments: - must be a number. - Example: - rftxpin 15 -)"); - return; - } - - if (strcasecmp(arg, kCommandAuthToken) == 0) { - Serial.print(kCommandAuthToken R"( - Get the backend auth token. - -authtoken [] - Set the auth token. - Arguments: - must be a string. - Example: - authtoken mytoken -)"); - return; - } - - if (strcasecmp(arg, kCommandSystemInfo) == 0) { - Serial.print(kCommandSystemInfo R"( - Get system information from RTOS, WiFi, etc. - Example: - sysinfo -)"); - return; - } - - if (strcasecmp(arg, kCommandSerialEcho) == 0) { - Serial.print(kCommandSerialEcho R"( - Get the serial echo status. - If enabled, typed characters are echoed back to the serial port. - -echo [] - Enable/disable serial echo. - Arguments: - must be a boolean. - Example: - echo true -)"); - return; - } - - if (strcasecmp(arg, kCommandNetworks) == 0) { - Serial.print(kCommandNetworks R"( - Get all saved networks. - -networks [] - Set all saved networks. - Arguments: - must be a array of objects with the following fields: - ssid (string) SSID of the network - password (string) Password of the network - id (number) ID of the network (optional) - Example: - networks [{\"ssid\":\"myssid\",\"password\":\"mypassword\"}] -)"); - return; - } - - if (strcasecmp(arg, kCommandKeepAlive) == 0) { - Serial.print(kCommandKeepAlive R"( - Get the shocker keep-alive status. - -keepalive [] - Enable/disable shocker keep-alive. - Arguments: - must be a boolean. - Example: - keepalive true -)"); - return; - } - - if (strcasecmp(arg, kCommandRestart) == 0) { - Serial.print(kCommandRestart R"( - Restart the board - Example: - restart -)"); - return; - } - - if (strcasecmp(arg, kCommandValidGPIOs) == 0) { - Serial.print(kCommandValidGPIOs R"( - List all valid GPIO pins - Example: - validgpios -)"); - return; - } - - if (strcasecmp(arg, kCommandRawConfig) == 0) { - Serial.print(kCommandRawConfig R"( - Get the raw binary config - Example: - rawconfig - -rawconfig - Set the raw binary config, and restart - Arguments: - must be a base64 encoded string - Example: - rawconfig (base64 encoded binary data) -)"); - return; - } - - if (strcasecmp(arg, kCommandFactoryReset) == 0) { - Serial.print(kCommandFactoryReset R"( - Reset the device to factory defaults and restart - Example: - factoryreset -)"); - return; - } - - if (strcasecmp(arg, kCommandVersion) == 0) { - Serial.print(kCommandVersion R"( - Print version information - Example: - version -)"); - return; - } - - if (strcasecmp(arg, kCommandHelp) == 0) { - Serial.print(kCommandHelp R"( [] - Print help information - Arguments: - (optional) command to print help for - Example: - help -)"); - return; - } - - if (strcasecmp(arg, kCommandRFTransmit) == 0) { - Serial.print(kCommandRFTransmit R"( - Transmit a RF command - Arguments: - must be a JSON object with the following fields: - model (string) Model of the shocker ("caixianlin", "petrainer") - id (number) ID of the shocker (0-65535) - type (string) Type of the command ("shock", "vibrate", "sound", "stop") - intensity (number) Intensity of the command (0-255) - durationMs (number) Duration of the command in milliseconds (0-65535) - Example: - rftransmit {"model":"caixianlin","id":12345,"type":"vibrate","intensity":99,"durationMs":500} -)"); - return; - } +struct SerialCmdHandler { + const char* cmd; + const char* helpResponse; + void (*commandHandler)(char*, std::size_t); +}; - Serial.println("Command not found"); -} +static bool s_echoEnabled = true; +static std::unordered_map s_commandHandlers; /// @brief Tries to parse a boolean from a string (case-insensitive) /// @param str Input string @@ -579,22 +378,219 @@ void _handleRFTransmitCommand(char* arg, std::size_t argLength) { SERPR_SUCCESS("Command sent"); } -static std::unordered_map s_commandHandlers = { - { kCommandHelp, _handleHelpCommand}, - { kCommandVersion, _handleVersionCommand}, - { kCommandRestart, _handleRestartCommand}, - { kCommandSystemInfo, _handleDebugInfoCommand}, - { kCommandSerialEcho, _handleSerialEchoCommand}, - { kCommandValidGPIOs, _handleValidGpiosCommand}, - { kCommandRfTxPin, _handleRfTxPinCommand}, - { kCommandAuthToken, _handleAuthtokenCommand}, - { kCommandNetworks, _handleNetworksCommand}, - { kCommandKeepAlive, _handleKeepAliveCommand}, - { kCommandRawConfig, _handleRawConfigCommand}, - { kCommandRFTransmit, _handleRFTransmitCommand}, - {kCommandFactoryReset, _handleFactoryResetCommand}, +void _handleHelpCommand(char* arg, std::size_t argLength) { + if (arg != nullptr && argLength > 0) { + // Convert argument to lowercase + std::transform(arg, arg + argLength, arg, ::tolower); + + // Get help for a specific command + auto it = s_commandHandlers.find(std::string(arg, argLength)); + if (it != s_commandHandlers.end()) { + Serial.print(it->second.helpResponse); + return; + } + + if (argLength > 0) { + SERPR_ERROR("Command \"%.*s\" not found", argLength, arg); + } else { + SERPR_ERROR("No command"); + } + return; + } + + SerialInputHandler::PrintWelcomeHeader(); + + // Raw string literal (1+ to remove the first newline) + Serial.print(1 + R"( +help print this menu +help print help for a command +version print version information +restart restart the board +sysinfo print debug information for various subsystems +echo get serial echo enabled +echo set serial echo enabled +validgpios list all valid GPIO pins +rftxpin get radio transmit pin +rftxpin set radio transmit pin +authtoken get auth token +authtoken set auth token +networks get all saved networks +networks set all saved networks +keepalive get shocker keep-alive enabled +keepalive set shocker keep-alive enabled +rawconfig get raw binary config +rawconfig set raw binary config +rftransmit transmit a RF command +factoryreset reset device to factory defaults and restart +)"); +} + +static const SerialCmdHandler kVersionCmdHandler = { + "version", +R"(version + Print version information + Example: + version +)", + _handleVersionCommand, +}; +static const SerialCmdHandler kRestartCmdHandler = { + "restart", +R"(restart + Restart the board + Example: + restart +)", + _handleRestartCommand, +}; +static const SerialCmdHandler kSystemInfoCmdHandler = { + "sysinfo", +R"(sysinfo + Get system information from RTOS, WiFi, etc. + Example: + sysinfo +)", + _handleDebugInfoCommand, }; +static const SerialCmdHandler kSerialEchoCmdHandler = { + "echo", +R"(echo + Get the serial echo status. + If enabled, typed characters are echoed back to the serial port. +echo [] + Enable/disable serial echo. + Arguments: + must be a boolean. + Example: + echo true +)", + _handleSerialEchoCommand, +}; +static const SerialCmdHandler kValidGpiosCmdHandler = { + "validgpios", +R"(validgpios + List all valid GPIO pins + Example: + validgpios +)", + _handleValidGpiosCommand, +}; +static const SerialCmdHandler kRfTxPinCmdHandler = { + "rftxpin", +R"(rftxpin + Get the GPIO pin used for the radio transmitter. + +rftxpin [] + Set the GPIO pin used for the radio transmitter. + Arguments: + must be a number. + Example: + rftxpin 15 +)", + _handleRfTxPinCommand, +}; +static const SerialCmdHandler kAuthTokenCmdHandler = { + "authtoken", +R"(authtoken + Get the backend auth token. + +authtoken [] + Set the auth token. + Arguments: + must be a string. + Example: + authtoken mytoken +)", + _handleAuthtokenCommand, +}; +static const SerialCmdHandler kNetworksCmdHandler = { + "networks", +R"(networks + Get all saved networks. + +networks [] + Set all saved networks. + Arguments: + must be a array of objects with the following fields: + ssid (string) SSID of the network + password (string) Password of the network + id (number) ID of the network (optional) + Example: + networks [{\"ssid\":\"myssid\",\"password\":\"mypassword\"}] +)", + _handleNetworksCommand, +}; +static const SerialCmdHandler kKeepAliveCmdHandler = { + "keepalive", +R"(keepalive + Get the shocker keep-alive status. + +keepalive [] + Enable/disable shocker keep-alive. + Arguments: + must be a boolean. + Example: + keepalive true +)", + _handleKeepAliveCommand, +}; +static const SerialCmdHandler kRawConfigCmdHandler = { + "rawconfig", +R"(rawconfig + Get the raw binary config + Example: + rawconfig + +rawconfig + Set the raw binary config, and restart + Arguments: + must be a base64 encoded string + Example: + rawconfig (base64 encoded binary data) +)", + _handleRawConfigCommand, +}; +static const SerialCmdHandler kRfTransmitCmdHandler = { + "rftransmit", +R"(rftransmit + Transmit a RF command + Arguments: + must be a JSON object with the following fields: + model (string) Model of the shocker ("caixianlin", "petrainer") + id (number) ID of the shocker (0-65535) + type (string) Type of the command ("shock", "vibrate", "sound", "stop") + intensity (number) Intensity of the command (0-255) + durationMs (number) Duration of the command in milliseconds (0-65535) + Example: + rftransmit {"model":"caixianlin","id":12345,"type":"vibrate","intensity":99,"durationMs":500} +)", + _handleRFTransmitCommand, +}; +static const SerialCmdHandler kFactoryResetCmdHandler = { + "factoryreset", +R"(factoryreset + Reset the device to factory defaults and restart + Example: + factoryreset +)", + _handleFactoryResetCommand, +}; +static const SerialCmdHandler khelpCmdHandler = { + "help", +R"(help [] + Print help information + Arguments: + (optional) command to print help for + Example: + help +)", + _handleHelpCommand, +}; + +void RegisterCommandHandler(const SerialCmdHandler& handler) { + s_commandHandlers[handler.cmd] = handler; +} int findChar(const char* buffer, std::size_t bufferSize, char c) { for (int i = 0; i < bufferSize; i++) { if (buffer[i] == c) { @@ -656,7 +652,7 @@ void processSerialLine(char* data, std::size_t length) { // TODO: Clean this up, test this auto it = s_commandHandlers.find(std::string(command, commandLength)); if (it != s_commandHandlers.end()) { - it->second(arg, argLength); + it->second.commandHandler(arg, argLength); return; } @@ -668,6 +664,28 @@ void processSerialLine(char* data, std::size_t length) { } bool SerialInputHandler::Init() { + static bool s_initialized = false; + if (s_initialized) { + ESP_LOGW(TAG, "Serial input handler already initialized"); + return false; + } + s_initialized = true; + + // Register command handlers + RegisterCommandHandler(kVersionCmdHandler); + RegisterCommandHandler(kRestartCmdHandler); + RegisterCommandHandler(kSystemInfoCmdHandler); + RegisterCommandHandler(kSerialEchoCmdHandler); + RegisterCommandHandler(kValidGpiosCmdHandler); + RegisterCommandHandler(kRfTxPinCmdHandler); + RegisterCommandHandler(kAuthTokenCmdHandler); + RegisterCommandHandler(kNetworksCmdHandler); + RegisterCommandHandler(kKeepAliveCmdHandler); + RegisterCommandHandler(kRawConfigCmdHandler); + RegisterCommandHandler(kRfTransmitCmdHandler); + RegisterCommandHandler(kFactoryResetCmdHandler); + RegisterCommandHandler(khelpCmdHandler); + SerialInputHandler::PrintWelcomeHeader(); SerialInputHandler::PrintVersionInfo(); Serial.println(); From 3a7d408cbf0bff8e0cdce586c5d6653eafe0216e Mon Sep 17 00:00:00 2001 From: Luca Date: Thu, 14 Dec 2023 22:23:14 +0100 Subject: [PATCH 053/147] Update ci-tag.yml (#162) --- .github/workflows/ci-tag.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-tag.yml b/.github/workflows/ci-tag.yml index b9af4214..15b8aa09 100644 --- a/.github/workflows/ci-tag.yml +++ b/.github/workflows/ci-tag.yml @@ -3,6 +3,7 @@ on: tags: - '[0-9]+.[0-9]+.[0-9]+' - '[0-9]+.[0-9]+.[0-9]+-*' + workflow_dispatch: name: ci-tag run-name: 'ci-tag: ${{ github.ref_name }}' From 3186d62e574d24cbe1cebf7c29e822669d0ba7d1 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Thu, 14 Dec 2023 18:44:32 -0800 Subject: [PATCH 054/147] Handle connecting to open (unsecured) networks (#164) * If no password was received, assume we're saving an open network * Not an error log --- .../websocket/local/WiFiNetworkSaveCommand.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp index e166510d..53f1cba1 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp @@ -20,10 +20,10 @@ void _Private::HandleWiFiNetworkSaveCommand(std::uint8_t socketId, const OpenSho } auto ssid = msg->ssid(); - auto password = msg->password(); + auto password = msg->password() ? msg->password()->str() : ""; - if (ssid == nullptr || password == nullptr) { - ESP_LOGE(TAG, "WiFi message is missing required properties"); + if (ssid == nullptr) { + ESP_LOGE(TAG, "WiFi message is missing SSID"); return; } @@ -32,12 +32,17 @@ void _Private::HandleWiFiNetworkSaveCommand(std::uint8_t socketId, const OpenSho return; } - if (password->size() > 63) { + if (password.size() < 1) { + ESP_LOGV(TAG, "WiFi message is missing password, assuming open network"); + } else if (password.size() < 8) { + ESP_LOGE(TAG, "WiFi password is too short"); + return; + } else if (password.size() > 63) { ESP_LOGE(TAG, "WiFi password is too long"); return; } - if (!WiFiManager::Save(ssid->c_str(), password->str())) { // TODO: support hidden networks + if (!WiFiManager::Save(ssid->c_str(), password)) { ESP_LOGE(TAG, "Failed to save WiFi network"); } } From 17bdd6ef8ad776c34ed3e4ea61c88d120a5f58aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 03:46:16 +0100 Subject: [PATCH 055/147] build(deps): Bump actions/download-artifact from 3 to 4 (#163) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: HentaiHeavenVR --- .github/workflows/ci-tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-tag.yml b/.github/workflows/ci-tag.yml index 15b8aa09..f59059f7 100644 --- a/.github/workflows/ci-tag.yml +++ b/.github/workflows/ci-tag.yml @@ -191,7 +191,7 @@ jobs: RELEASE.md - name: Download release artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Release uses: ncipollo/release-action@v1 From 6db98ad6c8c2cd099b0e81913737b0d65c081323 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Fri, 15 Dec 2023 07:27:07 -0800 Subject: [PATCH 056/147] Captive Portal: DNS Server + Redirects (triggers login popup on devices) (#166) --- include/CaptivePortalInstance.h | 2 ++ src/CaptivePortalInstance.cpp | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/CaptivePortalInstance.h b/include/CaptivePortalInstance.h index 1d0e03a5..1e2b7aa9 100644 --- a/include/CaptivePortalInstance.h +++ b/include/CaptivePortalInstance.h @@ -2,6 +2,7 @@ #include "WebSocketDeFragger.h" +#include #include #include @@ -31,6 +32,7 @@ namespace OpenShock { AsyncWebServer m_webServer; WebSocketsServer m_socketServer; WebSocketDeFragger m_socketDeFragger; + DNSServer m_dnsServer; TaskHandle_t m_taskHandle; }; } // namespace OpenShock diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index a37fcfb7..07836bad 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -18,6 +18,7 @@ static const char* TAG = "CaptivePortalInstance"; constexpr std::uint16_t HTTP_PORT = 80; constexpr std::uint16_t WEBSOCKET_PORT = 81; +constexpr std::uint16_t DNS_PORT = 53; constexpr std::uint32_t WEBSOCKET_PING_INTERVAL = 10'000; constexpr std::uint32_t WEBSOCKET_PING_TIMEOUT = 1000; constexpr std::uint8_t WEBSOCKET_PING_RETRIES = 3; @@ -80,11 +81,15 @@ CaptivePortalInstance::CaptivePortalInstance() : m_webServer(HTTP_PORT) , m_socketServer(WEBSOCKET_PORT, "/ws", "json") , m_socketDeFragger(std::bind(&CaptivePortalInstance::handleWebSocketEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) + , m_dnsServer() , m_taskHandle(nullptr) { m_socketServer.onEvent(std::bind(&WebSocketDeFragger::handler, &m_socketDeFragger, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); m_socketServer.begin(); m_socketServer.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_PING_RETRIES); + ESP_LOGI(TAG, "Setting up DNS server"); + m_dnsServer.start(DNS_PORT, "*", WiFi.softAPIP()); + // Check if the www folder exists and is populated bool indexExists = LittleFS.exists("/www/index.html.gz"); @@ -97,9 +102,14 @@ CaptivePortalInstance::CaptivePortalInstance() ESP_LOGI(TAG, "Serving files from LittleFS"); ESP_LOGI(TAG, "Filesystem hash: %s", fsHash); + char softAPURL[64]; + snprintf(softAPURL, sizeof(softAPURL), "http://%s", WiFi.softAPIP().toString().c_str()); + + // Serving the captive portal files from LittleFS m_webServer.serveStatic("/", LittleFS, "/www/", "max-age=3600").setDefaultFile("index.html").setSharedEtag(fsHash); - m_webServer.onNotFound([](AsyncWebServerRequest* request) { request->send(404, "text/plain", "Not found"); }); + // Redirecting connection tests to the captive portal, triggering the "login to network" prompt + m_webServer.onNotFound([softAPURL](AsyncWebServerRequest* request) { request->redirect(softAPURL); }); } else { ESP_LOGE(TAG, "/www/index.html or hash files not found, serving error page"); @@ -135,6 +145,7 @@ CaptivePortalInstance::~CaptivePortalInstance() { } m_webServer.end(); m_socketServer.close(); + m_dnsServer.stop(); } void CaptivePortalInstance::task(void* arg) { @@ -142,6 +153,7 @@ void CaptivePortalInstance::task(void* arg) { while (true) { instance->m_socketServer.loop(); + instance->m_dnsServer.processNextRequest(); vTaskDelay(pdMS_TO_TICKS(WEBSOCKET_UPDATE_INTERVAL)); } } From a43eb2ea81179e0f60ef0519c4ffcb64b6ac1468 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Sat, 16 Dec 2023 01:15:49 +0100 Subject: [PATCH 057/147] Fix cppcheck warnings and errors (#167) --- include/Chipset.h | 32 ++-- include/RGBPatternManager.h | 2 +- include/WebSocketDeFragger.h | 146 +--------------- include/config/BackendConfig.h | 3 + include/config/RFConfig.h | 3 + include/config/WiFiConfig.h | 3 + include/event_handlers/impl/WSGateway.h | 10 +- include/event_handlers/impl/WSLocal.h | 22 +-- include/http/HTTPRequestManager.h | 4 +- include/util/Base64Utils.h | 2 +- platformio.ini | 3 + src/CommandHandler.cpp | 18 +- src/EStopManager.cpp | 2 + src/GatewayClient.cpp | 4 +- src/GatewayConnectionManager.cpp | 6 +- src/RGBPatternManager.cpp | 45 +++-- src/VisualStateManager.cpp | 6 + src/WebSocketDeFragger.cpp | 159 ++++++++++++++++++ src/config/BackendConfig.cpp | 10 +- src/config/CaptivePortalConfig.cpp | 8 +- src/config/Config.cpp | 14 +- src/config/RFConfig.cpp | 12 +- src/config/RootConfig.cpp | 2 +- src/config/SerialInputConfig.cpp | 8 +- src/config/WiFiConfig.cpp | 14 +- src/config/WiFiCredentials.cpp | 24 +-- .../websocket/local/AccountUnlinkCommand.cpp | 2 + .../websocket/local/SetRfTxPinCommand.cpp | 4 +- .../local/WiFiNetworkConnectCommand.cpp | 4 +- .../local/WiFiNetworkDisconnectCommand.cpp | 2 + .../local/WiFiNetworkForgetCommand.cpp | 2 + .../local/WiFiNetworkSaveCommand.cpp | 12 +- .../websocket/local/WiFiScanCommand.cpp | 2 + .../websocket/local/_InvalidMessage.cpp | 2 + src/http/HTTPRequestManager.cpp | 8 +- src/radio/RFTransmitter.cpp | 17 +- src/radio/rmt/CaiXianlinEncoder.cpp | 6 +- src/radio/rmt/PetrainerEncoder.cpp | 4 +- src/serial/SerialInputHandler.cpp | 98 +++++++---- src/serialization/JsonAPI.cpp | 34 ++-- src/serialization/JsonSerial.cpp | 12 +- src/util/Base64Utils.cpp | 13 +- src/util/CertificateUtils.cpp | 2 +- src/wifi/WiFiManager.cpp | 13 +- src/wifi/WiFiNetwork.cpp | 6 +- src/wifi/WiFiScanManager.cpp | 8 + 46 files changed, 471 insertions(+), 342 deletions(-) create mode 100644 src/WebSocketDeFragger.cpp diff --git a/include/Chipset.h b/include/Chipset.h index 6af1fb0c..65cac88a 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -18,7 +18,7 @@ #define OPENSHOCK_FW_CHIP_NAME "ESP8266EX" // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_0 || pin == GPIO_NUM_1 || pin == GPIO_NUM_2 || pin == GPIO_NUM_3 || pin == GPIO_NUM_15) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_15) #endif // ESP8285 @@ -30,7 +30,7 @@ #define OPENSHOCK_FW_CHIP_NAME "ESP8285" // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_0 || pin == GPIO_NUM_1 || pin == GPIO_NUM_2 || pin == GPIO_NUM_3 || pin == GPIO_NUM_15) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_15) #endif // ESP8684 @@ -43,7 +43,7 @@ #define OPENSHOCK_FW_CHIP_NAME "ESP8684" // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO8, GPIO9 are strapping pins used to control the boot mode adn ROM code printing -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_1 || pin == GPIO_NUM_3 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_8 || (pin) == GPIO_NUM_9) #endif // ESP8685 @@ -55,7 +55,7 @@ #define OPENSHOCK_FW_CHIP_NAME "ESP8685" // GPIO20, GPIO21 is used for UART0 RXD/TXD. // GPIO2, GPIO8, GPIO9 are strapping pins. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_2 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9 || pin == GPIO_NUM_20 || pin == GPIO_NUM_21) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_8 || (pin) == GPIO_NUM_9 || (pin) == GPIO_NUM_20 || (pin) == GPIO_NUM_21) #endif // ESP32 @@ -74,8 +74,8 @@ // See: ESP32 Series Datasheet Version 4.3 Section 2.2 Pin Overview // See: ESP32 Series Datasheet Version 4.3 Section 2.4 Strapping Pins #define CHIP_UNSAFE_GPIO(pin) \ - (pin == GPIO_NUM_1 || pin == GPIO_NUM_3 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_5 || pin == GPIO_NUM_15 || pin == GPIO_NUM_6 || pin == GPIO_NUM_7 || pin == GPIO_NUM_8 || pin == GPIO_NUM_9 || pin == GPIO_NUM_11 || pin == GPIO_NUM_16 \ - || pin == GPIO_NUM_17) + ((pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_5 || (pin) == GPIO_NUM_15 || (pin) == GPIO_NUM_6 || (pin) == GPIO_NUM_7 || (pin) == GPIO_NUM_8 || (pin) == GPIO_NUM_9 || (pin) == GPIO_NUM_11 || (pin) == GPIO_NUM_16 \ + || (pin) == GPIO_NUM_17) #endif // ESP32-PICO-D4 @@ -88,7 +88,7 @@ // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO25, GPIO27, GPIO29, GPIO30, GPIO31, GPIO32, GPIO33 is used for SPI flash connection. (DO NOT TOUCH) // GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_3 || pin == GPIO_NUM_1 || pin == GPIO_NUM_25 || pin == GPIO_NUM_27 || pin == GPIO_NUM_29 || pin == GPIO_NUM_30 || pin == GPIO_NUM_31 || pin == GPIO_NUM_32 || pin == GPIO_NUM_33 || pin == GPIO_NUM_12 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_15 || pin == GPIO_NUM_5) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_25 || (pin) == GPIO_NUM_27 || (pin) == GPIO_NUM_29 || (pin) == GPIO_NUM_30 || (pin) == GPIO_NUM_31 || (pin) == GPIO_NUM_32 || (pin) == GPIO_NUM_33 || (pin) == GPIO_NUM_12 || (pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_15 || (pin) == GPIO_NUM_5) #endif // ESP32-PICO-V3 @@ -101,7 +101,7 @@ // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO6, GPIO11, GPIO9, GPIO10 is used for SPI flash connection. (DO NOT TOUCH) // GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_3 || pin == GPIO_NUM_1 || pin == GPIO_NUM_6 || pin == GPIO_NUM_11 || pin == GPIO_NUM_9 || pin == GPIO_NUM_10 || pin == GPIO_NUM_12 || pin == GPIO_NUM_0 || pin == GPIO_NUM_2 || pin == GPIO_NUM_15 || pin == GPIO_NUM_5) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_6 || (pin) == GPIO_NUM_11 || (pin) == GPIO_NUM_9 || (pin) == GPIO_NUM_10 || (pin) == GPIO_NUM_12 || (pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_15 || (pin) == GPIO_NUM_5) #endif // ESP32-S2 @@ -114,7 +114,7 @@ // GPIO44, GPIO43 is used for UART0 RXD/TXD. // GPIO29, GPIO26, GPIO32, GPIO31, GPIO30, GPIO28, GPIO27 is used for SPI flash connection. (DO NOT TOUCH) // GPIO0, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_30 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_0 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_44 || (pin) == GPIO_NUM_43 || (pin) == GPIO_NUM_29 || (pin) == GPIO_NUM_26 || (pin) == GPIO_NUM_32 || (pin) == GPIO_NUM_31 || (pin) == GPIO_NUM_30 || (pin) == GPIO_NUM_28 || (pin) == GPIO_NUM_27 || (pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_45 || (pin) == GPIO_NUM_46) #endif // ESP32-S3 @@ -128,7 +128,7 @@ // GPIO19, GPIO20 is used for USB serial, flashing, and debugging. // GPIO30, GPIO29, GPIO26, GPIO32, GPIO31, GPIO28, GPIO27, GPIO33, GPIO34, GPIO35, GPIO36, GPIO37 is used for SPI flash connection. (DO NOT TOUCH) // GPIO0, GPIO3, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. -#define CHIP_UNSAFE_GPIO(pin) (pin == GPIO_NUM_44 || pin == GPIO_NUM_43 || pin == GPIO_NUM_19 || pin == GPIO_NUM_20 || pin == GPIO_NUM_30 || pin == GPIO_NUM_29 || pin == GPIO_NUM_26 || pin == GPIO_NUM_32 || pin == GPIO_NUM_31 || pin == GPIO_NUM_28 || pin == GPIO_NUM_27 || pin == GPIO_NUM_33 || pin == GPIO_NUM_34 || pin == GPIO_NUM_35 || pin == GPIO_NUM_36 || pin == GPIO_NUM_37 || pin == GPIO_NUM_0 || pin == GPIO_NUM_3 || pin == GPIO_NUM_45 || pin == GPIO_NUM_46) +#define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_44 || (pin) == GPIO_NUM_43 || (pin) == GPIO_NUM_19 || (pin) == GPIO_NUM_20 || (pin) == GPIO_NUM_30 || (pin) == GPIO_NUM_29 || (pin) == GPIO_NUM_26 || (pin) == GPIO_NUM_32 || (pin) == GPIO_NUM_31 || (pin) == GPIO_NUM_28 || (pin) == GPIO_NUM_27 || (pin) == GPIO_NUM_33 || (pin) == GPIO_NUM_34 || (pin) == GPIO_NUM_35 || (pin) == GPIO_NUM_36 || (pin) == GPIO_NUM_37 || (pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_45 || (pin) == GPIO_NUM_46) #endif // ESP32-S3-PICO-1 @@ -172,22 +172,22 @@ #pragma region Board Specific Bypasses #ifdef OPENSHOCK_FW_BOARD_WEMOSD1MINIESP32 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 2) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15 || (pin) == 2) #endif #ifdef OPENSHOCK_FW_BOARD_WEMOSLOLINS2MINI -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15) #endif #ifdef OPENSHOCK_FW_BOARD_PISHOCK2023 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 12 || pin == 2) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 12 || (pin) == 2) #endif #ifdef OPENSHOCK_FW_BOARD_PISHOCKLITE2021 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 2) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15 || (pin) == 2) #endif #ifdef OPENSHOCK_FW_BOARD_SEEEDXIAOESP32S3 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 21) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 21) #endif #ifdef OPENSHOCK_FW_BOARD_OPENSHOCKCOREV1 -#define OPENSHOCK_BYPASSED_GPIO(pin) (pin == 15 || pin == 35) +#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15 || (pin) == 35) #endif #ifndef OPENSHOCK_BYPASSED_GPIO #define OPENSHOCK_BYPASSED_GPIO(pin) (false) diff --git a/include/RGBPatternManager.h b/include/RGBPatternManager.h index d4513739..5b2ad00e 100644 --- a/include/RGBPatternManager.h +++ b/include/RGBPatternManager.h @@ -29,7 +29,7 @@ namespace OpenShock { private: void ClearPatternInternal(); - void SendRGB(const RGBState state); + void SendRGB(const RGBState& state); static void RunPattern(void* arg); std::uint8_t m_rgbPin; diff --git a/include/WebSocketDeFragger.h b/include/WebSocketDeFragger.h index 8de56268..025ea98c 100644 --- a/include/WebSocketDeFragger.h +++ b/include/WebSocketDeFragger.h @@ -14,148 +14,20 @@ namespace OpenShock { typedef std::function EventCallback; - WebSocketDeFragger(EventCallback callback) : m_messages(), m_callback(callback) {} + WebSocketDeFragger(EventCallback callback); WebSocketDeFragger(const WebSocketDeFragger&) = delete; - ~WebSocketDeFragger() { - clear(); - } + ~WebSocketDeFragger(); - void handler(std::uint8_t socketId, WStype_t type, const std::uint8_t* payload, std::size_t length) { - switch (type) { - case WStype_FRAGMENT_BIN_START: - start(socketId, WebSocketMessageType::Binary, payload, length); - return; - case WStype_FRAGMENT_TEXT_START: - start(socketId, WebSocketMessageType::Text, payload, length); - return; - case WStype_FRAGMENT: - append(socketId, payload, length); - return; - case WStype_FRAGMENT_FIN: - finish(socketId, payload, length); - return; - [[likely]] default: - clear(socketId); - break; - } - - WebSocketMessageType messageType; - switch (type) { - [[unlikely]] case WStype_ERROR: - messageType = WebSocketMessageType::Error; - break; - case WStype_DISCONNECTED: - messageType = WebSocketMessageType::Disconnected; - break; - case WStype_CONNECTED: - messageType = WebSocketMessageType::Connected; - break; - case WStype_TEXT: - messageType = WebSocketMessageType::Text; - break; - [[likely]] case WStype_BIN: - messageType = WebSocketMessageType::Binary; - break; - case WStype_PING: - messageType = WebSocketMessageType::Ping; - break; - case WStype_PONG: - messageType = WebSocketMessageType::Pong; - break; - [[unlikely]] default: - const char* const errorMessage = "Unknown WebSocket event type"; - m_callback(socketId, WebSocketMessageType::Error, reinterpret_cast(errorMessage), strlen(errorMessage)); - return; - } - - m_callback(socketId, messageType, payload, length); - } - - void onEvent(const EventCallback& callback) { - m_callback = callback; - } - void clear(std::uint8_t socketId) { - auto it = m_messages.find(socketId); - if (it != m_messages.end()) { - free(it->second.data); - m_messages.erase(it); - } - } - void clear() { - for (auto it = m_messages.begin(); it != m_messages.end(); ++it) { - free(it->second.data); - } - m_messages.clear(); - } + void handler(std::uint8_t socketId, WStype_t type, const std::uint8_t* payload, std::size_t length); + void onEvent(const EventCallback& callback); + void clear(std::uint8_t socketId); + void clear(); WebSocketDeFragger& operator=(const WebSocketDeFragger&) = delete; private: - void start(std::uint8_t socketId, WebSocketMessageType type, const std::uint8_t* data, std::uint32_t length) { - auto it = m_messages.find(socketId); - if (it != m_messages.end()) { - auto& message = it->second; - - if (message.capacity < length) { - message.data = reinterpret_cast(realloc(message.data, length)); - message.capacity = length; - } - - memcpy(message.data, data, length); - message.size = length; - - return; - } - - Message message { - .data = reinterpret_cast(malloc(length)), - .size = length, - .capacity = length, - .type = type - }; - - memcpy(message.data, data, length); - - m_messages.insert(std::make_pair(socketId, message)); - } - void append(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length) { - auto it = m_messages.find(socketId); - if (it == m_messages.end()) { - return; - } - - auto& message = it->second; - - std::uint32_t newLength = message.size + length; - if (message.capacity < newLength) { - message.data = reinterpret_cast(realloc(message.data, newLength)); - message.capacity = newLength; - } - - memcpy(message.data + message.size, data, length); - message.size = newLength; - } - void finish(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length) { - auto it = m_messages.find(socketId); - if (it == m_messages.end()) { - return; - } - - auto& message = it->second; - - std::uint32_t newLength = message.size + length; - if (message.capacity < newLength) { - message.data = reinterpret_cast(realloc(message.data, newLength)); - message.capacity = newLength; - } - - memcpy(message.data + message.size, data, length); - message.size = newLength; - - m_callback(socketId, message.type, message.data, message.size); - - free(message.data); - m_messages.erase(it); - } + void start(std::uint8_t socketId, WebSocketMessageType type, const std::uint8_t* data, std::uint32_t length); + void append(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length); + void finish(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length); struct Message { std::uint8_t* data; diff --git a/include/config/BackendConfig.h b/include/config/BackendConfig.h index befc00a6..a46586f9 100644 --- a/include/config/BackendConfig.h +++ b/include/config/BackendConfig.h @@ -6,6 +6,9 @@ namespace OpenShock::Config { struct BackendConfig : public ConfigBase { + BackendConfig(); + BackendConfig(const std::string& domain, const std::string& authToken); + std::string domain; std::string authToken; diff --git a/include/config/RFConfig.h b/include/config/RFConfig.h index 85083078..932b4051 100644 --- a/include/config/RFConfig.h +++ b/include/config/RFConfig.h @@ -4,6 +4,9 @@ namespace OpenShock::Config { struct RFConfig : public ConfigBase { + RFConfig(); + RFConfig(std::uint8_t txPin, bool keepAliveEnabled); + std::uint8_t txPin; bool keepAliveEnabled; diff --git a/include/config/WiFiConfig.h b/include/config/WiFiConfig.h index 46f7add7..db626c88 100644 --- a/include/config/WiFiConfig.h +++ b/include/config/WiFiConfig.h @@ -8,6 +8,9 @@ namespace OpenShock::Config { struct WiFiConfig : public ConfigBase { + WiFiConfig(); + WiFiConfig(const std::string& accessPointSSID, const std::string& hostname, const std::vector& credentialsList); + std::string accessPointSSID; std::string hostname; std::vector credentialsList; diff --git a/include/event_handlers/impl/WSGateway.h b/include/event_handlers/impl/WSGateway.h index 23009c55..9f54a8b0 100644 --- a/include/event_handlers/impl/WSGateway.h +++ b/include/event_handlers/impl/WSGateway.h @@ -4,11 +4,11 @@ #include -#define _HANDLER_SIGNATURE(NAME) void NAME(const OpenShock::Serialization::ServerToDeviceMessage* msg) +#define WS_EVENT_HANDLER_SIGNATURE(NAME) void NAME(const OpenShock::Serialization::ServerToDeviceMessage* msg) namespace OpenShock::MessageHandlers::Server::_Private { - typedef _HANDLER_SIGNATURE((*HandlerType)); - _HANDLER_SIGNATURE(HandleInvalidMessage); - _HANDLER_SIGNATURE(HandleShockerCommandList); - _HANDLER_SIGNATURE(HandleCaptivePortalConfig); + typedef WS_EVENT_HANDLER_SIGNATURE((*HandlerType)); + WS_EVENT_HANDLER_SIGNATURE(HandleInvalidMessage); + WS_EVENT_HANDLER_SIGNATURE(HandleShockerCommandList); + WS_EVENT_HANDLER_SIGNATURE(HandleCaptivePortalConfig); } // namespace OpenShock::MessageHandlers::Server::_Private diff --git a/include/event_handlers/impl/WSLocal.h b/include/event_handlers/impl/WSLocal.h index 5e1ddcdc..cf68ed59 100644 --- a/include/event_handlers/impl/WSLocal.h +++ b/include/event_handlers/impl/WSLocal.h @@ -5,17 +5,17 @@ #include -#define _HANDLER_SIGNATURE(NAME) void NAME(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* msg) +#define WS_EVENT_HANDLER_SIGNATURE(NAME) void NAME(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* msg) namespace OpenShock::MessageHandlers::Local::_Private { - typedef _HANDLER_SIGNATURE((*HandlerType)); - _HANDLER_SIGNATURE(HandleInvalidMessage); - _HANDLER_SIGNATURE(HandleWiFiScanCommand); - _HANDLER_SIGNATURE(HandleWiFiNetworkSaveCommand); - _HANDLER_SIGNATURE(HandleWiFiNetworkForgetCommand); - _HANDLER_SIGNATURE(HandleWiFiNetworkConnectCommand); - _HANDLER_SIGNATURE(HandleWiFiNetworkDisconnectCommand); - _HANDLER_SIGNATURE(HandleAccountLinkCommand); - _HANDLER_SIGNATURE(HandleAccountUnlinkCommand); - _HANDLER_SIGNATURE(HandleSetRfTxPinCommand); + typedef WS_EVENT_HANDLER_SIGNATURE((*HandlerType)); + WS_EVENT_HANDLER_SIGNATURE(HandleInvalidMessage); + WS_EVENT_HANDLER_SIGNATURE(HandleWiFiScanCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleWiFiNetworkSaveCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleWiFiNetworkForgetCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleWiFiNetworkConnectCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleWiFiNetworkDisconnectCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleAccountLinkCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleAccountUnlinkCommand); + WS_EVENT_HANDLER_SIGNATURE(HandleSetRfTxPinCommand); } // namespace OpenShock::MessageHandlers::Local::_Private diff --git a/include/http/HTTPRequestManager.h b/include/http/HTTPRequestManager.h index 820efd34..90fe9380 100644 --- a/include/http/HTTPRequestManager.h +++ b/include/http/HTTPRequestManager.h @@ -28,10 +28,10 @@ namespace OpenShock::HTTP { template using JsonParser = std::function; - Response GetString(const char* const url, const std::map& headers, std::vector acceptedCodes = {200}); + Response GetString(const char* const url, const std::map& headers, const std::vector& acceptedCodes = {200}); template - Response GetJSON(const char* const url, const std::map& headers, JsonParser jsonParser, std::vector acceptedCodes = {200}) { + Response GetJSON(const char* const url, const std::map& headers, JsonParser jsonParser, const std::vector& acceptedCodes = {200}) { auto response = GetString(url, headers, acceptedCodes); if (response.result != RequestResult::Success) { return {response.result, response.code, {}}; diff --git a/include/util/Base64Utils.h b/include/util/Base64Utils.h index 0df03662..cc0706c0 100644 --- a/include/util/Base64Utils.h +++ b/include/util/Base64Utils.h @@ -33,7 +33,7 @@ namespace OpenShock::Base64Utils { /// @param dataLen The size of the data to encode. /// @param output The output string to write to. /// @return The amount of bytes written to the output buffer. - bool Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output) noexcept; + bool Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output); /// @brief Decodes a base64 string. /// @param data The data to decode. diff --git a/platformio.ini b/platformio.ini index d47df2ea..1e343feb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -37,6 +37,9 @@ monitor_filters = esp32_exception_decoder ; Static code analysis check_tool = cppcheck +check_skip_packages = true +check_flags = + cppcheck: --std=c++20 -j 8 --suppress=*:*/.pio/* --suppress=*:*/include/serialization/_fbs/* [env:fs] custom_openshock.chip = ESP32 diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index 4dfa3238..ee867915 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -32,10 +32,10 @@ std::uint32_t calculateEepyTime(std::int64_t timeToKeepAlive) { } struct KnownShocker { + bool killTask; ShockerModelType model; std::uint16_t shockerId; std::int64_t lastActivityTimestamp; - bool killTask; }; static SemaphoreHandle_t s_rfTransmitterMutex = nullptr; @@ -46,6 +46,8 @@ static QueueHandle_t s_keepAliveQueue = nullptr; static TaskHandle_t s_keepAliveTaskHandle = nullptr; void _keepAliveTask(void* arg) { + (void)arg; + std::int64_t timeToKeepAlive = KEEP_ALIVE_INTERVAL; // Map of shocker IDs to time of next keep-alive @@ -76,24 +78,24 @@ void _keepAliveTask(void* arg) { // For every entry that has a keep-alive time less than now, send a keep-alive for (auto it = activityMap.begin(); it != activityMap.end(); ++it) { - auto& cmd = it->second; + auto& cmdRef = it->second; - if (cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL < now) { - ESP_LOGV(TAG, "Sending keep-alive for shocker %u", cmd.shockerId); + if (cmdRef.lastActivityTimestamp + KEEP_ALIVE_INTERVAL < now) { + ESP_LOGV(TAG, "Sending keep-alive for shocker %u", cmdRef.shockerId); if (s_rfTransmitter == nullptr) { ESP_LOGW(TAG, "RF Transmitter is not initialized, ignoring keep-alive"); break; } - if (!s_rfTransmitter->SendCommand(cmd.model, cmd.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) { - ESP_LOGW(TAG, "Failed to send keep-alive for shocker %u", cmd.shockerId); + if (!s_rfTransmitter->SendCommand(cmdRef.model, cmdRef.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) { + ESP_LOGW(TAG, "Failed to send keep-alive for shocker %u", cmdRef.shockerId); } - cmd.lastActivityTimestamp = now; + cmdRef.lastActivityTimestamp = now; } - timeToKeepAlive = std::min(timeToKeepAlive, cmd.lastActivityTimestamp + KEEP_ALIVE_INTERVAL); + timeToKeepAlive = std::min(timeToKeepAlive, cmdRef.lastActivityTimestamp + KEEP_ALIVE_INTERVAL); } } } diff --git a/src/EStopManager.cpp b/src/EStopManager.cpp index 43ea87c1..24a80a39 100644 --- a/src/EStopManager.cpp +++ b/src/EStopManager.cpp @@ -86,6 +86,8 @@ void EStopManager::Init(std::uint16_t updateIntervalMs) { } #else + (void)updateIntervalMs; + ESP_LOGI(TAG, "EStopManager disabled, no pin defined"); #endif } diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index 0392a27a..eedfa9fe 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -87,7 +87,7 @@ void GatewayClient::_sendKeepAlive() { ESP_LOGV(TAG, "Sending Gateway keep-alive message"); // Casting to uint64 here is safe since millis is guaranteed to return a positive value - OpenShock::Serialization::KeepAlive keepAlive((std::uint64_t)OpenShock::millis()); + OpenShock::Serialization::KeepAlive keepAlive(static_cast(OpenShock::millis())); flatbuffers::FlatBufferBuilder builder(64); @@ -101,6 +101,8 @@ void GatewayClient::_sendKeepAlive() { } void GatewayClient::_handleEvent(WStype_t type, std::uint8_t* payload, std::size_t length) { + (void)payload; + switch (type) { case WStype_DISCONNECTED: ESP_LOGI(TAG, "Disconnected from API"); diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 51d004ed..e033c278 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -35,11 +35,15 @@ static std::uint8_t s_flags = 0; static std::unique_ptr s_wsClient = nullptr; void _evGotIPHandler(arduino_event_t* event) { + (void)event; + s_flags |= FLAG_HAS_IP; ESP_LOGD(TAG, "Got IP address"); } void _evWiFiDisconnectedHandler(arduino_event_t* event) { + (void)event; + s_flags = FLAG_NONE; s_wsClient = nullptr; ESP_LOGD(TAG, "Lost IP address"); @@ -93,7 +97,7 @@ AccountLinkResultCode GatewayConnectionManager::Pair(const char* pairCode) { return AccountLinkResultCode::InternalError; } - std::string& authToken = response.data.authToken; + const std::string& authToken = response.data.authToken; if (authToken.empty()) { ESP_LOGE(TAG, "Received empty auth token"); diff --git a/src/RGBPatternManager.cpp b/src/RGBPatternManager.cpp index b1b94338..071c6cc8 100644 --- a/src/RGBPatternManager.cpp +++ b/src/RGBPatternManager.cpp @@ -14,11 +14,12 @@ using namespace OpenShock; // TODO: Support other LED types ? RGBPatternManager::RGBPatternManager(std::uint8_t rgbPin) : m_rgbPin(rgbPin), m_rgbBrightness(255), m_pattern(nullptr), m_patternLength(0), m_taskHandle(nullptr), m_taskMutex(xSemaphoreCreateMutex()) { - if ((m_rmtHandle = rmtInit(m_rgbPin, RMT_TX_MODE, RMT_MEM_64)) == NULL) { + m_rmtHandle = rmtInit(m_rgbPin, RMT_TX_MODE, RMT_MEM_64); + if (m_rmtHandle == NULL) { ESP_LOGE(TAG, "[pin-%u] Failed to create rgb rmt object", m_rgbPin); } - float realTick = rmtSetTick(m_rmtHandle, 100); + float realTick = rmtSetTick(m_rmtHandle, 100.F); ESP_LOGD(TAG, "[pin-%u] real tick set to: %fns", m_rgbPin, realTick); SetBrightness(20); @@ -81,38 +82,36 @@ void RGBPatternManager::SetBrightness(std::uint8_t brightness) { m_rgbBrightness = brightness; } -void RGBPatternManager::SendRGB(const RGBState state) { +void RGBPatternManager::SendRGB(const RGBState& state) { const std::uint16_t bitCount = (8 * 3) * (1); // 8 bits per color * 3 colors * 1 LED rmt_data_t led_data[bitCount]; - std::uint8_t r = (std::uint8_t)((std::uint16_t)state.red * m_rgbBrightness / 255); - std::uint8_t g = (std::uint8_t)((std::uint16_t)state.green * m_rgbBrightness / 255); - std::uint8_t b = (std::uint8_t)((std::uint16_t)state.blue * m_rgbBrightness / 255); + std::uint8_t r = static_cast(static_cast(state.red) * m_rgbBrightness / 255); + std::uint8_t g = static_cast(static_cast(state.green) * m_rgbBrightness / 255); + std::uint8_t b = static_cast(static_cast(state.blue) * m_rgbBrightness / 255); - std::uint8_t led, col, bit; std::uint8_t i = 0; // WS2812B takes commands in GRB order // https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf - Page 5 - std::uint8_t colors[3] = {g, r, b}; - for (led = 0; led < 1; led++) { - for (col = 0; col < 3; col++) { - for (bit = 0; bit < 8; bit++) { - if ((colors[col] & (1 << (7 - bit)))) { - led_data[i].level0 = 1; - led_data[i].duration0 = 8; - led_data[i].level1 = 0; - led_data[i].duration1 = 4; - } else { - led_data[i].level0 = 1; - led_data[i].duration0 = 4; - led_data[i].level1 = 0; - led_data[i].duration1 = 8; - } - i++; + const std::uint8_t colors[3] = {g, r, b}; + for (std::uint8_t col = 0; col < 3; col++) { + for (std::uint8_t bit = 0; bit < 8; bit++) { + if ((colors[col] & (1 << (7 - bit)))) { + led_data[i].level0 = 1; + led_data[i].duration0 = 8; + led_data[i].level1 = 0; + led_data[i].duration1 = 4; + } else { + led_data[i].level0 = 1; + led_data[i].duration0 = 4; + led_data[i].level1 = 0; + led_data[i].duration1 = 8; } + i++; } } + // Send the data rmtWriteBlocking(m_rmtHandle, led_data, bitCount); } diff --git a/src/VisualStateManager.cpp b/src/VisualStateManager.cpp index c4a70539..a308f70f 100644 --- a/src/VisualStateManager.cpp +++ b/src/VisualStateManager.cpp @@ -281,6 +281,8 @@ void _updateVisualState() { } void _handleWiFiConnected(arduino_event_t* event) { + (void)event; + std::uint64_t oldState = s_stateFlags; s_stateFlags |= kWiFiConnectedFlag; @@ -290,6 +292,8 @@ void _handleWiFiConnected(arduino_event_t* event) { } } void _handleWiFiDisconnected(arduino_event_t* event) { + (void)event; + std::uint64_t oldState = s_stateFlags; s_stateFlags &= ~kWiFiConnectedFlag; @@ -299,6 +303,8 @@ void _handleWiFiDisconnected(arduino_event_t* event) { } } void _handleWiFiScanDone(arduino_event_t* event) { + (void)event; + std::uint64_t oldState = s_stateFlags; s_stateFlags &= ~kWiFiScanningFlag; diff --git a/src/WebSocketDeFragger.cpp b/src/WebSocketDeFragger.cpp new file mode 100644 index 00000000..adb8a1b1 --- /dev/null +++ b/src/WebSocketDeFragger.cpp @@ -0,0 +1,159 @@ +#include "WebSocketDeFragger.h" + +#include "Logging.h" + +#include + +const char* const TAG = "WebSocketDeFragger"; + +using namespace OpenShock; + +std::uint8_t* _reallocOrFree(std::uint8_t* ptr, std::size_t size) { + void* newPtr = realloc(ptr, size); + if (newPtr == nullptr) { + free(ptr); + ESP_PANIC(TAG, "Failed to allocate memory"); + } + + return reinterpret_cast(newPtr); +} + +WebSocketDeFragger::WebSocketDeFragger(EventCallback callback) : m_messages(), m_callback(callback) { } + +WebSocketDeFragger::~WebSocketDeFragger() { + clear(); +} + +void WebSocketDeFragger::handler(std::uint8_t socketId, WStype_t type, const std::uint8_t* payload, std::size_t length) { + switch (type) { + case WStype_FRAGMENT_BIN_START: + start(socketId, WebSocketMessageType::Binary, payload, length); + return; + case WStype_FRAGMENT_TEXT_START: + start(socketId, WebSocketMessageType::Text, payload, length); + return; + case WStype_FRAGMENT: + append(socketId, payload, length); + return; + case WStype_FRAGMENT_FIN: + finish(socketId, payload, length); + return; + [[likely]] default: + clear(socketId); + break; + } + + WebSocketMessageType messageType; + switch (type) { + [[unlikely]] case WStype_ERROR: + messageType = WebSocketMessageType::Error; + break; + case WStype_DISCONNECTED: + messageType = WebSocketMessageType::Disconnected; + break; + case WStype_CONNECTED: + messageType = WebSocketMessageType::Connected; + break; + case WStype_TEXT: + messageType = WebSocketMessageType::Text; + break; + [[likely]] case WStype_BIN: + messageType = WebSocketMessageType::Binary; + break; + case WStype_PING: + messageType = WebSocketMessageType::Ping; + break; + case WStype_PONG: + messageType = WebSocketMessageType::Pong; + break; + [[unlikely]] default: + const char* const errorMessage = "Unknown WebSocket event type"; + m_callback(socketId, WebSocketMessageType::Error, reinterpret_cast(errorMessage), strlen(errorMessage)); + return; + } + + m_callback(socketId, messageType, payload, length); +} + +void WebSocketDeFragger::onEvent(const EventCallback& callback) { + m_callback = callback; +} + +void WebSocketDeFragger::clear(std::uint8_t socketId) { + auto it = m_messages.find(socketId); + if (it != m_messages.end()) { + free(it->second.data); + m_messages.erase(it); + } +} + +void WebSocketDeFragger::clear() { + for (auto it = m_messages.begin(); it != m_messages.end(); ++it) { + free(it->second.data); + } + m_messages.clear(); +} + +void WebSocketDeFragger::start(std::uint8_t socketId, WebSocketMessageType type, const std::uint8_t* data, std::uint32_t length) { + auto it = m_messages.find(socketId); + if (it != m_messages.end()) { + auto& message = it->second; + + if (message.capacity < length) { + message.data = _reallocOrFree(message.data, length); + message.capacity = length; + } + + memcpy(message.data, data, length); + message.size = length; + + return; + } + + Message message {.data = reinterpret_cast(malloc(length)), .size = length, .capacity = length, .type = type}; + + memcpy(message.data, data, length); + + m_messages.insert(std::make_pair(socketId, message)); +} + +void WebSocketDeFragger::append(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length) { + auto it = m_messages.find(socketId); + if (it == m_messages.end()) { + return; + } + + auto& message = it->second; + + std::uint32_t newLength = message.size + length; + if (message.capacity < newLength) { + message.data = _reallocOrFree(message.data, newLength); + message.capacity = newLength; + } + + memcpy(message.data + message.size, data, length); + message.size = newLength; +} + +void WebSocketDeFragger::finish(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length) { + auto it = m_messages.find(socketId); + if (it == m_messages.end()) { + return; + } + + auto& message = it->second; + + std::uint32_t newLength = message.size + length; + if (message.capacity < newLength) { + message.data = _reallocOrFree(message.data, newLength); + message.capacity = newLength; + } + + memcpy(message.data + message.size, data, length); + message.size = newLength; + + m_callback(socketId, message.type, message.data, message.size); + + free(message.data); + m_messages.erase(it); +} diff --git a/src/config/BackendConfig.cpp b/src/config/BackendConfig.cpp index 061028fb..90289305 100644 --- a/src/config/BackendConfig.cpp +++ b/src/config/BackendConfig.cpp @@ -7,9 +7,11 @@ const char* const TAG = "Config::BackendConfig"; using namespace OpenShock::Config; +BackendConfig::BackendConfig() : domain(OPENSHOCK_API_DOMAIN), authToken() {} + void BackendConfig::ToDefault() { domain = OPENSHOCK_API_DOMAIN; - authToken = ""; + authToken.clear(); } bool BackendConfig::FromFlatbuffers(const Serialization::Configuration::BackendConfig* config) { @@ -34,7 +36,7 @@ bool BackendConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } @@ -45,7 +47,7 @@ bool BackendConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(domainJson)) { + if (cJSON_IsString(domainJson) == 0) { ESP_LOGE(TAG, "domain is not a string"); return false; } @@ -58,7 +60,7 @@ bool BackendConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(authTokenJson)) { + if (cJSON_IsString(authTokenJson) == 0) { ESP_LOGE(TAG, "authToken is not a string"); return false; } diff --git a/src/config/CaptivePortalConfig.cpp b/src/config/CaptivePortalConfig.cpp index db3f5746..ecef6883 100644 --- a/src/config/CaptivePortalConfig.cpp +++ b/src/config/CaptivePortalConfig.cpp @@ -6,9 +6,7 @@ const char* const TAG = "Config::CaptivePortalConfig"; using namespace OpenShock::Config; -CaptivePortalConfig::CaptivePortalConfig() { - ToDefault(); -} +CaptivePortalConfig::CaptivePortalConfig() : alwaysEnabled(false) {} CaptivePortalConfig::CaptivePortalConfig(bool alwaysEnabled) { this->alwaysEnabled = alwaysEnabled; @@ -39,7 +37,7 @@ bool CaptivePortalConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } @@ -50,7 +48,7 @@ bool CaptivePortalConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsBool(alwaysEnabledJson)) { + if (cJSON_IsBool(alwaysEnabledJson) == 0) { ESP_LOGE(TAG, "alwaysEnabled is not a bool"); return false; } diff --git a/src/config/Config.cpp b/src/config/Config.cpp index 4e2b88e4..85cd680f 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -293,7 +293,7 @@ bool Config::SetWiFiConfig(const Config::WiFiConfig& config) { } bool Config::SetWiFiCredentials(const std::vector& credentials) { - for (auto& cred : credentials) { + for (const auto& cred : credentials) { if (cred.id == 0) { ESP_LOGE(TAG, "Cannot set WiFi credentials: credential ID cannot be 0"); return false; @@ -408,7 +408,7 @@ std::uint8_t Config::AddWiFiCredentials(const std::string& ssid, const std::stri ScopedWriteLock lock(&_configMutex); if (!lock.isLocked()) { ESP_LOGE(TAG, "Failed to acquire write lock"); - return false; + return 0; } std::uint8_t id = 0; @@ -465,7 +465,7 @@ bool Config::TryGetWiFiCredentialsByID(std::uint8_t id, Config::WiFiCredentials& return false; } - for (auto& creds : _configData.wifi.credentialsList) { + for (const auto& creds : _configData.wifi.credentialsList) { if (creds.id == id) { credentials = creds; return true; @@ -482,7 +482,7 @@ bool Config::TryGetWiFiCredentialsBySSID(const char* ssid, Config::WiFiCredentia return false; } - for (auto& creds : _configData.wifi.credentialsList) { + for (const auto& creds : _configData.wifi.credentialsList) { if (creds.ssid == ssid) { credentials = creds; return true; @@ -496,10 +496,10 @@ std::uint8_t Config::GetWiFiCredentialsIDbySSID(const char* ssid) { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { ESP_LOGE(TAG, "Failed to acquire read lock"); - return false; + return 0; } - for (auto& creds : _configData.wifi.credentialsList) { + for (const auto& creds : _configData.wifi.credentialsList) { if (creds.ssid == ssid) { return creds.id; } @@ -578,6 +578,6 @@ bool Config::ClearBackendAuthToken() { return false; } - _configData.backend.authToken = ""; + _configData.backend.authToken.clear(); return _trySaveConfig(); } diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp index fa55f1f5..dc55c5dc 100644 --- a/src/config/RFConfig.cpp +++ b/src/config/RFConfig.cpp @@ -7,6 +7,10 @@ const char* const TAG = "Config::RFConfig"; using namespace OpenShock::Config; +RFConfig::RFConfig() : txPin(OpenShock::Constants::GPIO_RF_TX), keepAliveEnabled(true) { } + +RFConfig::RFConfig(std::uint8_t txPin, bool keepAliveEnabled) : txPin(txPin), keepAliveEnabled(keepAliveEnabled) { } + void RFConfig::ToDefault() { txPin = OpenShock::Constants::GPIO_RF_TX; keepAliveEnabled = true; @@ -34,13 +38,13 @@ bool RFConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } const cJSON* txPinJson = cJSON_GetObjectItemCaseSensitive(json, "txPin"); - if (!cJSON_IsNumber(txPinJson)) { + if (cJSON_IsNumber(txPinJson) == 0) { ESP_LOGE(TAG, "value at 'txPin' is not a number"); return false; } @@ -48,7 +52,7 @@ bool RFConfig::FromJSON(const cJSON* json) { txPin = txPinJson->valueint; const cJSON* keepAliveEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "keepAliveEnabled"); - if (!cJSON_IsBool(keepAliveEnabledJson)) { + if (cJSON_IsBool(keepAliveEnabledJson) == 0) { ESP_LOGE(TAG, "value at 'keepAliveEnabled' is not a bool"); return false; } @@ -61,7 +65,7 @@ bool RFConfig::FromJSON(const cJSON* json) { cJSON* RFConfig::ToJSON() const { cJSON* root = cJSON_CreateObject(); - cJSON_AddNumberToObject(root, "txPin", txPin); + cJSON_AddNumberToObject(root, "txPin", txPin); //-V2564 cJSON_AddBoolToObject(root, "keepAliveEnabled", keepAliveEnabled); return root; diff --git a/src/config/RootConfig.cpp b/src/config/RootConfig.cpp index 22ba8c68..99ee3796 100644 --- a/src/config/RootConfig.cpp +++ b/src/config/RootConfig.cpp @@ -58,7 +58,7 @@ bool RootConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } diff --git a/src/config/SerialInputConfig.cpp b/src/config/SerialInputConfig.cpp index 94abfaaf..ab898ae3 100644 --- a/src/config/SerialInputConfig.cpp +++ b/src/config/SerialInputConfig.cpp @@ -6,9 +6,7 @@ const char* const TAG = "Config::SerialInputConfig"; using namespace OpenShock::Config; -SerialInputConfig::SerialInputConfig() { - ToDefault(); -} +SerialInputConfig::SerialInputConfig() : echoEnabled(true) {} SerialInputConfig::SerialInputConfig(bool echoEnabled) { this->echoEnabled = echoEnabled; @@ -39,7 +37,7 @@ bool SerialInputConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } @@ -50,7 +48,7 @@ bool SerialInputConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsBool(echoEnabledJson)) { + if (cJSON_IsBool(echoEnabledJson) == 0) { ESP_LOGE(TAG, "echoEnabled is not a bool"); return false; } diff --git a/src/config/WiFiConfig.cpp b/src/config/WiFiConfig.cpp index 08428ec7..14f20d66 100644 --- a/src/config/WiFiConfig.cpp +++ b/src/config/WiFiConfig.cpp @@ -7,6 +7,10 @@ const char* const TAG = "Config::WiFiConfig"; using namespace OpenShock::Config; +WiFiConfig::WiFiConfig() : accessPointSSID(OPENSHOCK_FW_AP_PREFIX), hostname(OPENSHOCK_FW_HOSTNAME), credentialsList() {} + +WiFiConfig::WiFiConfig(const std::string& accessPointSSID, const std::string& hostname, const std::vector& credentialsList) : accessPointSSID(accessPointSSID), hostname(hostname), credentialsList(credentialsList) {} + void WiFiConfig::ToDefault() { accessPointSSID = OPENSHOCK_FW_AP_PREFIX; hostname = OPENSHOCK_FW_HOSTNAME; @@ -29,7 +33,7 @@ bool WiFiConfig::FromFlatbuffers(const Serialization::Configuration::WiFiConfig* flatbuffers::Offset WiFiConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { std::vector> fbsCredentialsList; for (auto& credentials : credentialsList) { - fbsCredentialsList.push_back(credentials.ToFlatbuffers(builder)); + fbsCredentialsList.emplace_back(credentials.ToFlatbuffers(builder)); } return Serialization::Configuration::CreateWiFiConfig(builder, builder.CreateString(accessPointSSID), builder.CreateString(hostname), builder.CreateVector(fbsCredentialsList)); @@ -41,7 +45,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } @@ -52,7 +56,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(accessPointSSIDJson)) { + if (cJSON_IsString(accessPointSSIDJson) == 0) { ESP_LOGE(TAG, "accessPointSSID is not a string"); return false; } @@ -65,7 +69,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(hostnameJson)) { + if (cJSON_IsString(hostnameJson) == 0) { ESP_LOGE(TAG, "hostname is not a string"); return false; } @@ -78,7 +82,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsArray(credentialsListJson)) { + if (cJSON_IsArray(credentialsListJson) == 0) { ESP_LOGE(TAG, "credentials is not an array"); return false; } diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp index 1ceb72f3..3e169550 100644 --- a/src/config/WiFiCredentials.cpp +++ b/src/config/WiFiCredentials.cpp @@ -8,20 +8,14 @@ const char* const TAG = "Config::WiFiCredentials"; using namespace OpenShock::Config; -WiFiCredentials::WiFiCredentials() { - ToDefault(); -} +WiFiCredentials::WiFiCredentials() : id(0), ssid(), password() { } -WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::string& password) { - this->id = id; - this->ssid = ssid; - this->password = password; -} +WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::string& password) : id(id), ssid(ssid), password(password) { } void WiFiCredentials::ToDefault() { id = 0; - ssid = ""; - password = ""; + ssid.clear(); + password.clear(); } bool WiFiCredentials::FromFlatbuffers(const Serialization::Configuration::WiFiCredentials* config) { @@ -47,7 +41,7 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsObject(json)) { + if (cJSON_IsObject(json) == 0) { ESP_LOGE(TAG, "json is not an object"); return false; } @@ -57,7 +51,7 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { ESP_LOGV(TAG, "id was null"); id = 0; } else { - if (!cJSON_IsNumber(idJson)) { + if (cJSON_IsNumber(idJson) == 0) { ESP_LOGE(TAG, "id is not a number"); return false; } @@ -76,7 +70,7 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(ssidJson)) { + if (cJSON_IsString(ssidJson) == 0) { ESP_LOGE(TAG, "ssid is not a string"); return false; } @@ -89,7 +83,7 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { return false; } - if (!cJSON_IsString(passwordJson)) { + if (cJSON_IsString(passwordJson) == 0) { ESP_LOGE(TAG, "password is not a string"); return false; } @@ -102,7 +96,7 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { cJSON* WiFiCredentials::ToJSON() const { cJSON* root = cJSON_CreateObject(); - cJSON_AddNumberToObject(root, "id", id); + cJSON_AddNumberToObject(root, "id", id); //-V2564 cJSON_AddStringToObject(root, "ssid", ssid.c_str()); cJSON_AddStringToObject(root, "password", password.c_str()); diff --git a/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp b/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp index 7be03289..a25b6778 100644 --- a/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp +++ b/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp @@ -10,6 +10,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleAccountUnlinkCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_AccountUnlinkCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as AccountUnlinkCommand"); diff --git a/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp b/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp index 2fb72b3b..2fbdd148 100644 --- a/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp +++ b/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp @@ -18,8 +18,8 @@ void serializeSetRfTxPinResult(std::uint8_t socketId, std::uint8_t pin, OpenShoc builder.Finish(msgOffset); - auto buffer = builder.GetBufferPointer(); - auto size = builder.GetSize(); + const std::uint8_t* buffer = builder.GetBufferPointer(); + std::uint8_t size = builder.GetSize(); OpenShock::CaptivePortal::SendMessageBIN(socketId, buffer, size); } diff --git a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp index 71771a02..e477eacd 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp @@ -13,6 +13,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleWiFiNetworkConnectCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_WifiNetworkConnectCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as WiFiNetworkConnectCommand"); @@ -26,7 +28,7 @@ void _Private::HandleWiFiNetworkConnectCommand(std::uint8_t socketId, const Open return; } - if (ssid != nullptr && ssid->size() > 31) { + if (ssid->size() > 31) { ESP_LOGE(TAG, "WiFi SSID is too long"); return; } diff --git a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp index 88592d5a..6a0d9a5f 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp @@ -13,6 +13,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleWiFiNetworkDisconnectCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_WifiNetworkDisconnectCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as WiFiNetworkDisconnectCommand"); diff --git a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp index 5e600e0b..798a4efa 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp @@ -13,6 +13,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleWiFiNetworkForgetCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_WifiNetworkForgetCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as WiFiNetworkForgetCommand"); diff --git a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp index 53f1cba1..c417a14f 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp @@ -13,6 +13,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleWiFiNetworkSaveCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_WifiNetworkSaveCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as WiFiNetworkSaveCommand"); @@ -32,12 +34,14 @@ void _Private::HandleWiFiNetworkSaveCommand(std::uint8_t socketId, const OpenSho return; } - if (password.size() < 1) { - ESP_LOGV(TAG, "WiFi message is missing password, assuming open network"); - } else if (password.size() < 8) { + std::size_t passwordLength = password.size(); + + if (passwordLength != 0 && passwordLength < 8) { ESP_LOGE(TAG, "WiFi password is too short"); return; - } else if (password.size() > 63) { + } + + if (passwordLength > 63) { ESP_LOGE(TAG, "WiFi password is too long"); return; } diff --git a/src/event_handlers/websocket/local/WiFiScanCommand.cpp b/src/event_handlers/websocket/local/WiFiScanCommand.cpp index 430846a9..9450198c 100644 --- a/src/event_handlers/websocket/local/WiFiScanCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiScanCommand.cpp @@ -8,6 +8,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleWiFiScanCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + auto msg = root->payload_as_WifiScanCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as WiFiScanCommand"); diff --git a/src/event_handlers/websocket/local/_InvalidMessage.cpp b/src/event_handlers/websocket/local/_InvalidMessage.cpp index c4945730..cb7b5817 100644 --- a/src/event_handlers/websocket/local/_InvalidMessage.cpp +++ b/src/event_handlers/websocket/local/_InvalidMessage.cpp @@ -7,6 +7,8 @@ const char* const TAG = "LocalMessageHandlers"; using namespace OpenShock::MessageHandlers::Local; void _Private::HandleInvalidMessage(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { + (void)socketId; + if (root == nullptr) { ESP_LOGE(TAG, "Message cannot be parsed"); return; diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 704e5894..e23cd95c 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -96,6 +96,12 @@ bool _getDomain(const char* url, char (&domain)[256]) { return false; } + std::size_t urlLen = strlen(url); + if (urlLen == 0) { + memset(domain, 0, 256); + return false; + } + const char* urlEnd = url + strlen(url); const char* ptr; @@ -215,7 +221,7 @@ HTTP::Response _doGet(HTTPClient& client, const char* url, const std::ma return {HTTP::RequestResult::Success, responseCode, client.getString()}; } -HTTP::Response HTTP::GetString(const char* url, const std::map& headers, std::vector acceptedCodes) { +HTTP::Response HTTP::GetString(const char* url, const std::map& headers, const std::vector& acceptedCodes) { std::shared_ptr rateLimiter = _getRateLimiter(url); if (rateLimiter == nullptr) { return {RequestResult::InvalidURL, 0, ""}; diff --git a/src/radio/RFTransmitter.cpp b/src/radio/RFTransmitter.cpp index ada503d4..19138069 100644 --- a/src/radio/RFTransmitter.cpp +++ b/src/radio/RFTransmitter.cpp @@ -11,10 +11,10 @@ const char* const TAG = "RFTransmitter"; -const UBaseType_t RFTRANSMITTER_QUEUE_SIZE = 32; -const BaseType_t RFTRANSMITTER_TASK_PRIORITY = 1; +const UBaseType_t RFTRANSMITTER_QUEUE_SIZE = 32; +const BaseType_t RFTRANSMITTER_TASK_PRIORITY = 1; const std::uint32_t RFTRANSMITTER_TASK_STACK_SIZE = 4096; -const float RFTRANSMITTER_TICKRATE_NS = 1000; +const float RFTRANSMITTER_TICKRATE_NS = 1000; using namespace OpenShock; @@ -154,13 +154,10 @@ void RFTransmitter::TransmitTask(void* arg) { } // Replace the command if it already exists - bool existed = false; for (auto it = commands.begin(); it != commands.end(); ++it) { - auto& existingCmd = *it; + const command_t* existingCmd = *it; if (existingCmd->shockerId == cmd->shockerId) { - existed = true; - // Only replace the command if it should be overwritten if (existingCmd->overwrite) { delete *it; @@ -169,12 +166,14 @@ void RFTransmitter::TransmitTask(void* arg) { delete cmd; } + cmd = nullptr; + break; } } // If the command was not replaced, add it to the queue - if (!existed) { + if (cmd != nullptr) { commands.push_back(cmd); } } @@ -184,7 +183,7 @@ void RFTransmitter::TransmitTask(void* arg) { cmd = *it; bool expired = cmd->until < OpenShock::millis(); - bool empty = cmd->sequence.size() <= 0; + bool empty = cmd->sequence.empty(); // Remove expired or empty commands, else send the command. // After sending/receiving a command, move to the next one. diff --git a/src/radio/rmt/CaiXianlinEncoder.cpp b/src/radio/rmt/CaiXianlinEncoder.cpp index aa911fe2..fa1b88cc 100644 --- a/src/radio/rmt/CaiXianlinEncoder.cpp +++ b/src/radio/rmt/CaiXianlinEncoder.cpp @@ -17,7 +17,7 @@ using namespace OpenShock; std::vector Rmt::CaiXianlinEncoder::GetSequence(std::uint16_t transmitterId, std::uint8_t channelId, ShockerCommandType type, std::uint8_t intensity) { // Intensity must be between 0 and 99 - intensity = std::min(intensity, (std::uint8_t)99); + intensity = std::min(intensity, static_cast(99)); std::uint8_t typeVal = 0; switch (type) { @@ -35,13 +35,13 @@ std::vector Rmt::CaiXianlinEncoder::GetSequence(std::uint16_t transm } // Payload layout: [transmitterId:16][channelId:4][type:4][intensity:8] - std::uint32_t payload = (std::uint32_t(transmitterId & 0xFFFF) << 16) | (std::uint32_t(channelId & 0xF) << 12) | (std::uint32_t(typeVal) << 8) | std::uint32_t(intensity & 0xFF); + std::uint32_t payload = (static_cast(transmitterId & 0xFFFF) << 16) | (static_cast(channelId & 0xF) << 12) | (static_cast(typeVal) << 8) | static_cast(intensity & 0xFF); // Calculate the checksum of the payload std::uint8_t checksum = Checksum::CRC8(payload); // Add the checksum to the payload - std::uint64_t data = (std::uint64_t(payload) << 8) | std::uint64_t(checksum); + std::uint64_t data = (static_cast(payload) << 8) | static_cast(checksum); // Shift the data left by 3 bits to add the postamble (3 bits of 0) data <<= 3; diff --git a/src/radio/rmt/PetrainerEncoder.cpp b/src/radio/rmt/PetrainerEncoder.cpp index 128b3dd5..138a2200 100644 --- a/src/radio/rmt/PetrainerEncoder.cpp +++ b/src/radio/rmt/PetrainerEncoder.cpp @@ -11,7 +11,7 @@ using namespace OpenShock; std::vector Rmt::PetrainerEncoder::GetSequence(std::uint16_t shockerId, ShockerCommandType type, std::uint8_t intensity) { // Intensity must be between 0 and 100 - intensity = std::min(intensity, (std::uint8_t)100); + intensity = std::min(intensity, static_cast(100)); std::uint8_t nShift = 0; switch (type) { @@ -35,7 +35,7 @@ std::vector Rmt::PetrainerEncoder::GetSequence(std::uint16_t shocker std::uint8_t typeSum = (~(0x01 | (0x80 >> nShift))) & 0xFF; // Payload layout: [methodBit:8][shockerId:16][intensity:8][methodChecksum:8] - std::uint64_t data = (std::uint64_t(typeVal) << 32) | (std::uint64_t(shockerId) << 16) | (std::uint64_t(intensity) << 8) | std::uint64_t(typeSum); + std::uint64_t data = (static_cast(typeVal) << 32) | (static_cast(shockerId) << 16) | (static_cast(intensity) << 8) | static_cast(typeSum); std::vector pulses; pulses.reserve(42); diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 5674dcb7..51be1e5b 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -1,5 +1,6 @@ #include "serial/SerialInputHandler.h" +#include "Chipset.h" #include "CommandHandler.h" #include "config/Config.h" #include "config/SerialInputConfig.h" @@ -7,7 +8,6 @@ #include "Logging.h" #include "serialization/JsonSerial.h" #include "Time.h" -#include "Chipset.h" #include "util/Base64Utils.h" #include "wifi/WiFiManager.h" @@ -42,16 +42,18 @@ static std::unordered_map s_commandHandlers; /// @param strLen Length of input string /// @param out Output boolean /// @return True if the argument is a boolean, false otherwise -bool _tryParseBool(char* str, std::size_t strLen, bool& out) { - if (str == nullptr || strLen <= 0) { +bool _tryParseBool(const char* str, std::size_t strLen, bool& out) { + if (str == nullptr || strLen == 0) { return false; } if (strcasecmp(str, "true") == 0) { + out = true; return true; } if (strcasecmp(str, "false") == 0) { + out = false; return true; } @@ -59,16 +61,25 @@ bool _tryParseBool(char* str, std::size_t strLen, bool& out) { } void _handleVersionCommand(char* arg, std::size_t argLength) { + (void)arg; + (void)argLength; + Serial.print("\n"); SerialInputHandler::PrintVersionInfo(); } void _handleRestartCommand(char* arg, std::size_t argLength) { + (void)arg; + (void)argLength; + Serial.println("Restarting ESP..."); ESP.restart(); } void _handleFactoryResetCommand(char* arg, std::size_t argLength) { + (void)arg; + (void)argLength; + Serial.println("Resetting to factory defaults..."); Config::FactoryReset(); Serial.println("Restarting..."); @@ -76,7 +87,7 @@ void _handleFactoryResetCommand(char* arg, std::size_t argLength) { } void _handleRfTxPinCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { std::uint8_t txPin; if (!Config::GetRFConfigTxPin(txPin)) { SERPR_ERROR("Failed to get RF TX pin from config"); @@ -121,7 +132,7 @@ void _handleRfTxPinCommand(char* arg, std::size_t argLength) { } void _handleAuthtokenCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { std::string authToken; if (!Config::GetBackendAuthToken(authToken)) { SERPR_ERROR("Failed to get auth token from config"); @@ -145,7 +156,7 @@ void _handleAuthtokenCommand(char* arg, std::size_t argLength) { void _handleNetworksCommand(char* arg, std::size_t argLength) { cJSON* root; - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { root = cJSON_CreateArray(); if (root == nullptr) { SERPR_ERROR("Failed to create JSON array"); @@ -175,7 +186,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - if (!cJSON_IsArray(root)) { + if (cJSON_IsArray(root) == 0) { SERPR_ERROR("Invalid argument (not an array)"); return; } @@ -214,7 +225,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { void _handleKeepAliveCommand(char* arg, std::size_t argLength) { bool keepAliveEnabled; - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { // Get keep alive status if (!Config::GetRFConfigKeepAliveEnabled(keepAliveEnabled)) { SERPR_ERROR("Failed to get keep-alive status from config"); @@ -240,7 +251,7 @@ void _handleKeepAliveCommand(char* arg, std::size_t argLength) { } void _handleSerialEchoCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { // Get current serial echo status SERPR_RESPONSE("SerialEcho|%s", s_echoEnabled ? "true" : "false"); return; @@ -280,13 +291,15 @@ void _handleValidGpiosCommand(char* arg, std::size_t argLength) { } } - buffer.pop_back(); + if (!buffer.empty()) { + buffer.pop_back(); + } SERPR_RESPONSE("ValidGPIOs|%s", buffer.c_str()); } void _handleRawConfigCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { std::vector buffer; // Get raw config @@ -322,17 +335,20 @@ void _handleRawConfigCommand(char* arg, std::size_t argLength) { } void _handleDebugInfoCommand(char* arg, std::size_t argLength) { + (void)arg; + (void)argLength; + SERPR_RESPONSE("RTOSInfo|Free Heap|%u", xPortGetFreeHeapSize()); SERPR_RESPONSE("RTOSInfo|Min Free Heap|%u", xPortGetMinimumEverFreeHeapSize()); const std::int64_t now = OpenShock::millis(); - SERPR_RESPONSE("RTOSInfo|UptimeMS|%llu", now); + SERPR_RESPONSE("RTOSInfo|UptimeMS|%lli", now); const std::int64_t seconds = now / 1000; const std::int64_t minutes = seconds / 60; const std::int64_t hours = minutes / 60; const std::int64_t days = hours / 24; - SERPR_RESPONSE("RTOSInfo|Uptime|%llud %lluh %llum %llus", days, hours % 24, minutes % 60, seconds % 60); + SERPR_RESPONSE("RTOSInfo|Uptime|%llid %llih %llim %llis", days, hours % 24, minutes % 60, seconds % 60); OpenShock::WiFiNetwork network; bool connected = OpenShock::WiFiManager::GetConnectedNetwork(network); @@ -350,7 +366,7 @@ void _handleDebugInfoCommand(char* arg, std::size_t argLength) { } void _handleRFTransmitCommand(char* arg, std::size_t argLength) { - if (arg == nullptr || argLength <= 0) { + if (arg == nullptr || argLength == 0) { SERPR_ERROR("No command"); return; } @@ -390,11 +406,8 @@ void _handleHelpCommand(char* arg, std::size_t argLength) { return; } - if (argLength > 0) { - SERPR_ERROR("Command \"%.*s\" not found", argLength, arg); - } else { - SERPR_ERROR("No command"); - } + SERPR_ERROR("Command \"%.*s\" not found", argLength, arg); + return; } @@ -427,7 +440,7 @@ factoryreset reset device to factory defaults and restart static const SerialCmdHandler kVersionCmdHandler = { "version", -R"(version + R"(version Print version information Example: version @@ -436,7 +449,7 @@ R"(version }; static const SerialCmdHandler kRestartCmdHandler = { "restart", -R"(restart + R"(restart Restart the board Example: restart @@ -445,7 +458,7 @@ R"(restart }; static const SerialCmdHandler kSystemInfoCmdHandler = { "sysinfo", -R"(sysinfo + R"(sysinfo Get system information from RTOS, WiFi, etc. Example: sysinfo @@ -454,7 +467,7 @@ R"(sysinfo }; static const SerialCmdHandler kSerialEchoCmdHandler = { "echo", -R"(echo + R"(echo Get the serial echo status. If enabled, typed characters are echoed back to the serial port. @@ -469,7 +482,7 @@ echo [] }; static const SerialCmdHandler kValidGpiosCmdHandler = { "validgpios", -R"(validgpios + R"(validgpios List all valid GPIO pins Example: validgpios @@ -478,7 +491,7 @@ R"(validgpios }; static const SerialCmdHandler kRfTxPinCmdHandler = { "rftxpin", -R"(rftxpin + R"(rftxpin Get the GPIO pin used for the radio transmitter. rftxpin [] @@ -492,7 +505,7 @@ rftxpin [] }; static const SerialCmdHandler kAuthTokenCmdHandler = { "authtoken", -R"(authtoken + R"(authtoken Get the backend auth token. authtoken [] @@ -506,7 +519,7 @@ authtoken [] }; static const SerialCmdHandler kNetworksCmdHandler = { "networks", -R"(networks + R"(networks Get all saved networks. networks [] @@ -523,7 +536,7 @@ networks [] }; static const SerialCmdHandler kKeepAliveCmdHandler = { "keepalive", -R"(keepalive + R"(keepalive Get the shocker keep-alive status. keepalive [] @@ -537,7 +550,7 @@ keepalive [] }; static const SerialCmdHandler kRawConfigCmdHandler = { "rawconfig", -R"(rawconfig + R"(rawconfig Get the raw binary config Example: rawconfig @@ -553,7 +566,7 @@ rawconfig }; static const SerialCmdHandler kRfTransmitCmdHandler = { "rftransmit", -R"(rftransmit + R"(rftransmit Transmit a RF command Arguments: must be a JSON object with the following fields: @@ -569,7 +582,7 @@ R"(rftransmit }; static const SerialCmdHandler kFactoryResetCmdHandler = { "factoryreset", -R"(factoryreset + R"(factoryreset Reset the device to factory defaults and restart Example: factoryreset @@ -578,7 +591,7 @@ R"(factoryreset }; static const SerialCmdHandler khelpCmdHandler = { "help", -R"(help [] + R"(help [] Print help information Arguments: (optional) command to print help for @@ -602,7 +615,7 @@ int findChar(const char* buffer, std::size_t bufferSize, char c) { } int findLineEnd(const char* buffer, int bufferSize) { - if (bufferSize <= 0) return -1; + if (buffer == nullptr || bufferSize <= 0) return -1; for (int i = 0; i < bufferSize; i++) { if (buffer[i] == '\r' || buffer[i] == '\n' || buffer[i] == '\0') { @@ -707,9 +720,9 @@ void SerialInputHandler::Update() { while (true) { int available = Serial.available(); - if (available <= 0 && findLineEnd(buffer, bufferIndex) == -1) { + if (available <= 0 && findLineEnd(buffer, bufferIndex) < 0) { // If we're suppressing paste, and we haven't printed anything in a while, print the buffer and stop suppressing - if (s_echoEnabled && suppressingPaste && OpenShock::millis() - lastEcho > PASTE_INTERVAL_THRESHOLD_MS) { + if (buffer != nullptr && s_echoEnabled && suppressingPaste && OpenShock::millis() - lastEcho > PASTE_INTERVAL_THRESHOLD_MS) { // \r - carriage return, moves to start of line // \x1B[K - clears rest of line Serial.printf("\r\x1B[K> %.*s", bufferIndex, buffer); @@ -721,7 +734,20 @@ void SerialInputHandler::Update() { if (bufferIndex + available > bufferSize) { bufferSize = bufferIndex + available; - buffer = static_cast(realloc(buffer, bufferSize)); + + void* newBuffer = realloc(buffer, bufferSize); + if (newBuffer == nullptr) { + free(buffer); + buffer = nullptr; + bufferSize = 0; + continue; + } + + buffer = static_cast(newBuffer); + } + + if (buffer == nullptr) { + continue; } while (available-- > 0) { diff --git a/src/serialization/JsonAPI.cpp b/src/serialization/JsonAPI.cpp index 76fe8af6..ab2a896a 100644 --- a/src/serialization/JsonAPI.cpp +++ b/src/serialization/JsonAPI.cpp @@ -9,13 +9,15 @@ const char* const TAG = "JsonAPI"; using namespace OpenShock::Serialization; bool JsonAPI::ParseAccountLinkJsonResponse(int code, const cJSON* root, JsonAPI::AccountLinkResponse& out) { - if (!cJSON_IsObject(root)) { + (void)code; + + if (cJSON_IsObject(root) == 0) { ESP_LOGJSONE("not an object", root); return false; } const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); - if (!cJSON_IsString(data)) { + if (cJSON_IsString(data) == 0) { ESP_LOGJSONE("value at 'data' is not a string", root); return false; } @@ -27,31 +29,33 @@ bool JsonAPI::ParseAccountLinkJsonResponse(int code, const cJSON* root, JsonAPI: return true; } bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI::DeviceInfoResponse& out) { - if (!cJSON_IsObject(root)) { + (void)code; + + if (cJSON_IsObject(root) == 0) { ESP_LOGJSONE("not an object", root); return false; } const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); - if (!cJSON_IsObject(data)) { + if (cJSON_IsObject(data) == 0) { ESP_LOGJSONE("value at 'data' is not an object", root); return false; } const cJSON* deviceId = cJSON_GetObjectItemCaseSensitive(data, "id"); - if (!cJSON_IsString(deviceId)) { + if (cJSON_IsString(deviceId) == 0) { ESP_LOGJSONE("value at 'data.id' is not a string", root); return false; } const cJSON* deviceName = cJSON_GetObjectItemCaseSensitive(data, "name"); - if (!cJSON_IsString(deviceName)) { + if (cJSON_IsString(deviceName) == 0) { ESP_LOGJSONE("value at 'data.name' is not a string", root); return false; } const cJSON* deviceShockers = cJSON_GetObjectItemCaseSensitive(data, "shockers"); - if (!cJSON_IsArray(deviceShockers)) { + if (cJSON_IsArray(deviceShockers) == 0) { ESP_LOGJSONE("value at 'data.shockers' is not an array", root); return false; } @@ -69,7 +73,7 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: cJSON* shocker = nullptr; cJSON_ArrayForEach(shocker, deviceShockers) { const cJSON* shockerId = cJSON_GetObjectItemCaseSensitive(shocker, "id"); - if (!cJSON_IsString(shockerId)) { + if (cJSON_IsString(shockerId) == 0) { ESP_LOGJSONE("value at 'shocker.id' is not a string", shocker); return false; } @@ -81,7 +85,7 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: } const cJSON* shockerRfId = cJSON_GetObjectItemCaseSensitive(shocker, "rfId"); - if (!cJSON_IsNumber(shockerRfId)) { + if (cJSON_IsNumber(shockerRfId) == 0) { ESP_LOGJSONE("value at 'shocker.rfId' is not a number", shocker); return false; } @@ -90,10 +94,10 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: ESP_LOGJSONE("value at 'shocker.rfId' is not a valid uint16_t", shocker); return false; } - std::uint16_t shockerRfIdU16 = (std::uint16_t)shockerRfIdInt; + std::uint16_t shockerRfIdU16 = static_cast(shockerRfIdInt); const cJSON* shockerModel = cJSON_GetObjectItemCaseSensitive(shocker, "model"); - if (!cJSON_IsString(shockerModel)) { + if (cJSON_IsString(shockerModel) == 0) { ESP_LOGJSONE("value at 'shocker.model' is not a string", shocker); return false; } @@ -116,13 +120,15 @@ bool JsonAPI::ParseDeviceInfoJsonResponse(int code, const cJSON* root, JsonAPI:: return true; } bool JsonAPI::ParseAssignLcgJsonResponse(int code, const cJSON* root, JsonAPI::AssignLcgResponse& out) { - if (!cJSON_IsObject(root)) { + (void)code; + + if (cJSON_IsObject(root) == 0) { ESP_LOGJSONE("not an object", root); return false; } const cJSON* data = cJSON_GetObjectItemCaseSensitive(root, "data"); - if (!cJSON_IsObject(data)) { + if (cJSON_IsObject(data) == 0) { ESP_LOGJSONE("value at 'data' is not an object", root); return false; } @@ -130,7 +136,7 @@ bool JsonAPI::ParseAssignLcgJsonResponse(int code, const cJSON* root, JsonAPI::A const cJSON* fqdn = cJSON_GetObjectItemCaseSensitive(data, "fqdn"); const cJSON* country = cJSON_GetObjectItemCaseSensitive(data, "country"); - if (!cJSON_IsString(fqdn) || !cJSON_IsString(country)) { + if (cJSON_IsString(fqdn) == 0 || cJSON_IsString(country) == 0) { ESP_LOGJSONE("value at 'data.fqdn' or 'data.country' is not a string", root); return false; } diff --git a/src/serialization/JsonSerial.cpp b/src/serialization/JsonSerial.cpp index 85fa3590..3155ca15 100644 --- a/src/serialization/JsonSerial.cpp +++ b/src/serialization/JsonSerial.cpp @@ -7,7 +7,7 @@ const char* const TAG = "JsonSerial"; using namespace OpenShock::Serialization; bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerCommand& out) { - if (!cJSON_IsObject(root)) { + if (cJSON_IsObject(root) == 0) { ESP_LOGE(TAG, "not an object"); return false; } @@ -17,7 +17,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma ESP_LOGE(TAG, "missing 'model' field"); return false; } - if (!cJSON_IsString(model)) { + if (cJSON_IsString(model) == 0) { ESP_LOGE(TAG, "value at 'model' is not a string"); return false; } @@ -32,7 +32,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma ESP_LOGE(TAG, "missing 'id' field"); return false; } - if (!cJSON_IsNumber(id)) { + if (cJSON_IsNumber(id) == 0) { ESP_LOGE(TAG, "value at 'id' is not a number"); return false; } @@ -48,7 +48,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma ESP_LOGE(TAG, "missing 'type' field"); return false; } - if (!cJSON_IsString(command)) { + if (cJSON_IsString(command) == 0) { ESP_LOGE(TAG, "value at 'type' is not a string"); return false; } @@ -63,7 +63,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma ESP_LOGE(TAG, "missing 'intensity' field"); return false; } - if (!cJSON_IsNumber(intensity)) { + if (cJSON_IsNumber(intensity) == 0) { ESP_LOGE(TAG, "value at 'intensity' is not a number"); return false; } @@ -79,7 +79,7 @@ bool JsonSerial::ParseShockerCommand(const cJSON* root, JsonSerial::ShockerComma ESP_LOGE(TAG, "missing 'durationMs' field"); return false; } - if (!cJSON_IsNumber(durationMs)) { + if (cJSON_IsNumber(durationMs) == 0) { ESP_LOGE(TAG, "value at 'durationMs' is not a number"); return false; } diff --git a/src/util/Base64Utils.cpp b/src/util/Base64Utils.cpp index dc87c59b..0aba678c 100644 --- a/src/util/Base64Utils.cpp +++ b/src/util/Base64Utils.cpp @@ -24,16 +24,23 @@ std::size_t Base64Utils::Encode(const std::uint8_t* data, std::size_t dataLen, c return requiredLen; } -bool Base64Utils::Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output) noexcept { +bool Base64Utils::Encode(const std::uint8_t* data, std::size_t dataLen, std::string& output) { std::size_t requiredLen = Base64Utils::CalculateEncodedSize(dataLen) + 1; // +1 for null terminator - output.resize(requiredLen); + char* buffer = new char[requiredLen]; - std::size_t written = Encode(data, dataLen, const_cast(output.data()), output.size()); + std::size_t written = Encode(data, dataLen, buffer, requiredLen); if (written == 0) { output.clear(); + delete[] buffer; return false; } + buffer[written] = '\0'; + + output.assign(buffer, written); + + delete[] buffer; + if (written < requiredLen) { output.resize(written); } diff --git a/src/util/CertificateUtils.cpp b/src/util/CertificateUtils.cpp index bca70882..17fb46ef 100644 --- a/src/util/CertificateUtils.cpp +++ b/src/util/CertificateUtils.cpp @@ -24,7 +24,7 @@ bool OpenShock::CertificateUtils::GetHostCertificate(const char* host, std::vect client.connect(host, 443); - if (!client.connected()) { + if (client.connected() == 0) { ESP_LOGE(TAG, "Failed to connect to host %s", host); return false; } diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index f9e5949d..3fbfb1f6 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -135,6 +135,8 @@ bool _connectImpl(const char* ssid, const char* password, const std::uint8_t (&b return true; } bool _connectHidden(const std::uint8_t (&bssid)[6], const std::string& password) { + (void)password; + ESP_LOGV(TAG, "Connecting to hidden network " BSSID_FMT, BSSID_ARG(bssid)); // TODO: Implement hidden network support @@ -205,7 +207,7 @@ void _evWiFiConnected(arduino_event_t* event) { Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Connected, *it, CaptivePortal::BroadcastMessageBIN); } void _evWiFiGotIP(arduino_event_t* event) { - auto& info = event->event_info.got_ip; + const auto& info = event->event_info.got_ip; std::uint8_t ip[4]; memcpy(ip, &info.ip_info.ip.addr, sizeof(ip)); @@ -244,12 +246,13 @@ void _evWiFiScanStarted() { } void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { // If the scan started, remove any networks that have not been seen in 3 scans if (status == OpenShock::WiFiScanStatus::Started) { - for (auto it = s_wifiNetworks.begin(); it != s_wifiNetworks.end(); ++it) { + for (auto it = s_wifiNetworks.begin(); it != s_wifiNetworks.end();) { if (it->scansMissed++ > 3) { ESP_LOGV(TAG, "Network %s (" BSSID_FMT ") has not been seen in 3 scans, removing from list", it->ssid, BSSID_ARG(it->bssid)); Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Lost, *it, CaptivePortal::BroadcastMessageBIN); - s_wifiNetworks.erase(it); - it--; + it = s_wifiNetworks.erase(it); + } else { + ++it; } } } @@ -308,7 +311,7 @@ bool WiFiManager::Init() { // If we recognize the network in the ESP's WiFi cache, try to connect to it wifi_config_t current_conf; - if (esp_wifi_get_config((wifi_interface_t)ESP_IF_WIFI_STA, ¤t_conf) == ESP_OK) { + if (esp_wifi_get_config(static_cast(ESP_IF_WIFI_STA), ¤t_conf) == ESP_OK) { if (current_conf.sta.ssid[0] != '\0') { if (Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(current_conf.sta.ssid)) != 0) { WiFi.begin(); diff --git a/src/wifi/WiFiNetwork.cpp b/src/wifi/WiFiNetwork.cpp index 1577000a..388fead1 100644 --- a/src/wifi/WiFiNetwork.cpp +++ b/src/wifi/WiFiNetwork.cpp @@ -6,13 +6,13 @@ using namespace OpenShock; -WiFiNetwork::WiFiNetwork() : channel(0), rssi(0), authMode(WIFI_AUTH_MAX), credentialsID(0), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { +WiFiNetwork::WiFiNetwork() : ssid {0}, bssid {0}, channel(0), rssi(0), authMode(WIFI_AUTH_MAX), credentialsID(0), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { memset(ssid, 0, sizeof(ssid)); memset(bssid, 0, sizeof(bssid)); } WiFiNetwork::WiFiNetwork(const wifi_ap_record_t* apRecord, std::uint8_t credentialsId) - : channel(apRecord->primary), rssi(apRecord->rssi), authMode(apRecord->authmode), credentialsID(credentialsId), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { + : ssid {0}, bssid {0}, channel(apRecord->primary), rssi(apRecord->rssi), authMode(apRecord->authmode), credentialsID(credentialsId), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { static_assert(sizeof(ssid) == sizeof(apRecord->ssid) && sizeof(ssid) == 33, "SSID buffers must be 33 bytes long! (32 bytes for the SSID + 1 byte for the null terminator)"); static_assert(sizeof(bssid) == sizeof(apRecord->bssid) && sizeof(bssid) == 6, "BSSIDs must be 6 bytes long!"); @@ -21,7 +21,7 @@ WiFiNetwork::WiFiNetwork(const wifi_ap_record_t* apRecord, std::uint8_t credenti } WiFiNetwork::WiFiNetwork(const char (&ssid)[33], const std::uint8_t (&bssid)[6], std::uint8_t channel, std::int8_t rssi, wifi_auth_mode_t authMode, std::uint8_t credentialsId) - : channel(channel), rssi(rssi), authMode(authMode), credentialsID(credentialsId), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { + : ssid {0}, bssid {0}, channel(channel), rssi(rssi), authMode(authMode), credentialsID(credentialsId), connectAttempts(0), lastConnectAttempt(0), scansMissed(0) { static_assert(sizeof(ssid) == sizeof(this->ssid) && sizeof(ssid) == 33, "SSID buffers must be 33 bytes long! (32 bytes for the SSID + 1 byte for the null terminator)"); static_assert(sizeof(bssid) == sizeof(this->bssid) && sizeof(bssid) == 6, "BSSIDs must be 6 bytes long!"); diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index 8b61763e..2f036ef2 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -139,6 +139,8 @@ WiFiScanStatus _scanningTaskImpl() { } void _scanningTask(void* arg) { + (void)arg; + // Start the scan WiFiScanStatus status = _scanningTaskImpl(); @@ -155,6 +157,9 @@ void _scanningTask(void* arg) { } void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { + (void)event; + (void)info; + std::int16_t numNetworks = WiFi.scanComplete(); if (_isScanError(numNetworks)) { _handleScanError(numNetworks); @@ -182,6 +187,9 @@ void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { _notifyTask(WiFiScanTaskNotificationFlags::CHANNEL_DONE); } void _evSTAStopped(arduino_event_id_t event, arduino_event_info_t info) { + (void)event; + (void)info; + _notifyTask(WiFiScanTaskNotificationFlags::WIFI_DISABLED); } From de09527fd02a2758b1718a3239b0c3a866117516 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Sat, 16 Dec 2023 01:16:43 +0100 Subject: [PATCH 058/147] [Bugfix] xiao pin bypass (#165) * Correct Seeed Xiao ESP32-S3 Pin Bypasses * Actually defaults are fine for Xiao S3 --------- Co-authored-by: nullstalgia --- include/Chipset.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/Chipset.h b/include/Chipset.h index 65cac88a..1e47ae29 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -183,9 +183,6 @@ #ifdef OPENSHOCK_FW_BOARD_PISHOCKLITE2021 #define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15 || (pin) == 2) #endif -#ifdef OPENSHOCK_FW_BOARD_SEEEDXIAOESP32S3 -#define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 21) -#endif #ifdef OPENSHOCK_FW_BOARD_OPENSHOCKCOREV1 #define OPENSHOCK_BYPASSED_GPIO(pin) ((pin) == 15 || (pin) == 35) #endif From 670dcc81122aa20c2e3b6d1858307ece25ffd743 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Sat, 16 Dec 2023 01:26:00 +0100 Subject: [PATCH 059/147] Upgrade SvelteKit to 2.0 (#168) * Upgrade SvelteKit to 2.0 * Update package-lock.json --- WebUI/package-lock.json | 5253 +++++---------------------------------- WebUI/package.json | 14 +- WebUI/svelte.config.js | 2 +- 3 files changed, 571 insertions(+), 4698 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index f58b8088..8cc76cb1 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -14,19 +14,19 @@ "@playwright/test": "1.40.1", "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.28.0", + "@sveltejs/adapter-static": "^3.0.0", + "@sveltejs/kit": "2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.4", - "@typescript-eslint/eslint-plugin": "6.13.2", - "@typescript-eslint/parser": "6.13.2", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", "autoprefixer": "10.4.16", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", - "npm-check-updates": "16.14.11", "postcss": "8.4.32", "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", @@ -35,8 +35,8 @@ "tailwindcss": "3.3.6", "tslib": "2.6.2", "typescript": "5.3.3", - "vite": "^4.5.1", - "vite-plugin-tailwind-purgecss": "0.1.4", + "vite": "^5.0.10", + "vite-plugin-tailwind-purgecss": "^0.2.0", "vitest": "1.0.4" } }, @@ -74,20 +74,10 @@ "node": ">=6.0.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -101,9 +91,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -117,9 +107,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -133,9 +123,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -149,9 +139,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -165,9 +155,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -181,9 +171,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -197,9 +187,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -213,9 +203,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -229,9 +219,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -245,9 +235,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -261,9 +251,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -277,9 +267,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -293,9 +283,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -309,9 +299,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -325,9 +315,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -341,9 +331,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -357,9 +347,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -373,9 +363,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -389,9 +379,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -405,9 +395,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -421,9 +411,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -452,9 +442,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", - "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -492,19 +482,10 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", "dependencies": { "@floating-ui/utils": "^0.1.3" } @@ -519,9 +500,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", @@ -556,73 +537,6 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -674,9 +588,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -718,154 +632,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@playwright/test": { "version": "1.40.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", @@ -881,57 +647,16 @@ "node": ">=16" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz", - "integrity": "sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.0.tgz", + "integrity": "sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==", "cpu": [ "arm" ], @@ -942,9 +667,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz", - "integrity": "sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.0.tgz", + "integrity": "sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==", "cpu": [ "arm64" ], @@ -955,9 +680,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz", - "integrity": "sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz", + "integrity": "sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==", "cpu": [ "arm64" ], @@ -968,9 +693,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz", - "integrity": "sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.0.tgz", + "integrity": "sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==", "cpu": [ "x64" ], @@ -981,9 +706,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz", - "integrity": "sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.0.tgz", + "integrity": "sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==", "cpu": [ "arm" ], @@ -994,9 +719,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz", - "integrity": "sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.0.tgz", + "integrity": "sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==", "cpu": [ "arm64" ], @@ -1007,9 +732,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz", - "integrity": "sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.0.tgz", + "integrity": "sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==", "cpu": [ "arm64" ], @@ -1020,9 +745,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz", - "integrity": "sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.0.tgz", + "integrity": "sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==", "cpu": [ "riscv64" ], @@ -1033,9 +758,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz", - "integrity": "sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz", + "integrity": "sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==", "cpu": [ "x64" ], @@ -1046,9 +771,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz", - "integrity": "sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz", + "integrity": "sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==", "cpu": [ "x64" ], @@ -1059,9 +784,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz", - "integrity": "sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.0.tgz", + "integrity": "sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==", "cpu": [ "arm64" ], @@ -1072,9 +797,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz", - "integrity": "sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.0.tgz", + "integrity": "sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==", "cpu": [ "ia32" ], @@ -1085,9 +810,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz", - "integrity": "sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz", + "integrity": "sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==", "cpu": [ "x64" ], @@ -1097,72 +822,12 @@ "win32" ] }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@skeletonlabs/skeleton": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.6.0.tgz", @@ -1185,95 +850,82 @@ } }, "node_modules/@sveltejs/adapter-static": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", - "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.0.tgz", + "integrity": "sha512-nNsm8XChhJgQdeVegdXU+EnpznSUlsIjlLJa9SNmvSVN3rcPtB2BAnGuS/EWCtgPLkVcy9V2kW5knronqmF+KQ==", "dev": true, "peerDependencies": { - "@sveltejs/kit": "^1.5.0" + "@sveltejs/kit": "^2.0.0" } }, "node_modules/@sveltejs/kit": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.28.0.tgz", - "integrity": "sha512-T9hoS6XM840W4ZUgf3kKAoBt2dsupumUxBtlxt3ddu2yRLrqsKcC3gledBB/e5NtTC8zEZyR5qWBNFT9WAWmIA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.0.tgz", + "integrity": "sha512-/GFxvit+q7PztRbgGTFXhVB6jvb0fZSeWuz5f4siQ2r/5BVhxYh7++Bw3/ZUjiOuyoZFiNBmOPcRNQbkzEce0g==", "dev": true, "hasInstallScript": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.5.0", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^4.3.1", + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0", + "devalue": "^4.3.2", "esm-env": "^1.0.0", "kleur": "^4.1.5", - "magic-string": "^0.30.0", + "magic-string": "^0.30.5", "mrmime": "^1.0.1", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "~5.26.2" + "sirv": "^2.0.3", + "tiny-glob": "^0.2.9" }, "bin": { "svelte-kit": "svelte-kit.js" }, "engines": { - "node": "^16.14 || >=18" + "node": ">=18.13" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", - "vite": "^4.0.0" + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3" } }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.2.tgz", - "integrity": "sha512-Dfy0Rbl+IctOVfJvWGxrX/3m6vxPLH8o0x+8FA5QEyMUQMo4kGOVIojjryU7YomBAexOTAuYf1RT7809yDziaA==", + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz", + "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.3", + "magic-string": "^0.30.5", "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.4" + "vitefu": "^0.2.5" }, "engines": { - "node": "^14.18.0 || >= 16" + "node": "^18.0.0 || >=20" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", - "vite": "^4.0.0" + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", - "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz", + "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==", "dev": true, "dependencies": { "debug": "^4.3.4" }, "engines": { - "node": "^14.18.0 || >= 16" + "node": "^18.0.0 || >=20" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.2.0", - "svelte": "^3.54.0 || ^4.0.0", - "vite": "^4.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, "node_modules/@tailwindcss/forms": { @@ -1303,77 +955,16 @@ "tailwindcss": ">=3.0.0 || insiders" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@types/cookie": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz", - "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true }, "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { @@ -1392,9 +983,9 @@ } }, "node_modules/@types/pug": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", - "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", "dev": true }, "node_modules/@types/semver": { @@ -1404,16 +995,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", - "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", + "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/type-utils": "6.13.2", - "@typescript-eslint/utils": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/type-utils": "6.14.0", + "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1439,15 +1030,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", - "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", + "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4" }, "engines": { @@ -1467,13 +1058,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", - "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", + "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1484,13 +1075,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", - "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", + "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/utils": "6.14.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1511,9 +1102,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", - "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", + "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1524,13 +1115,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", - "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", + "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1551,17 +1142,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", - "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", + "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", "semver": "^7.5.4" }, "engines": { @@ -1576,12 +1167,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", - "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", + "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/types": "6.14.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1693,16 +1284,10 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1729,43 +1314,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1782,15 +1330,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1834,25 +1373,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1953,102 +1473,6 @@ "node": ">=8" } }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2072,9 +1496,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -2091,9 +1515,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -2112,21 +1536,6 @@ "node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2136,120 +1545,6 @@ "node": ">=8" } }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2259,18 +1554,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -2281,9 +1564,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001539", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", - "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", "dev": true, "funding": [ { @@ -2385,89 +1668,29 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" } }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "node": ">=7.0.0" } }, "node_modules/color-name": { @@ -2476,15 +1699,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2500,51 +1714,10 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "engines": { "node": ">= 0.6" @@ -2564,33 +1737,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -2633,33 +1779,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -2672,15 +1791,6 @@ "node": ">=6" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2696,21 +1806,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2780,62 +1875,10 @@ "node": ">=6.0.0" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/electron-to-chromium": { - "version": "1.4.529", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", - "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "version": "1.4.614", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", + "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", "dev": true }, "node_modules/es6-promise": { @@ -2845,9 +1888,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "dev": true, "hasInstallScript": true, "bin": { @@ -2857,28 +1900,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/escalade": { @@ -2890,18 +1933,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3041,19 +2072,7 @@ "node": ">=4" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { + "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", @@ -3069,13 +2088,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esm-env": { @@ -3113,15 +2135,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3134,7 +2147,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3184,36 +2197,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3221,9 +2204,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3260,12 +2243,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -3316,17 +2293,17 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatbuffers": { @@ -3341,56 +2318,10 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" @@ -3400,27 +2331,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3428,9 +2338,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3442,28 +2352,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-func-name": { @@ -3475,25 +2369,13 @@ "node": "*" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3531,34 +2413,10 @@ "node": ">=10.13.0" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3602,31 +2460,6 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3639,18 +2472,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3660,89 +2481,16 @@ "node": ">=8" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" } }, "node_modules/human-signals": { @@ -3754,73 +2502,15 @@ "node": ">=16.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3837,15 +2527,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3855,15 +2536,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3880,21 +2552,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3907,25 +2564,13 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3940,15 +2585,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3961,40 +2597,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4004,15 +2606,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4043,60 +2636,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4115,24 +2669,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "dependencies": { - "jju": "^1.1.0" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4145,43 +2681,16 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -4202,21 +2711,6 @@ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4282,12 +2776,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.castarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", @@ -4315,18 +2803,6 @@ "get-func-name": "^2.0.1" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4351,41 +2827,6 @@ "node": ">=12" } }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -4432,18 +2873,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -4483,184 +2912,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -4744,97 +2995,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4853,313 +3019,16 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates": { - "version": "16.14.11", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.11.tgz", - "integrity": "sha512-0MMWGbGci22Pu77bR9jRsy5qgxdQSJVqNtSyyFeubDPtbcU36z4gjEDITu26PMabFWPNkAoVfKF31M3uKUvzFg==", - "dev": true, - "dependencies": { - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5177,21 +3046,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5251,15 +3105,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5290,71 +3135,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5367,18 +3147,6 @@ "node": ">=6" } }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5412,31 +3180,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5549,20 +3292,6 @@ "node": ">=16" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/postcss": { "version": "8.4.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", @@ -5705,9 +3434,9 @@ } }, "node_modules/postcss-scss": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz", - "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, "funding": [ { @@ -5809,99 +3538,28 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/purgecss": { + "version": "6.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", + "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/purgecss": { - "version": "6.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-6.0.0-alpha.0.tgz", - "integrity": "sha512-UC7d7uIyZsky+srEsSXny9BkbTcVn3ZtBCNX3rW3DsqJKhvUXFRpufA4ktcHzWF0+JLZgmsqjUm/8R82x9bHpw==", - "dev": true, - "dependencies": { - "commander": "^10.0.0", - "glob": "^8.0.3", - "postcss": "^8.4.4", - "postcss-selector-parser": "^6.0.7" - }, - "bin": { - "purgecss": "bin/purgecss.js" + "dependencies": { + "commander": "^10.0.0", + "glob": "^8.0.3", + "postcss": "^8.4.4", + "postcss-selector-parser": "^6.0.7" + }, + "bin": { + "purgecss": "bin/purgecss.js" } }, "node_modules/purgecss/node_modules/brace-expansion": { @@ -5973,60 +3631,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -6042,94 +3646,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6142,55 +3658,10 @@ "node": ">=8.10.0" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -6204,12 +3675,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -6219,30 +3684,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6269,18 +3710,31 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.0.tgz", + "integrity": "sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.0", + "@rollup/rollup-android-arm64": "4.9.0", + "@rollup/rollup-darwin-arm64": "4.9.0", + "@rollup/rollup-darwin-x64": "4.9.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.0", + "@rollup/rollup-linux-arm64-gnu": "4.9.0", + "@rollup/rollup-linux-arm64-musl": "4.9.0", + "@rollup/rollup-linux-riscv64-gnu": "4.9.0", + "@rollup/rollup-linux-x64-gnu": "4.9.0", + "@rollup/rollup-linux-x64-musl": "4.9.0", + "@rollup/rollup-win32-arm64-msvc": "4.9.0", + "@rollup/rollup-win32-ia32-msvc": "4.9.0", + "@rollup/rollup-win32-x64-msvc": "4.9.0", "fsevents": "~2.3.2" } }, @@ -6319,33 +3773,6 @@ "node": ">=6" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, "node_modules/sander": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", @@ -6385,33 +3812,6 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", @@ -6446,28 +3846,15 @@ "dev": true }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sirv": { @@ -6484,12 +3871,6 @@ "node": ">= 10" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6499,66 +3880,19 @@ "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", "dev": true, "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sorcery": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", - "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0" - }, - "bin": { - "sorcery": "bin/sorcery" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "sorcery": "bin/sorcery" } }, "node_modules/source-map-js": { @@ -6570,81 +3904,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", - "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -6657,44 +3916,6 @@ "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==", "dev": true }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6707,19 +3928,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -6881,16 +4089,16 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz", - "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", + "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", "dev": true, "dependencies": { "eslint-scope": "^7.0.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", - "postcss": "^8.4.28", - "postcss-scss": "^4.0.7" + "postcss": "^8.4.29", + "postcss-scss": "^4.0.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6907,31 +4115,6 @@ } } }, - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/svelte-hmr": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", @@ -6945,9 +4128,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.0.tgz", - "integrity": "sha512-EkErPiDzHAc0k2MF5m6vBNmRUh338h2myhinUw/xaqsLs7/ZvsgREiLGj03VrSzbY/TB5ZXgBOsKraFee5yceA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.2.tgz", + "integrity": "sha512-XF0aliMAcYnP4hLETvB6HRAMnaL09ASYT1Z2I1Gwu0nz6xbdg/dSgAEthtFZJA4AKrNhFDFdmUDO+H9d/6xg5g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -6965,7 +4148,7 @@ "coffeescript": "^2.5.1", "less": "^3.11.3 || ^4.0.0", "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "pug": "^3.0.0", "sass": "^1.26.8", "stylus": "^0.55.0", @@ -7056,21 +4239,27 @@ } }, "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -7084,6 +4273,15 @@ } } }, + "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/tailwindcss/node_modules/postcss-selector-parser": { "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", @@ -7098,67 +4296,14 @@ } }, "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" } }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7265,20 +4410,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7312,15 +4443,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -7340,72 +4462,12 @@ "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", "dev": true }, - "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -7436,46 +4498,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7491,1101 +4513,18 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "node_modules/vite": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", + "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", "dev": true, "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.4.tgz", - "integrity": "sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" - } - }, - "node_modules/vite-node/node_modules/rollup": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", - "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.8.0", - "@rollup/rollup-android-arm64": "4.8.0", - "@rollup/rollup-darwin-arm64": "4.8.0", - "@rollup/rollup-darwin-x64": "4.8.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", - "@rollup/rollup-linux-arm64-gnu": "4.8.0", - "@rollup/rollup-linux-arm64-musl": "4.8.0", - "@rollup/rollup-linux-riscv64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-musl": "4.8.0", - "@rollup/rollup-win32-arm64-msvc": "4.8.0", - "@rollup/rollup-win32-ia32-msvc": "4.8.0", - "@rollup/rollup-win32-x64-msvc": "4.8.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-tailwind-purgecss": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.1.4.tgz", - "integrity": "sha512-iL43Amym6/TWKHcHwCjQl2LLLKhil7WQH7oMtDSOCzINFuKS3STaQrI5SDCl+waqheezv9WmI2gNuIWY+o5hsA==", - "dev": true, - "dependencies": { - "estree-walker": "^3.0.3", - "purgecss": "6.0.0-alpha.0" - }, - "peerDependencies": { - "vite": "^4.1.1" - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.4.tgz", - "integrity": "sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.0.4", - "@vitest/runner": "1.0.4", - "@vitest/snapshot": "1.0.4", - "@vitest/spy": "1.0.4", - "@vitest/utils": "1.0.4", - "acorn-walk": "^8.3.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^1.3.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.1", - "vite": "^5.0.0", - "vite-node": "1.0.4", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "^1.0.0", - "@vitest/ui": "^1.0.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" - } - }, - "node_modules/vitest/node_modules/rollup": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", - "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.8.0", - "@rollup/rollup-android-arm64": "4.8.0", - "@rollup/rollup-darwin-arm64": "4.8.0", - "@rollup/rollup-darwin-x64": "4.8.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", - "@rollup/rollup-linux-arm64-gnu": "4.8.0", - "@rollup/rollup-linux-arm64-musl": "4.8.0", - "@rollup/rollup-linux-riscv64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-musl": "4.8.0", - "@rollup/rollup-win32-arm64-msvc": "4.8.0", - "@rollup/rollup-win32-ia32-msvc": "4.8.0", - "@rollup/rollup-win32-x64-msvc": "4.8.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -8629,206 +4568,164 @@ } } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/vite-node": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.4.tgz", + "integrity": "sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" }, "bin": { - "node-which": "bin/node-which" + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" + "node": "^18.0.0 || >=20.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "node_modules/vite-plugin-tailwind-purgecss": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-tailwind-purgecss/-/vite-plugin-tailwind-purgecss-0.2.0.tgz", + "integrity": "sha512-6Q+SaalUd0t3BOIIiCQPlbZQuYARVgjoC78X+fLbQJqIEy/9fC58aQgHMgi+CmYfVfZmJToA8YiLueSGEo2mng==", "dev": true, "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" + "estree-walker": "^3.0.3", + "purgecss": "6.0.0-alpha.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "vite": "^4.1.1 || ^5.0.0" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/vitest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.4.tgz", + "integrity": "sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@vitest/expect": "1.0.4", + "@vitest/runner": "1.0.4", + "@vitest/snapshot": "1.0.4", + "@vitest/spy": "1.0.4", + "@vitest/utils": "1.0.4", + "acorn-walk": "^8.3.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^1.3.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.1", + "vite": "^5.0.0", + "vite-node": "1.0.4", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "url": "https://opencollective.com/vitest" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "^1.0.0", + "@vitest/ui": "^1.0.0", + "happy-dom": "*", + "jsdom": "*" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" + "bin": { + "node-which": "bin/node-which" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrappy": { @@ -8837,30 +4734,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/WebUI/package.json b/WebUI/package.json index 2970c138..d688ab29 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -18,19 +18,19 @@ "@playwright/test": "1.40.1", "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.28.0", + "@sveltejs/adapter-static": "^3.0.0", + "@sveltejs/kit": "2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.4", - "@typescript-eslint/eslint-plugin": "6.13.2", - "@typescript-eslint/parser": "6.13.2", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", "autoprefixer": "10.4.16", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", - "npm-check-updates": "16.14.11", "postcss": "8.4.32", "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", @@ -39,8 +39,8 @@ "tailwindcss": "3.3.6", "tslib": "2.6.2", "typescript": "5.3.3", - "vite": "^4.5.1", - "vite-plugin-tailwind-purgecss": "0.1.4", + "vite": "^5.0.10", + "vite-plugin-tailwind-purgecss": "^0.2.0", "vitest": "1.0.4" }, "type": "module", diff --git a/WebUI/svelte.config.js b/WebUI/svelte.config.js index 1cc7fe65..7a9af602 100644 --- a/WebUI/svelte.config.js +++ b/WebUI/svelte.config.js @@ -1,5 +1,5 @@ import adapter from '@sveltejs/adapter-static'; -import { vitePreprocess } from '@sveltejs/kit/vite'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { From c26491f815aa81dbafb4f51920ec3a2675a4ab4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 07:48:18 +0100 Subject: [PATCH 060/147] build(deps-dev): Bump the npm-dependencies group (#169) Bumps the npm-dependencies group in /WebUI with 3 updates: [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [eslint](https://github.com/eslint/eslint). Updates `@sveltejs/kit` from 2.0.0 to 2.0.2 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/master/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.0.2/packages/kit) Updates `@types/node` from 20.10.4 to 20.10.5 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `eslint` from 8.55.0 to 8.56.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.55.0...v8.56.0) --- updated-dependencies: - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- WebUI/package-lock.json | 32 ++++++++++++++++---------------- WebUI/package.json | 6 +++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 8cc76cb1..e317859a 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -15,15 +15,15 @@ "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "^3.0.0", - "@sveltejs/kit": "2.0.0", + "@sveltejs/kit": "2.0.2", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.4", + "@types/node": "20.10.5", "@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/parser": "6.14.0", "autoprefixer": "10.4.16", - "eslint": "8.55.0", + "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", @@ -474,9 +474,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -859,9 +859,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.0.tgz", - "integrity": "sha512-/GFxvit+q7PztRbgGTFXhVB6jvb0fZSeWuz5f4siQ2r/5BVhxYh7++Bw3/ZUjiOuyoZFiNBmOPcRNQbkzEce0g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.2.tgz", + "integrity": "sha512-xFpnLxVQ4KgCbj4Cj2zCFUcyfAoO87nn4nf3XcGJ7ZtOwy20tZ91vXWrtyuum8hakJWVwdNYyGXG9aBoIEYpFQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -974,9 +974,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1946,15 +1946,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/WebUI/package.json b/WebUI/package.json index d688ab29..81357e9e 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -19,15 +19,15 @@ "@skeletonlabs/skeleton": "2.6.0", "@skeletonlabs/tw-plugin": "0.3.0", "@sveltejs/adapter-static": "^3.0.0", - "@sveltejs/kit": "2.0.0", + "@sveltejs/kit": "2.0.2", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.4", + "@types/node": "20.10.5", "@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/parser": "6.14.0", "autoprefixer": "10.4.16", - "eslint": "8.55.0", + "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", From 3a6c5664d13676de969ec0053dd54729d8295eff Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 19 Dec 2023 14:20:43 +0100 Subject: [PATCH 061/147] Use more utlity methods for config parsing --- include/config/internal/utils.h | 29 ++++++--- src/config/BackendConfig.cpp | 27 +-------- src/config/CaptivePortalConfig.cpp | 14 +---- src/config/RFConfig.cpp | 18 +----- src/config/SerialInputConfig.cpp | 14 +---- src/config/WiFiConfig.cpp | 40 +------------ src/config/WiFiCredentials.cpp | 46 +-------------- src/config/internal/utils.cpp | 95 ++++++++++++++++++++++++++++++ 8 files changed, 132 insertions(+), 151 deletions(-) create mode 100644 src/config/internal/utils.cpp diff --git a/include/config/internal/utils.h b/include/config/internal/utils.h index 189cd46e..bc07890a 100644 --- a/include/config/internal/utils.h +++ b/include/config/internal/utils.h @@ -4,14 +4,16 @@ #include +#include +#include + namespace OpenShock::Config::Internal::Utils { - inline void FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr) { - if (fbsStr != nullptr) { - str = fbsStr->c_str(); - } else { - str = defaultStr; - } - } + void FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr); + void FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal); + void FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal); + void FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal); + void FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr); + template // T inherits from ConfigBase void FromFbsVec(std::vector& vec, const flatbuffers::Vector>* fbsVec) { vec.clear(); @@ -24,4 +26,17 @@ namespace OpenShock::Config::Internal::Utils { } } } + template // T inherits from ConfigBase + void FromJsonArray(std::vector& vec, const cJSON* jsonArray) { + vec.clear(); + if (jsonArray != nullptr) { + const cJSON* jsonItem = nullptr; + cJSON_ArrayForEach(jsonItem, jsonArray) { + T item; + if (item.FromJSON(jsonItem)) { + vec.push_back(std::move(item)); + } + } + } + } } // namespace OpenShock::Config::Internal::Utils diff --git a/src/config/BackendConfig.cpp b/src/config/BackendConfig.cpp index 90289305..cf6a5efc 100644 --- a/src/config/BackendConfig.cpp +++ b/src/config/BackendConfig.cpp @@ -41,31 +41,8 @@ bool BackendConfig::FromJSON(const cJSON* json) { return false; } - const cJSON* domainJson = cJSON_GetObjectItemCaseSensitive(json, "domain"); - if (domainJson == nullptr) { - ESP_LOGE(TAG, "domain is null"); - return false; - } - - if (cJSON_IsString(domainJson) == 0) { - ESP_LOGE(TAG, "domain is not a string"); - return false; - } - - domain = domainJson->valuestring; - - const cJSON* authTokenJson = cJSON_GetObjectItemCaseSensitive(json, "authToken"); - if (authTokenJson == nullptr) { - ESP_LOGE(TAG, "authToken is null"); - return false; - } - - if (cJSON_IsString(authTokenJson) == 0) { - ESP_LOGE(TAG, "authToken is not a string"); - return false; - } - - authToken = authTokenJson->valuestring; + Internal::Utils::FromJsonStr(domain, json, "domain", OPENSHOCK_API_DOMAIN); + Internal::Utils::FromJsonStr(authToken, json, "authToken", ""); return true; } diff --git a/src/config/CaptivePortalConfig.cpp b/src/config/CaptivePortalConfig.cpp index ecef6883..78173edf 100644 --- a/src/config/CaptivePortalConfig.cpp +++ b/src/config/CaptivePortalConfig.cpp @@ -1,5 +1,6 @@ #include "config/CaptivePortalConfig.h" +#include "config/internal/utils.h" #include "Logging.h" const char* const TAG = "Config::CaptivePortalConfig"; @@ -42,18 +43,7 @@ bool CaptivePortalConfig::FromJSON(const cJSON* json) { return false; } - const cJSON* alwaysEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "alwaysEnabled"); - if (alwaysEnabledJson == nullptr) { - ESP_LOGE(TAG, "alwaysEnabled is null"); - return false; - } - - if (cJSON_IsBool(alwaysEnabledJson) == 0) { - ESP_LOGE(TAG, "alwaysEnabled is not a bool"); - return false; - } - - alwaysEnabled = cJSON_IsTrue(alwaysEnabledJson); + Internal::Utils::FromJsonBool(alwaysEnabled, json, "alwaysEnabled", false); return true; } diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp index dc55c5dc..4bfff643 100644 --- a/src/config/RFConfig.cpp +++ b/src/config/RFConfig.cpp @@ -1,5 +1,6 @@ #include "config/RFConfig.h" +#include "config/internal/utils.h" #include "Constants.h" #include "Logging.h" @@ -43,21 +44,8 @@ bool RFConfig::FromJSON(const cJSON* json) { return false; } - const cJSON* txPinJson = cJSON_GetObjectItemCaseSensitive(json, "txPin"); - if (cJSON_IsNumber(txPinJson) == 0) { - ESP_LOGE(TAG, "value at 'txPin' is not a number"); - return false; - } - - txPin = txPinJson->valueint; - - const cJSON* keepAliveEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "keepAliveEnabled"); - if (cJSON_IsBool(keepAliveEnabledJson) == 0) { - ESP_LOGE(TAG, "value at 'keepAliveEnabled' is not a bool"); - return false; - } - - keepAliveEnabled = cJSON_IsTrue(keepAliveEnabledJson); + Internal::Utils::FromJsonU8(txPin, json, "txPin", OpenShock::Constants::GPIO_RF_TX); + Internal::Utils::FromJsonBool(keepAliveEnabled, json, "keepAliveEnabled", true); return true; } diff --git a/src/config/SerialInputConfig.cpp b/src/config/SerialInputConfig.cpp index ab898ae3..6410af82 100644 --- a/src/config/SerialInputConfig.cpp +++ b/src/config/SerialInputConfig.cpp @@ -1,5 +1,6 @@ #include "config/SerialInputConfig.h" +#include "config/internal/utils.h" #include "Logging.h" const char* const TAG = "Config::SerialInputConfig"; @@ -42,18 +43,7 @@ bool SerialInputConfig::FromJSON(const cJSON* json) { return false; } - const cJSON* echoEnabledJson = cJSON_GetObjectItemCaseSensitive(json, "echoEnabled"); - if (echoEnabledJson == nullptr) { - ESP_LOGE(TAG, "echoEnabled is null"); - return false; - } - - if (cJSON_IsBool(echoEnabledJson) == 0) { - ESP_LOGE(TAG, "echoEnabled is not a bool"); - return false; - } - - echoEnabled = cJSON_IsTrue(echoEnabledJson); + Internal::Utils::FromJsonBool(echoEnabled, json, "echoEnabled", true); return true; } diff --git a/src/config/WiFiConfig.cpp b/src/config/WiFiConfig.cpp index 14f20d66..7f82cdcb 100644 --- a/src/config/WiFiConfig.cpp +++ b/src/config/WiFiConfig.cpp @@ -50,31 +50,8 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - const cJSON* accessPointSSIDJson = cJSON_GetObjectItemCaseSensitive(json, "accessPointSSID"); - if (accessPointSSIDJson == nullptr) { - ESP_LOGE(TAG, "accessPointSSID is null"); - return false; - } - - if (cJSON_IsString(accessPointSSIDJson) == 0) { - ESP_LOGE(TAG, "accessPointSSID is not a string"); - return false; - } - - accessPointSSID = accessPointSSIDJson->valuestring; - - const cJSON* hostnameJson = cJSON_GetObjectItemCaseSensitive(json, "hostname"); - if (hostnameJson == nullptr) { - ESP_LOGE(TAG, "hostname is null"); - return false; - } - - if (cJSON_IsString(hostnameJson) == 0) { - ESP_LOGE(TAG, "hostname is not a string"); - return false; - } - - hostname = hostnameJson->valuestring; + Internal::Utils::FromJsonStr(accessPointSSID, json, "accessPointSSID", OPENSHOCK_FW_AP_PREFIX); + Internal::Utils::FromJsonStr(hostname, json, "hostname", OPENSHOCK_FW_HOSTNAME); const cJSON* credentialsListJson = cJSON_GetObjectItemCaseSensitive(json, "credentials"); if (credentialsListJson == nullptr) { @@ -87,18 +64,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return false; } - credentialsList.clear(); - - const cJSON* credentialsJson = nullptr; - cJSON_ArrayForEach(credentialsJson, credentialsListJson) { - WiFiCredentials wifiCredential; - if (!wifiCredential.FromJSON(credentialsJson)) { - ESP_LOGE(TAG, "Failed to parse WiFiCredential"); - return false; - } - - credentialsList.push_back(std::move(wifiCredential)); - } + Internal::Utils::FromJsonArray(credentialsList, credentialsListJson); return true; } diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp index 3e169550..11176289 100644 --- a/src/config/WiFiCredentials.cpp +++ b/src/config/WiFiCredentials.cpp @@ -46,49 +46,9 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { return false; } - const cJSON* idJson = cJSON_GetObjectItemCaseSensitive(json, "id"); - if (idJson == nullptr) { - ESP_LOGV(TAG, "id was null"); - id = 0; - } else { - if (cJSON_IsNumber(idJson) == 0) { - ESP_LOGE(TAG, "id is not a number"); - return false; - } - - if (idJson->valueint < 0 || idJson->valueint > UINT8_MAX) { - ESP_LOGE(TAG, "id is out of range"); - return false; - } - - id = idJson->valueint; - } - - const cJSON* ssidJson = cJSON_GetObjectItemCaseSensitive(json, "ssid"); - if (ssidJson == nullptr) { - ESP_LOGE(TAG, "ssid is null"); - return false; - } - - if (cJSON_IsString(ssidJson) == 0) { - ESP_LOGE(TAG, "ssid is not a string"); - return false; - } - - ssid = ssidJson->valuestring; - - const cJSON* passwordJson = cJSON_GetObjectItemCaseSensitive(json, "password"); - if (passwordJson == nullptr) { - ESP_LOGE(TAG, "password is null"); - return false; - } - - if (cJSON_IsString(passwordJson) == 0) { - ESP_LOGE(TAG, "password is not a string"); - return false; - } - - password = passwordJson->valuestring; + Internal::Utils::FromJsonU8(id, json, "id", 0); + Internal::Utils::FromJsonStr(ssid, json, "ssid", ""); + Internal::Utils::FromJsonStr(password, json, "password", ""); return true; } diff --git a/src/config/internal/utils.cpp b/src/config/internal/utils.cpp new file mode 100644 index 00000000..0f8e43ed --- /dev/null +++ b/src/config/internal/utils.cpp @@ -0,0 +1,95 @@ +#include "config/internal/utils.h" + +#include "Logging.h" + +const char* const TAG = "Config::Internal::Utils"; + +using namespace OpenShock; + +void Config::Internal::Utils::FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr) { + if (fbsStr != nullptr) { + str = fbsStr->c_str(); + } else { + str = defaultStr; + } +} + +void Config::Internal::Utils::FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal) { + const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); + if (jsonVal != nullptr) { + if (cJSON_IsBool(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a bool", name); + return; + } + val = cJSON_IsTrue(jsonVal); + } else { + val = defaultVal; + } +} + +void Config::Internal::Utils::FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal) { + const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); + if (jsonVal == nullptr) { + val = defaultVal; + return; + } + + if (cJSON_IsNumber(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a number", name); + return; + } + + int intVal = jsonVal->valueint; + + if (intVal < 0) { + ESP_LOGE(TAG, "value at '%s' is negative", name); + return; + } + + if (intVal > UINT8_MAX) { + ESP_LOGE(TAG, "value at '%s' is greater than UINT8_MAX", name); + return; + } + + val = static_cast(intVal); +} + +void Config::Internal::Utils::FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal) { + const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); + if (jsonVal == nullptr) { + val = defaultVal; + return; + } + + if (cJSON_IsNumber(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a number", name); + return; + } + + int intVal = jsonVal->valueint; + + if (intVal < 0) { + ESP_LOGE(TAG, "value at '%s' is negative", name); + return; + } + + if (intVal > UINT16_MAX) { + ESP_LOGE(TAG, "value at '%s' is greater than UINT16_MAX", name); + return; + } + + val = static_cast(intVal); +} + +void Config::Internal::Utils::FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr) { + const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); + if (jsonVal != nullptr) { + if (cJSON_IsString(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a string", name); + return; + } + str = jsonVal->valuestring; + } else { + str = defaultStr; + } +} From 0284e26979c76ea422e490a0a6e16fde6e92d19f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Dec 2023 06:20:30 +0000 Subject: [PATCH 062/147] build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 7 updates: | Package | From | To | | --- | --- | --- | | [@skeletonlabs/skeleton](https://github.com/skeletonlabs/skeleton) | `2.6.0` | `2.6.1` | | [@sveltejs/adapter-static](https://github.com/sveltejs/kit/tree/HEAD/packages/adapter-static) | `3.0.0` | `3.0.1` | | [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) | `2.0.2` | `2.0.6` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.14.0` | `6.15.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.14.0` | `6.15.0` | | [tailwindcss](https://github.com/tailwindlabs/tailwindcss) | `3.3.6` | `3.4.0` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `1.0.4` | `1.1.0` | Updates `@skeletonlabs/skeleton` from 2.6.0 to 2.6.1 - [Release notes](https://github.com/skeletonlabs/skeleton/releases) - [Commits](https://github.com/skeletonlabs/skeleton/compare/@skeletonlabs/skeleton@2.6.0...@skeletonlabs/skeleton@2.6.1) Updates `@sveltejs/adapter-static` from 3.0.0 to 3.0.1 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/main/packages/adapter-static/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/adapter-static@3.0.1/packages/adapter-static) Updates `@sveltejs/kit` from 2.0.2 to 2.0.6 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.0.6/packages/kit) Updates `@typescript-eslint/eslint-plugin` from 6.14.0 to 6.15.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.15.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.14.0 to 6.15.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.15.0/packages/parser) Updates `tailwindcss` from 3.3.6 to 3.4.0 - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/master/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v3.3.6...v3.4.0) Updates `vitest` from 1.0.4 to 1.1.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.0/packages/vitest) --- updated-dependencies: - dependency-name: "@skeletonlabs/skeleton" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@sveltejs/adapter-static" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: tailwindcss dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- WebUI/package-lock.json | 202 ++++++++++++++++++++-------------------- WebUI/package.json | 14 +-- 2 files changed, 108 insertions(+), 108 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index e317859a..b74e4442 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -12,16 +12,16 @@ }, "devDependencies": { "@playwright/test": "1.40.1", - "@skeletonlabs/skeleton": "2.6.0", + "@skeletonlabs/skeleton": "2.6.1", "@skeletonlabs/tw-plugin": "0.3.0", - "@sveltejs/adapter-static": "^3.0.0", - "@sveltejs/kit": "2.0.2", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/kit": "2.0.6", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.5", - "@typescript-eslint/eslint-plugin": "6.14.0", - "@typescript-eslint/parser": "6.14.0", + "@typescript-eslint/eslint-plugin": "6.15.0", + "@typescript-eslint/parser": "6.15.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -32,12 +32,12 @@ "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.3.6", + "tailwindcss": "3.4.0", "tslib": "2.6.2", "typescript": "5.3.3", "vite": "^5.0.10", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.0.4" + "vitest": "1.1.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -829,9 +829,9 @@ "dev": true }, "node_modules/@skeletonlabs/skeleton": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.6.0.tgz", - "integrity": "sha512-4+Fa7b5qGwKGTnQS5S3+XQQ8CQHfL6GIofPJc1ibhT/idi/4whotq0UAvgzdeAILFhvey5jlS9InqXDQFDXdyA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-2.6.1.tgz", + "integrity": "sha512-LDdgsnCgD+ZsI/82F7tHXmBXwd0Kx0WnQSSvgd94qgf2zZVeDMaKh2C6lEvgF0z31tvi83dyGnL7vM3IJlmWhg==", "dev": true, "dependencies": { "esm-env": "1.0.0" @@ -850,18 +850,18 @@ } }, "node_modules/@sveltejs/adapter-static": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.0.tgz", - "integrity": "sha512-nNsm8XChhJgQdeVegdXU+EnpznSUlsIjlLJa9SNmvSVN3rcPtB2BAnGuS/EWCtgPLkVcy9V2kW5knronqmF+KQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.1.tgz", + "integrity": "sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==", "dev": true, "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "node_modules/@sveltejs/kit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.2.tgz", - "integrity": "sha512-xFpnLxVQ4KgCbj4Cj2zCFUcyfAoO87nn4nf3XcGJ7ZtOwy20tZ91vXWrtyuum8hakJWVwdNYyGXG9aBoIEYpFQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.6.tgz", + "integrity": "sha512-dnHtyjBLGXx+hrZQ9GuqLlSfTBixewJaByUVWai7LmB4dgV3FwkK155OltEgONDQW6KW64hLNS/uojdx3uC2/g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -871,10 +871,10 @@ "esm-env": "^1.0.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", - "mrmime": "^1.0.1", + "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.3", + "sirv": "^2.0.4", "tiny-glob": "^0.2.9" }, "bin": { @@ -995,16 +995,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", + "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/type-utils": "6.14.0", - "@typescript-eslint/utils": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/type-utils": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1030,15 +1030,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", + "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4" }, "engines": { @@ -1058,13 +1058,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", + "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1075,13 +1075,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", + "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/utils": "6.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1102,9 +1102,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", + "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1115,13 +1115,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", + "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1142,17 +1142,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", "semver": "^7.5.4" }, "engines": { @@ -1167,12 +1167,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", + "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.15.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1190,13 +1190,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.4.tgz", - "integrity": "sha512-/NRN9N88qjg3dkhmFcCBwhn/Ie4h064pY3iv7WLRsDJW7dXnEgeoa8W9zy7gIPluhz6CkgqiB3HmpIXgmEY5dQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.0.tgz", + "integrity": "sha512-9IE2WWkcJo2BR9eqtY5MIo3TPmS50Pnwpm66A6neb2hvk/QSLfPXBz2qdiwUOQkwyFuuXEUj5380CbwfzW4+/w==", "dev": true, "dependencies": { - "@vitest/spy": "1.0.4", - "@vitest/utils": "1.0.4", + "@vitest/spy": "1.1.0", + "@vitest/utils": "1.1.0", "chai": "^4.3.10" }, "funding": { @@ -1204,12 +1204,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.4.tgz", - "integrity": "sha512-rhOQ9FZTEkV41JWXozFM8YgOqaG9zA7QXbhg5gy6mFOVqh4PcupirIJ+wN7QjeJt8S8nJRYuZH1OjJjsbxAXTQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.0.tgz", + "integrity": "sha512-zdNLJ00pm5z/uhbWF6aeIJCGMSyTyWImy3Fcp9piRGvueERFlQFbUwCpzVce79OLm2UHk9iwaMSOaU9jVHgNVw==", "dev": true, "dependencies": { - "@vitest/utils": "1.0.4", + "@vitest/utils": "1.1.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1245,9 +1245,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.4.tgz", - "integrity": "sha512-vkfXUrNyNRA/Gzsp2lpyJxh94vU2OHT1amoD6WuvUAA12n32xeVZQ0KjjQIf8F6u7bcq2A2k969fMVxEsxeKYA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.0.tgz", + "integrity": "sha512-5O/wyZg09V5qmNmAlUgCBqflvn2ylgsWJRRuPrnHEfDNT6tQpQ8O1isNGgo+VxofISHqz961SG3iVvt3SPK/QQ==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1259,9 +1259,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.4.tgz", - "integrity": "sha512-9ojTFRL1AJVh0hvfzAQpm0QS6xIS+1HFIw94kl/1ucTfGCaj1LV/iuJU4Y6cdR03EzPDygxTHwE1JOm+5RCcvA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.0.tgz", + "integrity": "sha512-sNOVSU/GE+7+P76qYo+VXdXhXffzWZcYIPQfmkiRxaNCSPiLANvQx5Mx6ZURJ/ndtEkUJEpvKLXqAYTKEY+lTg==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1271,9 +1271,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.4.tgz", - "integrity": "sha512-gsswWDXxtt0QvtK/y/LWukN7sGMYmnCcv1qv05CsY6cU/Y1zpGX1QuvLs+GO1inczpE6Owixeel3ShkjhYtGfA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-z+s510fKmYz4Y41XhNs3vcuFTFhcij2YF7F8VQfMEYAAUfqQh0Zfg7+w9xdgFGhPf3tX3TicAe+8BDITk6ampQ==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -2946,9 +2946,9 @@ } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, "engines": { "node": ">=10" @@ -3858,13 +3858,13 @@ } }, "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" }, "engines": { @@ -4202,9 +4202,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", + "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -4569,9 +4569,9 @@ } }, "node_modules/vite-node": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.4.tgz", - "integrity": "sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.0.tgz", + "integrity": "sha512-jV48DDUxGLEBdHCQvxL1mEh7+naVy+nhUUUaPAZLd3FJgXuxQiewHcfeZebbJ6onDqNGkP4r3MhQ342PRlG81Q==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -4632,16 +4632,16 @@ } }, "node_modules/vitest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.4.tgz", - "integrity": "sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.0.tgz", + "integrity": "sha512-oDFiCrw7dd3Jf06HoMtSRARivvyjHJaTxikFxuqJjO76U436PqlVw1uLn7a8OSPrhSfMGVaRakKpA2lePdw79A==", "dev": true, "dependencies": { - "@vitest/expect": "1.0.4", - "@vitest/runner": "1.0.4", - "@vitest/snapshot": "1.0.4", - "@vitest/spy": "1.0.4", - "@vitest/utils": "1.0.4", + "@vitest/expect": "1.1.0", + "@vitest/runner": "1.1.0", + "@vitest/snapshot": "1.1.0", + "@vitest/spy": "1.1.0", + "@vitest/utils": "1.1.0", "acorn-walk": "^8.3.0", "cac": "^6.7.14", "chai": "^4.3.10", @@ -4656,7 +4656,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.1", "vite": "^5.0.0", - "vite-node": "1.0.4", + "vite-node": "1.1.0", "why-is-node-running": "^2.2.2" }, "bin": { diff --git a/WebUI/package.json b/WebUI/package.json index 81357e9e..4cbfe403 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -16,16 +16,16 @@ }, "devDependencies": { "@playwright/test": "1.40.1", - "@skeletonlabs/skeleton": "2.6.0", + "@skeletonlabs/skeleton": "2.6.1", "@skeletonlabs/tw-plugin": "0.3.0", - "@sveltejs/adapter-static": "^3.0.0", - "@sveltejs/kit": "2.0.2", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/kit": "2.0.6", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.5", - "@typescript-eslint/eslint-plugin": "6.14.0", - "@typescript-eslint/parser": "6.14.0", + "@typescript-eslint/eslint-plugin": "6.15.0", + "@typescript-eslint/parser": "6.15.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -36,12 +36,12 @@ "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.3.6", + "tailwindcss": "3.4.0", "tslib": "2.6.2", "typescript": "5.3.3", "vite": "^5.0.10", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.0.4" + "vitest": "1.1.0" }, "type": "module", "dependencies": { From 8a86851ab7dec0d6a6813700c1ae01b83e79b28e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 06:20:20 +0000 Subject: [PATCH 063/147] build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /WebUI with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Updates `@types/node` from 20.10.5 to 20.10.6 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.15.0 to 6.16.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.16.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.15.0 to 6.16.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.16.0/packages/parser) Updates `vitest` from 1.1.0 to 1.1.1 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.1/packages/vitest) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- WebUI/package-lock.json | 183 +++++++++++++++++++++++----------------- WebUI/package.json | 8 +- 2 files changed, 108 insertions(+), 83 deletions(-) diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index b74e4442..19dc7874 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -19,9 +19,9 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.5", - "@typescript-eslint/eslint-plugin": "6.15.0", - "@typescript-eslint/parser": "6.15.0", + "@types/node": "20.10.6", + "@typescript-eslint/eslint-plugin": "6.16.0", + "@typescript-eslint/parser": "6.16.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -37,7 +37,7 @@ "typescript": "5.3.3", "vite": "^5.0.10", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.0" + "vitest": "1.1.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -974,9 +974,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -995,16 +995,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", - "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz", + "integrity": "sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/type-utils": "6.15.0", - "@typescript-eslint/utils": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/type-utils": "6.16.0", + "@typescript-eslint/utils": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1030,15 +1030,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", - "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4" }, "engines": { @@ -1058,13 +1058,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", - "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0" + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1075,13 +1075,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", - "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz", + "integrity": "sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/utils": "6.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1102,9 +1102,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", - "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1115,16 +1115,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", - "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -1141,18 +1142,42 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", - "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.16.0.tgz", + "integrity": "sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", "semver": "^7.5.4" }, "engines": { @@ -1167,12 +1192,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", - "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/types": "6.16.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1190,13 +1215,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.0.tgz", - "integrity": "sha512-9IE2WWkcJo2BR9eqtY5MIo3TPmS50Pnwpm66A6neb2hvk/QSLfPXBz2qdiwUOQkwyFuuXEUj5380CbwfzW4+/w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.1.tgz", + "integrity": "sha512-Qpw01C2Hyb3085jBkOJLQ7HRX0Ncnh2qV4p+xWmmhcIUlMykUF69zsnZ1vPmAjZpomw9+5tWEGOQ0GTfR8U+kA==", "dev": true, "dependencies": { - "@vitest/spy": "1.1.0", - "@vitest/utils": "1.1.0", + "@vitest/spy": "1.1.1", + "@vitest/utils": "1.1.1", "chai": "^4.3.10" }, "funding": { @@ -1204,12 +1229,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.0.tgz", - "integrity": "sha512-zdNLJ00pm5z/uhbWF6aeIJCGMSyTyWImy3Fcp9piRGvueERFlQFbUwCpzVce79OLm2UHk9iwaMSOaU9jVHgNVw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.1.tgz", + "integrity": "sha512-8HokyJo1SnSi3uPFKfWm/Oq1qDwLC4QDcVsqpXIXwsRPAg3gIDh8EbZ1ri8cmQkBxdOu62aOF9B4xcqJhvt4xQ==", "dev": true, "dependencies": { - "@vitest/utils": "1.1.0", + "@vitest/utils": "1.1.1", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1245,9 +1270,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.0.tgz", - "integrity": "sha512-5O/wyZg09V5qmNmAlUgCBqflvn2ylgsWJRRuPrnHEfDNT6tQpQ8O1isNGgo+VxofISHqz961SG3iVvt3SPK/QQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.1.tgz", + "integrity": "sha512-WnMHjv4VdHLbFGgCdVVvyRkRPnOKN75JJg+LLTdr6ah7YnL75W+7CTIMdzPEPzaDxA8r5yvSVlc1d8lH3yE28w==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1259,9 +1284,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.0.tgz", - "integrity": "sha512-sNOVSU/GE+7+P76qYo+VXdXhXffzWZcYIPQfmkiRxaNCSPiLANvQx5Mx6ZURJ/ndtEkUJEpvKLXqAYTKEY+lTg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.1.tgz", + "integrity": "sha512-hDU2KkOTfFp4WFFPWwHFauddwcKuGQ7gF6Un/ZZkCogoAiTMN7/7YKvUDbywPZZ754iCQGjdUmXN3t4k0jm1IQ==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1271,9 +1296,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-z+s510fKmYz4Y41XhNs3vcuFTFhcij2YF7F8VQfMEYAAUfqQh0Zfg7+w9xdgFGhPf3tX3TicAe+8BDITk6ampQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.1.tgz", + "integrity": "sha512-E9LedH093vST/JuBSyHLFMpxJKW3dLhe/flUSPFedoyj4wKiFX7Jm8gYLtOIiin59dgrssfmFv0BJ1u8P/LC/A==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -4569,9 +4594,9 @@ } }, "node_modules/vite-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.0.tgz", - "integrity": "sha512-jV48DDUxGLEBdHCQvxL1mEh7+naVy+nhUUUaPAZLd3FJgXuxQiewHcfeZebbJ6onDqNGkP4r3MhQ342PRlG81Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.1.tgz", + "integrity": "sha512-2bGE5w4jvym5v8llF6Gu1oBrmImoNSs4WmRVcavnG2me6+8UQntTqLiAMFyiAobp+ZXhj5ZFhI7SmLiFr/jrow==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -4632,16 +4657,16 @@ } }, "node_modules/vitest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.0.tgz", - "integrity": "sha512-oDFiCrw7dd3Jf06HoMtSRARivvyjHJaTxikFxuqJjO76U436PqlVw1uLn7a8OSPrhSfMGVaRakKpA2lePdw79A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.1.tgz", + "integrity": "sha512-Ry2qs4UOu/KjpXVfOCfQkTnwSXYGrqTbBZxw6reIYEFjSy1QUARRg5pxiI5BEXy+kBVntxUYNMlq4Co+2vD3fQ==", "dev": true, "dependencies": { - "@vitest/expect": "1.1.0", - "@vitest/runner": "1.1.0", - "@vitest/snapshot": "1.1.0", - "@vitest/spy": "1.1.0", - "@vitest/utils": "1.1.0", + "@vitest/expect": "1.1.1", + "@vitest/runner": "1.1.1", + "@vitest/snapshot": "1.1.1", + "@vitest/spy": "1.1.1", + "@vitest/utils": "1.1.1", "acorn-walk": "^8.3.0", "cac": "^6.7.14", "chai": "^4.3.10", @@ -4656,7 +4681,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.1", "vite": "^5.0.0", - "vite-node": "1.1.0", + "vite-node": "1.1.1", "why-is-node-running": "^2.2.2" }, "bin": { diff --git a/WebUI/package.json b/WebUI/package.json index 4cbfe403..a693c16e 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -23,9 +23,9 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.5", - "@typescript-eslint/eslint-plugin": "6.15.0", - "@typescript-eslint/parser": "6.15.0", + "@types/node": "20.10.6", + "@typescript-eslint/eslint-plugin": "6.16.0", + "@typescript-eslint/parser": "6.16.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -41,7 +41,7 @@ "typescript": "5.3.3", "vite": "^5.0.10", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.0" + "vitest": "1.1.1" }, "type": "module", "dependencies": { From 950fab10bb85cdca6908a84e10f37ed91f966bf2 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 12:16:08 +0100 Subject: [PATCH 064/147] Implement stringview (#172) This is just meant as a placeholder until we figure out how to get std::string_view working --- include/CaptivePortal.h | 13 +- include/CaptivePortalInstance.h | 5 +- include/StringView.h | 380 ++++++++++++++++++++++++++++++++ src/CaptivePortal.cpp | 8 +- 4 files changed, 391 insertions(+), 15 deletions(-) create mode 100644 include/StringView.h diff --git a/include/CaptivePortal.h b/include/CaptivePortal.h index 1803aeea..f22aee21 100644 --- a/include/CaptivePortal.h +++ b/include/CaptivePortal.h @@ -1,7 +1,8 @@ #pragma once +#include "StringView.h" + #include -#include namespace OpenShock::CaptivePortal { void SetAlwaysEnabled(bool alwaysEnabled); @@ -10,15 +11,9 @@ namespace OpenShock::CaptivePortal { bool IsRunning(); void Update(); - bool SendMessageTXT(std::uint8_t socketId, const char* data, std::size_t len); + bool SendMessageTXT(std::uint8_t socketId, StringView data); bool SendMessageBIN(std::uint8_t socketId, const std::uint8_t* data, std::size_t len); - inline bool SendMessageTXT(std::uint8_t socketId, const std::string& message) { - return SendMessageTXT(socketId, message.c_str(), message.length()); - } - bool BroadcastMessageTXT(const char* data, std::size_t len); + bool BroadcastMessageTXT(StringView data); bool BroadcastMessageBIN(const std::uint8_t* data, std::size_t len); - inline bool BroadcastMessageTXT(const std::string& message) { - return BroadcastMessageTXT(message.c_str(), message.length()); - } } // namespace OpenShock::CaptivePortal diff --git a/include/CaptivePortalInstance.h b/include/CaptivePortalInstance.h index 1e2b7aa9..5529a627 100644 --- a/include/CaptivePortalInstance.h +++ b/include/CaptivePortalInstance.h @@ -1,5 +1,6 @@ #pragma once +#include "StringView.h" #include "WebSocketDeFragger.h" #include @@ -17,9 +18,9 @@ namespace OpenShock { CaptivePortalInstance(); ~CaptivePortalInstance(); - bool sendMessageTXT(std::uint8_t socketId, const char* data, std::size_t len) { return m_socketServer.sendTXT(socketId, data, len); } + bool sendMessageTXT(std::uint8_t socketId, StringView data) { return m_socketServer.sendTXT(socketId, data.data(), data.length()); } bool sendMessageBIN(std::uint8_t socketId, const std::uint8_t* data, std::size_t len) { return m_socketServer.sendBIN(socketId, data, len); } - bool broadcastMessageTXT(const char* data, std::size_t len) { return m_socketServer.broadcastTXT(data, len); } + bool broadcastMessageTXT(StringView data) { return m_socketServer.broadcastTXT(data.data(), data.length()); } bool broadcastMessageBIN(const std::uint8_t* data, std::size_t len) { return m_socketServer.broadcastBIN(data, len); } private: diff --git a/include/StringView.h b/include/StringView.h new file mode 100644 index 00000000..048af223 --- /dev/null +++ b/include/StringView.h @@ -0,0 +1,380 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +namespace OpenShock { + struct StringView { + using value_type = char; + using const_iterator = const value_type*; + using const_reverse_iterator = std::reverse_iterator; + + static const std::size_t npos = std::numeric_limits::max(); + + static constexpr StringView Null() { return StringView(nullptr); } + static constexpr StringView Empty() { return StringView(""); } + + constexpr StringView(const char* const ptr) : _ptrBeg(ptr), _ptrEnd(_getStringEnd(ptr)) { } + constexpr StringView(const char* const ptr, std::size_t len) : _ptrBeg(ptr), _ptrEnd(ptr + len) { } + constexpr StringView(const char* const ptrBeg, const char* const ptrEnd) : _ptrBeg(ptrBeg), _ptrEnd(ptrEnd) { } + constexpr StringView(const StringView& str) : _ptrBeg(str._ptrBeg), _ptrEnd(str._ptrEnd) { } + StringView(const String& str) : _ptrBeg(str.c_str()), _ptrEnd(str.c_str() + str.length()) { } + StringView(const std::string& str) : _ptrBeg(str.c_str()), _ptrEnd(str.c_str() + str.size()) { } + + constexpr bool isNull() const { return _ptrBeg == nullptr || _ptrEnd == nullptr; } + + constexpr const char* data() const { return _ptrBeg; } + + constexpr const_iterator begin() const { return _ptrBeg; } + const_reverse_iterator rbegin() const { return std::make_reverse_iterator(end()); } + + constexpr const_iterator end() const { return _ptrEnd; } + const_reverse_iterator rend() const { return std::make_reverse_iterator(begin()); } + + constexpr std::size_t size() const { + if (isNull()) return 0; + + return _ptrEnd - _ptrBeg; + } + constexpr std::size_t length() const { return size(); } + + constexpr bool isNullOrEmpty() const { return size() == 0; } + + StringView substr(std::size_t pos, std::size_t count = StringView::npos) const { + if (isNullOrEmpty()) { + return *this; + } + + if (pos > size()) { + return Null(); + } + + if (count == StringView::npos) { + count = size() - pos; + } else if (pos + count > size()) { + return Null(); + } + + return StringView(_ptrBeg + pos, _ptrBeg + pos + count); + } + + std::size_t find(char needle, std::size_t pos = 0) const { + std::size_t _size = this->size(); + + for (std::size_t i = pos; i < _size; ++i) { + if (_ptrBeg[i] == needle) { + return i; + } + } + + return StringView::npos; + } + std::size_t find(StringView needle, std::size_t pos = 0) const { + if (isNullOrEmpty() || pos + needle.size() >= size()) { + return StringView::npos; + } + + const char* ptr = std::search(_ptrBeg + pos, _ptrEnd, needle._ptrBeg, needle._ptrEnd); + if (ptr == _ptrEnd) { + return StringView::npos; + } + + return ptr - _ptrBeg; + } + + std::size_t rfind(char needle, std::size_t pos = StringView::npos) const { + std::size_t _size = this->size(); + + if (pos == StringView::npos) { + pos = _size - 1; + } else if (pos >= _size) { + return StringView::npos; + } + + for (std::size_t i = pos; i > 0; --i) { + if (_ptrBeg[i] == needle) { + return i; + } + } + + return StringView::npos; + } + std::size_t rfind(StringView needle, std::size_t pos = StringView::npos) const { + if (isNullOrEmpty()) { + return StringView::npos; + } + + if (pos == StringView::npos) { + pos = size() - 1; + } else if (pos + needle.size() >= size()) { + return StringView::npos; + } + + const char* ptr = std::find_end(_ptrBeg, _ptrBeg + pos, needle._ptrBeg, needle._ptrEnd); + if (ptr == _ptrBeg + pos) { + return StringView::npos; + } + + return ptr - _ptrBeg; + } + + StringView beforeDelimiter(char delimiter) const { + std::size_t pos = find(delimiter); + if (pos != StringView::npos) { + return substr(0, pos); + } + + return *this; + } + StringView beforeDelimiter(StringView delimiter) const { + std::size_t pos = find(delimiter); + if (pos != StringView::npos) { + return substr(0, pos); + } + + return *this; + } + + StringView afterDelimiter(char delimiter) const { + std::size_t pos = find(delimiter); + if (pos != StringView::npos) { + return substr(pos + 1); + } + + return *this; + } + StringView afterDelimiter(StringView delimiter) const { + std::size_t pos = find(delimiter); + if (pos != StringView::npos) { + return substr(pos + delimiter.size()); + } + + return *this; + } + + std::vector split(char delimiter) const { + std::vector result; + + std::size_t pos = 0; + while (pos < size()) { + std::size_t nextPos = find(delimiter, pos); + if (nextPos == StringView::npos) { + nextPos = size(); + } + + result.push_back(substr(pos, nextPos - pos)); + pos = nextPos + 1; + } + + return result; + } + std::vector split(StringView delimiter) const { + std::vector result; + + std::size_t pos = 0; + while (pos < size()) { + std::size_t nextPos = find(delimiter, pos); + if (nextPos == StringView::npos) { + nextPos = size(); + } + + result.push_back(substr(pos, nextPos - pos)); + pos = nextPos + delimiter.size(); + } + + return result; + } + std::vector split(std::function predicate) const { + std::vector result; + + const char* start = nullptr; + for (const char* ptr = _ptrBeg; ptr < _ptrEnd; ++ptr) { + if (predicate(*ptr)) { + if (start != nullptr) { + result.push_back(StringView(start, ptr)); + start = nullptr; + } + } else if (start == nullptr) { + start = ptr; + } + } + + if (start != nullptr) { + result.push_back(StringView(start, _ptrEnd)); + } + + return result; + } + + std::vector splitLines() const { + return split([](char c) { return c == '\r' || c == '\n'; }); + } + std::vector splitWhitespace() const { return split(isspace); } + + constexpr bool startsWith(char needle) const { + if (isNull()) { + return false; + } + + return _ptrBeg[0] == needle; + } + constexpr bool startsWith(StringView needle) const { + if (isNull()) { + return false; + } + + return _strEquals(_ptrBeg, _ptrBeg + needle.size(), needle._ptrBeg, needle._ptrEnd); + } + + constexpr bool endsWith(char needle) const { + if (isNull()) { + return false; + } + + return _ptrEnd[-1] == needle; + } + constexpr bool endsWith(StringView needle) const { + if (isNull()) { + return false; + } + + return _strEquals(_ptrEnd - needle.size(), _ptrEnd, needle._ptrBeg, needle._ptrEnd); + } + + constexpr StringView& trimLeft() { + if (isNull()) { + return *this; + } + + while (_ptrBeg < _ptrEnd && isspace(*_ptrBeg)) { + ++_ptrBeg; + } + + return *this; + } + + constexpr StringView& trimRight() { + if (isNull()) { + return *this; + } + + while (_ptrBeg < _ptrEnd && isspace(_ptrEnd[-1])) { + --_ptrEnd; + } + + return *this; + } + + constexpr StringView& trim() { + trimLeft(); + trimRight(); + return *this; + } + + constexpr void clear() { + _ptrBeg = nullptr; + _ptrEnd = nullptr; + } + + String toArduinoString() const { + if (isNull()) { + return String(); + } + + return String(_ptrBeg, size()); + } + + std::string toString() const { + if (isNull()) { + return std::string(); + } + + return std::string(_ptrBeg, _ptrEnd); + } + + constexpr operator const char*() const { return _ptrBeg; } + + explicit operator String() const { return toArduinoString(); } + + explicit operator std::string() const { return toString(); } + + constexpr char operator[](std::size_t index) const { + if (isNull()) { + return '\0'; + } + + return _ptrBeg[index]; + } + + constexpr bool operator==(const StringView& other) { + if (this == &other) return true; + + return _strEquals(_ptrBeg, _ptrEnd, other._ptrBeg, other._ptrEnd); + } + constexpr bool operator!=(const StringView& other) { return !(*this == other); } + constexpr bool operator==(const char* const other) { return *this == StringView(other); } + constexpr bool operator!=(const char* const other) { return !(*this == other); } + + constexpr StringView& operator=(const char* const ptr) { + _ptrBeg = ptr; + _ptrEnd = _getStringEnd(ptr); + return *this; + } + constexpr StringView& operator=(const StringView& str) { + _ptrBeg = str._ptrBeg; + _ptrEnd = str._ptrEnd; + return *this; + } + StringView& operator=(const std::string& str) { + _ptrBeg = str.c_str(); + _ptrEnd = str.c_str() + str.size(); + return *this; + } + + private: + static constexpr bool _strEquals(const char* aStart, const char* aEnd, const char* bStart, const char* bEnd) { + if (aStart == bStart && aEnd == bEnd) { + return true; + } + if (aStart == nullptr || aEnd == nullptr || bStart == nullptr || bEnd == nullptr) { + return false; + } + + std::size_t aLen = aEnd - aStart; + std::size_t bLen = bEnd - bStart; + if (aLen != bLen) { + return false; + } + + while (aStart < aEnd) { + if (*aStart != *bStart) { + return false; + } + ++aStart; + ++bStart; + } + + return true; + } + static constexpr const char* _getStringEnd(const char* ptr) { + if (ptr == nullptr) { + return nullptr; + } + + while (*ptr != '\0') { + ++ptr; + } + + return ptr; + } + + const char* _ptrBeg; + const char* _ptrEnd; + }; +} // namespace OpenShock diff --git a/src/CaptivePortal.cpp b/src/CaptivePortal.cpp index ca5605a9..2ce4ad16 100644 --- a/src/CaptivePortal.cpp +++ b/src/CaptivePortal.cpp @@ -121,10 +121,10 @@ void CaptivePortal::Update() { } } -bool CaptivePortal::SendMessageTXT(std::uint8_t socketId, const char* data, std::size_t len) { +bool CaptivePortal::SendMessageTXT(std::uint8_t socketId, StringView data) { if (s_instance == nullptr) return false; - s_instance->sendMessageTXT(socketId, data, len); + s_instance->sendMessageTXT(socketId, data); return true; } @@ -136,10 +136,10 @@ bool CaptivePortal::SendMessageBIN(std::uint8_t socketId, const std::uint8_t* da return true; } -bool CaptivePortal::BroadcastMessageTXT(const char* data, std::size_t len) { +bool CaptivePortal::BroadcastMessageTXT(StringView data) { if (s_instance == nullptr) return false; - s_instance->broadcastMessageTXT(data, len); + s_instance->broadcastMessageTXT(data); return true; } From 12e339cad3940e92a1b7de79ff58e8e983b4eb1c Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 12:57:10 +0100 Subject: [PATCH 065/147] Remove nonstd/span dependency (#173) --- include/PinPatternManager.h | 9 ++++++--- include/RGBPatternManager.h | 13 ++++++++----- include/util/HexUtils.h | 18 ++++++++---------- platformio.ini | 1 - src/CaptivePortalInstance.cpp | 5 +---- src/PinPatternManager.cpp | 6 +++--- src/RGBPatternManager.cpp | 8 +++----- src/VisualStateManager.cpp | 3 ++- .../local/WiFiNetworkConnectCommand.cpp | 2 -- .../local/WiFiNetworkDisconnectCommand.cpp | 2 -- .../local/WiFiNetworkForgetCommand.cpp | 2 -- .../websocket/local/WiFiNetworkSaveCommand.cpp | 2 -- src/wifi/WiFiManager.cpp | 2 -- 13 files changed, 31 insertions(+), 42 deletions(-) diff --git a/include/PinPatternManager.h b/include/PinPatternManager.h index 6255e8fc..eee7edf6 100644 --- a/include/PinPatternManager.h +++ b/include/PinPatternManager.h @@ -1,11 +1,10 @@ #pragma once -#include - #include #include #include +#include #include namespace OpenShock { @@ -19,7 +18,11 @@ namespace OpenShock { std::uint32_t duration; }; - void SetPattern(nonstd::span pattern); + void SetPattern(const State* pattern, std::size_t patternLength); + template + inline void SetPattern(const State (&pattern)[N]) { + SetPattern(pattern, N); + } void ClearPattern(); private: diff --git a/include/RGBPatternManager.h b/include/RGBPatternManager.h index 5b2ad00e..94b696c0 100644 --- a/include/RGBPatternManager.h +++ b/include/RGBPatternManager.h @@ -1,13 +1,12 @@ #pragma once -#include - -#include - #include #include #include +#include + +#include #include namespace OpenShock { @@ -23,7 +22,11 @@ namespace OpenShock { std::uint32_t duration; }; - void SetPattern(nonstd::span pattern); + void SetPattern(const RGBState* pattern, std::size_t patternLength); + template + inline void SetPattern(const RGBState (&pattern)[N]) { + SetPattern(pattern, N); + } void SetBrightness(std::uint8_t brightness); void ClearPattern(); diff --git a/include/util/HexUtils.h b/include/util/HexUtils.h index ef4d7d0e..d5344abe 100644 --- a/include/util/HexUtils.h +++ b/include/util/HexUtils.h @@ -1,7 +1,5 @@ #pragma once -#include - #include #include #include @@ -23,10 +21,11 @@ namespace OpenShock::HexUtils { /// @param upper Whether to use uppercase hex characters. /// @remark To use this you must specify the size of the array in the template parameter. (e.g. ToHexMac<6>(...)) template - constexpr void ToHex(nonstd::span data, nonstd::span output, bool upper = true) noexcept { - for (std::size_t i = 0; i < data.size(); ++i) { + constexpr void ToHex(const std::uint8_t (&data)[N], char (&output)[(N * 2) + 1], bool upper = true) noexcept { + for (std::size_t i = 0; i < N; ++i) { ToHex(data[i], &output[i * 2], upper); } + output[N * 2] = '\0'; } /// @brief Converts a byte array to a hex string. @@ -35,10 +34,9 @@ namespace OpenShock::HexUtils { /// @return The hex string. /// @remark To use this you must specify the size of the array in the template parameter. (e.g. ToHexMac<6>(...)) template - constexpr std::array ToHex(nonstd::span data, bool upper = true) noexcept { + constexpr std::array ToHex(const std::uint8_t (&data)[N], bool upper = true) noexcept { std::array output {}; ToHex(data, output, upper); - output[N * 2] = '\0'; return output; } @@ -48,13 +46,14 @@ namespace OpenShock::HexUtils { /// @param upper Whether to use uppercase hex characters. /// @remark To use this you must specify the size of the array in the template parameter. (e.g. ToHexMac<6>(...)) template - constexpr void ToHexMac(nonstd::span data, nonstd::span output, bool upper = true) noexcept { + constexpr void ToHexMac(const std::uint8_t (&data)[N], std::array& output, bool upper = true) noexcept { const std::size_t Last = N - 1; for (std::size_t i = 0; i < Last; ++i) { ToHex(data[i], &output[i * 3], upper); output[i * 3 + 2] = ':'; } ToHex(data[Last], &output[Last * 3], upper); + output[(N * 3) - 1] = '\0'; } /// @brief Converts a byte array to a MAC address string. (hex pairs separated by colons) @@ -63,10 +62,9 @@ namespace OpenShock::HexUtils { /// @return The hex string in a MAC address format. /// @remark To use this you must specify the size of the array in the template parameter. (e.g. ToHexMac<6>(...)) template - constexpr std::array ToHexMac(nonstd::span data, bool upper = true) noexcept { + constexpr std::array ToHexMac(const std::uint8_t (&data)[N], bool upper = true) noexcept { std::array output {}; - ToHexMac(data, nonstd::span(output.data(), output.size() - 1), upper); - output[(N * 3) - 1] = '\0'; + ToHexMac(data, output, upper); return output; } diff --git a/platformio.ini b/platformio.ini index 1e343feb..6c876b1f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,7 +18,6 @@ build_unflags = -std=gnu++11 lib_deps = https://github.com/OpenShock/flatbuffers - https://github.com/martinmoene/span-lite https://github.com/OpenShock/ESPAsyncWebServer https://github.com/Links2004/arduinoWebSockets custom_openshock.flash_size = 4MB; Can be overridden per board diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 07836bad..6b1aab17 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -69,10 +69,7 @@ bool _tryGetPartitionHash(char (&buffer)[65]) { } // Copy the hash to the output buffer - HexUtils::ToHex<32>(staticSha256, nonstd::span(buffer, 64), false); - - // Null-terminate the string - buffer[64] = '\0'; + HexUtils::ToHex<32>(staticSha256, buffer, false); return true; } diff --git a/src/PinPatternManager.cpp b/src/PinPatternManager.cpp index c43323c8..fab848cd 100644 --- a/src/PinPatternManager.cpp +++ b/src/PinPatternManager.cpp @@ -18,13 +18,13 @@ PinPatternManager::~PinPatternManager() { vSemaphoreDelete(m_taskMutex); } -void PinPatternManager::SetPattern(nonstd::span pattern) { +void PinPatternManager::SetPattern(const State* pattern, std::size_t patternLength) { ClearPatternInternal(); // Set new values - m_patternLength = pattern.size(); + m_patternLength = patternLength; m_pattern = new State[m_patternLength]; - std::copy(pattern.begin(), pattern.end(), m_pattern); + std::copy(pattern, pattern + m_patternLength, m_pattern); char name[32]; snprintf(name, sizeof(name), "PinPatternManager-%u", m_gpioPin); diff --git a/src/RGBPatternManager.cpp b/src/RGBPatternManager.cpp index 071c6cc8..3e9e5d93 100644 --- a/src/RGBPatternManager.cpp +++ b/src/RGBPatternManager.cpp @@ -3,8 +3,6 @@ #include "Logging.h" #include "util/TaskUtils.h" -#include - const char* const TAG = "RGBPatternManager"; using namespace OpenShock; @@ -31,13 +29,13 @@ RGBPatternManager::~RGBPatternManager() { vSemaphoreDelete(m_taskMutex); } -void RGBPatternManager::SetPattern(nonstd::span pattern) { +void RGBPatternManager::SetPattern(const RGBState* pattern, std::size_t patternLength) { ClearPatternInternal(); // Set new values - m_patternLength = pattern.size(); + m_patternLength = patternLength; m_pattern = new RGBState[m_patternLength]; - std::copy(pattern.begin(), pattern.end(), m_pattern); + std::copy(pattern, pattern + m_patternLength, m_pattern); // Start the task BaseType_t result = TaskUtils::TaskCreateExpensive(RunPattern, TAG, 4096, this, 1, &m_taskHandle); diff --git a/src/VisualStateManager.cpp b/src/VisualStateManager.cpp index a308f70f..d72cc245 100644 --- a/src/VisualStateManager.cpp +++ b/src/VisualStateManager.cpp @@ -118,7 +118,8 @@ constexpr PinPatternManager::State kSolidOffPattern[] = { PinPatternManager s_builtInLedManager(OPENSHOCK_LED_GPIO); -void _updateVisualStateGPIO(nonstd::span override) { +template +inline void _updateVisualStateGPIO(const PinPatternManager::State (&override)[N]) { s_builtInLedManager.SetPattern(override); } diff --git a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp index e477eacd..445098c9 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkConnectCommand.cpp @@ -4,8 +4,6 @@ #include "util/HexUtils.h" #include "wifi/WiFiManager.h" -#include - #include const char* const TAG = "LocalMessageHandlers"; diff --git a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp index 6a0d9a5f..dfc6e913 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkDisconnectCommand.cpp @@ -4,8 +4,6 @@ #include "util/HexUtils.h" #include "wifi/WiFiManager.h" -#include - #include const char* const TAG = "LocalMessageHandlers"; diff --git a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp index 798a4efa..6514893e 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkForgetCommand.cpp @@ -4,8 +4,6 @@ #include "util/HexUtils.h" #include "wifi/WiFiManager.h" -#include - #include const char* const TAG = "LocalMessageHandlers"; diff --git a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp index c417a14f..3a254cee 100644 --- a/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp +++ b/src/event_handlers/websocket/local/WiFiNetworkSaveCommand.cpp @@ -4,8 +4,6 @@ #include "util/HexUtils.h" #include "wifi/WiFiManager.h" -#include - #include const char* const TAG = "LocalMessageHandlers"; diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 3fbfb1f6..b086641c 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -10,8 +10,6 @@ #include "wifi/WiFiNetwork.h" #include "wifi/WiFiScanManager.h" -#include - #include #include From bf38bb7892620ccfe6e03f4dae77afd149e52115 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 13:08:42 +0100 Subject: [PATCH 066/147] Implement http streaming (#174) This is needed for the upcoming OTA feature in #92 --- include/http/HTTPRequestManager.h | 15 +- src/http/HTTPRequestManager.cpp | 469 ++++++++++++++++++++++++------ 2 files changed, 387 insertions(+), 97 deletions(-) diff --git a/include/http/HTTPRequestManager.h b/include/http/HTTPRequestManager.h index 90fe9380..5ac1700e 100644 --- a/include/http/HTTPRequestManager.h +++ b/include/http/HTTPRequestManager.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "StringView.h" #include @@ -12,9 +12,11 @@ namespace OpenShock::HTTP { enum class RequestResult : std::uint8_t { InvalidURL, // Invalid URL RequestFailed, // Failed to start request + TimedOut, // Request timed out RateLimited, // Rate limited (can be both local and global) CodeRejected, // Request completed, but response code was not OK ParseFailed, // Request completed, but JSON parsing failed + Cancelled, // Request was cancelled Success, // Request completed successfully }; @@ -26,13 +28,16 @@ namespace OpenShock::HTTP { }; template - using JsonParser = std::function; + using JsonParser = std::function; + using GotContentLengthCallback = std::function; + using DownloadCallback = std::function; - Response GetString(const char* const url, const std::map& headers, const std::vector& acceptedCodes = {200}); + Response Download(StringView url, const std::map& headers, GotContentLengthCallback contentLengthCallback, DownloadCallback downloadCallback, const std::vector& acceptedCodes = {200}, std::uint32_t timeoutMs = 10'000); + Response GetString(StringView url, const std::map& headers, const std::vector& acceptedCodes = {200}, std::uint32_t timeoutMs = 10'000); template - Response GetJSON(const char* const url, const std::map& headers, JsonParser jsonParser, const std::vector& acceptedCodes = {200}) { - auto response = GetString(url, headers, acceptedCodes); + Response GetJSON(StringView url, const std::map& headers, JsonParser jsonParser, const std::vector& acceptedCodes = {200}, std::uint32_t timeoutMs = 10'000) { + auto response = GetString(url, headers, acceptedCodes, timeoutMs); if (response.result != RequestResult::Success) { return {response.result, response.code, {}}; } diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index e23cd95c..93220db9 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -5,25 +5,25 @@ #include #include +#include #include #include -#include +#include + +constexpr std::size_t HTTP_BUFFER_SIZE = 4096LLU; +constexpr int HTTP_DOWNLOAD_SIZE_LIMIT = 200 * 1024 * 1024; // 200 MB const char* const TAG = "HTTPRequestManager"; const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (Espressif; " OPENSHOCK_FW_CHIP "; " OPENSHOCK_FW_BOARD ") " OPENSHOCK_FW_COMMIT; struct RateLimit { - RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() {} + RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() { } void addLimit(std::uint32_t durationMs, std::uint16_t count) { // Insert sorted - m_limits.insert(std::upper_bound(m_limits.begin(), m_limits.end(), durationMs, [](std::int64_t durationMs, const Limit& limit) { - return durationMs > limit.durationMs; - }), {durationMs, count}); - } - void clearLimits() { - m_limits.clear(); + m_limits.insert(std::upper_bound(m_limits.begin(), m_limits.end(), durationMs, [](std::int64_t durationMs, const Limit& limit) { return durationMs > limit.durationMs; }), {durationMs, count}); } + void clearLimits() { m_limits.clear(); } bool tryRequest() { std::int64_t now = OpenShock::millis(); @@ -39,12 +39,11 @@ struct RateLimit { } // Check if we've exceeded any limits - for (auto& limit : m_limits) { - if (m_requests.size() >= limit.count) { - m_blockUntilMs = now + limit.durationMs; - ESP_LOGW(TAG, "Rate limited for %lld milliseconds", limit.durationMs); - return false; - } + auto it = std::find_if(m_limits.begin(), m_limits.end(), [this](const RateLimit::Limit& limit) { return m_requests.size() >= limit.count; }); + if (it != m_limits.end()) { + m_blockUntilMs = now + it->durationMs; + ESP_LOGW(TAG, "Rate limited for %lld milliseconds", it->durationMs); + return false; } // Add the request @@ -52,19 +51,14 @@ struct RateLimit { return true; } - void clearRequests() { - m_requests.clear(); - } + void clearRequests() { m_requests.clear(); } - void blockUntil(std::int64_t blockUntilMs) { - m_blockUntilMs = blockUntilMs; - } + void blockUntil(std::int64_t blockUntilMs) { m_blockUntilMs = blockUntilMs; } std::uint32_t requestsSince(std::int64_t sinceMs) { - return std::count_if(m_requests.begin(), m_requests.end(), [sinceMs](std::int64_t requestMs) { - return requestMs >= sinceMs; - }); + return std::count_if(m_requests.begin(), m_requests.end(), [sinceMs](std::int64_t requestMs) { return requestMs >= sinceMs; }); } + private: struct Limit { std::int64_t durationMs; @@ -80,106 +74,336 @@ std::unordered_map> s_rateLimits; using namespace OpenShock; -const char* _strfind(const char* haystack, const char* haystackEnd, const char* needle, std::size_t needleLen) { - const char* needleEnd = needle + needleLen; - const char* result = std::search(haystack, haystackEnd, needle, needleEnd); - if (result == haystackEnd) { +StringView _getDomain(StringView url) { + if (url.isNullOrEmpty()) { + return StringView::Null(); + } + + // Remove the protocol, port, and path eg. "https://api.example.com:443/path" -> "api.example.com" + url = url.afterDelimiter("://").beforeDelimiter('/').beforeDelimiter(':'); + + // Remove all subdomains eg. "api.example.com" -> "example.com" + auto domainSep = url.rfind('.'); + if (domainSep == StringView::npos) { + return url; // E.g. "localhost" + } + domainSep = url.rfind('.', domainSep - 1); + if (domainSep != StringView::npos) { + url = url.substr(domainSep + 1); + } + + return url; +} + +std::shared_ptr _rateLimitFactory(StringView domain) { + auto rateLimit = std::make_shared(); + + // Add default limits + rateLimit->addLimit(1000, 5); // 5 per second + rateLimit->addLimit(10 * 1000, 10); // 10 per 10 seconds + + // per-domain limits + if (domain == OPENSHOCK_API_DOMAIN) { + rateLimit->addLimit(60 * 1000, 12); // 12 per minute + rateLimit->addLimit(60 * 60 * 1000, 120); // 120 per hour + } + + return rateLimit; +} + +std::shared_ptr _getRateLimiter(StringView url) { + auto domain = _getDomain(url).toString(); + if (domain.empty()) { return nullptr; } - return result; + ESP_LOGI(TAG, "Getting rate limiter for domain: %s", domain.c_str()); + + auto it = s_rateLimits.find(domain); + if (it == s_rateLimits.end()) { + s_rateLimits.emplace(domain, _rateLimitFactory(domain)); + it = s_rateLimits.find(domain); + } + + return it->second; } -bool _getDomain(const char* url, char (&domain)[256]) { - if (url == nullptr) { - memset(domain, 0, 256); - return false; +void _setupClient(HTTPClient& client) { + client.setUserAgent(OPENSHOCK_FW_USERAGENT); +} + +struct StreamReaderResult { + HTTP::RequestResult result; + std::size_t nWritten; +}; + +constexpr bool _isCRLF(const uint8_t* buffer) { + return buffer[0] == '\r' && buffer[1] == '\n'; +} +constexpr bool _tryFindCRLF(std::size_t& pos, const uint8_t* buffer, std::size_t len) { + const std::uint8_t* cur = buffer; + const std::uint8_t* end = buffer + len - 1; + + while (cur < end) { + if (_isCRLF(cur)) { + pos = static_cast(cur - buffer); + return true; + } + + ++cur; } - std::size_t urlLen = strlen(url); - if (urlLen == 0) { - memset(domain, 0, 256); + return false; +} +constexpr bool _tryParseHexSizeT(std::size_t& result, StringView str) { + if (str.isNullOrEmpty() || str.size() > sizeof(std::size_t) * 2) { return false; } - const char* urlEnd = url + strlen(url); + result = 0; - const char* ptr; + for (char c : str) { + if (c >= '0' && c <= '9') { + result = (result << 4) | (c - '0'); + } else if (c >= 'a' && c <= 'f') { + result = (result << 4) | (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + result = (result << 4) | (c - 'A' + 10); + } else { + return false; + } + } - // Get the beginning of the domain (after the protocol) eg. "https://api.example.com/path" -> "api.example.com/path" - ptr = _strfind(url, urlEnd, "://", 3); - if (ptr != nullptr) { - url = ptr + 3; + return true; +} + +enum ParserState : std::uint8_t { + Ok, + NeedMoreData, + Invalid, +}; + +ParserState _parseChunkHeader(const std::uint8_t* buffer, std::size_t bufferLen, std::size_t& headerLen, std::size_t& payloadLen) { + if (bufferLen < 5) { // Bare minimum: "0\r\n\r\n" + return ParserState::NeedMoreData; } - // Get the end of the domain (before the first colon or slash) eg. "api.example.com/path" -> "api.example.com" or "api.example.com:8080/path" -> "api.example.com" - ptr = std::find_if(url, urlEnd, [](char c) { return c == ':' || c == '/'; }); - if (ptr != urlEnd) { - urlEnd = ptr; + // Find the first CRLF + if (!_tryFindCRLF(headerLen, buffer, bufferLen)) { + return ParserState::NeedMoreData; } - // Reverse trough url, get domain seperator, then store subdomain seperator in ptr - bool foundDomSep = false; - for (ptr = urlEnd - 1; ptr != url; ptr--) { - if (*ptr == '.') { - if (foundDomSep) { - url = ptr + 1; - break; - } - foundDomSep = true; + // Header must have at least one character + if (headerLen == 0) { + ESP_LOGW(TAG, "Invalid chunk header length"); + return ParserState::Invalid; + } + + // Check for end of size field (possibly followed by extensions which is separated by a semicolon) + std::size_t sizeFieldEnd = headerLen; + for (std::size_t i = 0; i < headerLen; ++i) { + if (buffer[i] == ';') { + sizeFieldEnd = i; + break; } } - if (!foundDomSep) { - return false; + + // Bounds check + if (sizeFieldEnd == 0 || sizeFieldEnd > 16) { + ESP_LOGW(TAG, "Invalid chunk size field length"); + return ParserState::Invalid; } - // Copy the domain into the buffer, and set the null terminator - memcpy(domain, url, urlEnd - url); - domain[urlEnd - url] = '\0'; + StringView sizeField(reinterpret_cast(buffer), sizeFieldEnd); - return true; + // Parse the chunk size + if (!_tryParseHexSizeT(payloadLen, sizeField)) { + ESP_LOGW(TAG, "Failed to parse chunk size"); + return ParserState::Invalid; + } + + if (payloadLen > HTTP_DOWNLOAD_SIZE_LIMIT) { + ESP_LOGW(TAG, "Chunk size too large"); + return ParserState::Invalid; + } + + // Set the header length to the end of the CRLF + headerLen += 2; + + return ParserState::Ok; } -std::shared_ptr _rateLimitFactory(const char (&domain)[256]) { - auto rateLimit = std::make_shared(); +ParserState _parseChunk(const std::uint8_t* buffer, std::size_t bufferLen, std::size_t& payloadPos, std::size_t& payloadLen) { + if (payloadPos == 0) { + ParserState state = _parseChunkHeader(buffer, bufferLen, payloadPos, payloadLen); + if (state != ParserState::Ok) { + return state; + } + } - // Add default limits - rateLimit->addLimit(1000, 5); // 5 per second - rateLimit->addLimit(10 * 1000, 10); // 10 per 10 seconds + std::size_t totalLen = payloadPos + payloadLen + 2; // +2 for CRLF + if (bufferLen < totalLen) { + return ParserState::NeedMoreData; + } - // per-domain limits - if (strcmp(domain, OPENSHOCK_API_DOMAIN) == 0) { - rateLimit->addLimit(60 * 1000, 12); // 12 per minute - rateLimit->addLimit(60 * 60 * 1000, 120); // 120 per hour + // Check for CRLF + if (!_isCRLF(buffer + totalLen - 2)) { + ESP_LOGW(TAG, "Invalid chunk payload CRLF"); + return ParserState::Invalid; } - return rateLimit; + return ParserState::Ok; } -std::shared_ptr _getRateLimiter(const char* url) { - char domain[256]; - if (!_getDomain(url, domain)) { - return nullptr; +void _alignChunk(std::uint8_t* buffer, std::size_t& bufferCursor, std::size_t payloadPos, std::size_t payloadLen) { + std::size_t totalLen = payloadPos + payloadLen + 2; // +2 for CRLF + std::size_t remaining = bufferCursor - totalLen; + if (remaining > 0) { + memmove(buffer, buffer + totalLen, remaining); + bufferCursor = remaining; + } else { + bufferCursor = 0; } +} - ESP_LOGI(TAG, "Getting rate limiter for domain: %s", domain); +StreamReaderResult _readStreamDataChunked(HTTPClient& client, WiFiClient* stream, HTTP::DownloadCallback downloadCallback, std::int64_t begin, std::uint32_t timeoutMs) { + std::size_t totalWritten = 0; + HTTP::RequestResult result = HTTP::RequestResult::Success; - auto it = s_rateLimits.find(domain); - if (it == s_rateLimits.end()) { - s_rateLimits.emplace(domain, _rateLimitFactory(domain)); - it = s_rateLimits.find(domain); + std::uint8_t* buffer = static_cast(malloc(HTTP_BUFFER_SIZE)); + if (buffer == nullptr) { + ESP_LOGE(TAG, "Out of memory"); + return {HTTP::RequestResult::RequestFailed, 0}; } - return it->second; + ParserState state = ParserState::NeedMoreData; + std::size_t bufferCursor = 0, payloadPos = 0, payloadSize = 0; + + while (client.connected() && state != ParserState::Invalid) { + if (begin + timeoutMs < OpenShock::millis()) { + ESP_LOGW(TAG, "Request timed out"); + result = HTTP::RequestResult::TimedOut; + break; + } + + std::size_t bytesAvailable = stream->available(); + if (bytesAvailable == 0) { + vTaskDelay(pdMS_TO_TICKS(5)); + continue; + } + + std::size_t bytesRead = stream->readBytes(buffer + bufferCursor, HTTP_BUFFER_SIZE - bufferCursor); + if (bytesRead == 0) { + ESP_LOGW(TAG, "No bytes read"); + result = HTTP::RequestResult::RequestFailed; + break; + } + + bufferCursor += bytesRead; + +parseMore: + state = _parseChunk(buffer, bufferCursor, payloadPos, payloadSize); + if (state == ParserState::Invalid) { + ESP_LOGE(TAG, "Failed to parse chunk"); + result = HTTP::RequestResult::RequestFailed; + break; + } + ESP_LOGD(TAG, "Chunk parsed: %zu %zu", payloadPos, payloadSize); + + if (state == ParserState::NeedMoreData) { + if (bufferCursor == HTTP_BUFFER_SIZE) { + ESP_LOGE(TAG, "Chunk too large"); + result = HTTP::RequestResult::RequestFailed; + break; + } + continue; + } + + // Check for zero chunk size (end of transfer) + if (payloadSize == 0) { + break; + } + + if (!downloadCallback(totalWritten, buffer + payloadPos, payloadSize)) { + result = HTTP::RequestResult::Cancelled; + break; + } + + totalWritten += payloadSize; + _alignChunk(buffer, bufferCursor, payloadPos, payloadSize); + payloadSize = 0; + payloadPos = 0; + + if (bufferCursor > 0) { + goto parseMore; + } + + vTaskDelay(pdMS_TO_TICKS(5)); + } + + free(buffer); + + return {result, totalWritten}; } -void _setupClient(HTTPClient& client) { - client.setUserAgent(OPENSHOCK_FW_USERAGENT); +StreamReaderResult _readStreamData(HTTPClient& client, WiFiClient* stream, std::size_t contentLength, HTTP::DownloadCallback downloadCallback, std::int64_t begin, std::uint32_t timeoutMs) { + std::size_t nWritten = 0; + HTTP::RequestResult result = HTTP::RequestResult::Success; + + std::uint8_t* buffer = static_cast(malloc(HTTP_BUFFER_SIZE)); + + while (client.connected() && nWritten < contentLength) { + if (begin + timeoutMs < OpenShock::millis()) { + ESP_LOGW(TAG, "Request timed out"); + result = HTTP::RequestResult::TimedOut; + break; + } + + std::size_t bytesAvailable = stream->available(); + if (bytesAvailable == 0) { + vTaskDelay(pdMS_TO_TICKS(5)); + continue; + } + + std::size_t bytesToRead = std::min(bytesAvailable, HTTP_BUFFER_SIZE); + + std::size_t bytesRead = stream->readBytes(buffer, bytesToRead); + if (bytesRead == 0) { + ESP_LOGW(TAG, "No bytes read"); + result = HTTP::RequestResult::RequestFailed; + break; + } + + if (!downloadCallback(nWritten, buffer, bytesRead)) { + ESP_LOGW(TAG, "Request cancelled by callback"); + result = HTTP::RequestResult::Cancelled; + break; + } + + nWritten += bytesRead; + + vTaskDelay(pdMS_TO_TICKS(10)); + } + + free(buffer); + + return {result, nWritten}; } -HTTP::Response _doGet(HTTPClient& client, const char* url, const std::map& headers, std::shared_ptr rateLimiter) { - if (!client.begin(url)) { + +HTTP::Response _doGetStream( + HTTPClient& client, + StringView url, + const std::map& headers, + const std::vector& acceptedCodes, + std::shared_ptr rateLimiter, + HTTP::GotContentLengthCallback contentLengthCallback, + HTTP::DownloadCallback downloadCallback, + std::uint32_t timeoutMs +) { + std::int64_t begin = OpenShock::millis(); + if (!client.begin(url.toArduinoString())) { ESP_LOGE(TAG, "Failed to begin HTTP request"); - return {HTTP::RequestResult::RequestFailed, 0, ""}; + return {HTTP::RequestResult::RequestFailed, 0}; } for (auto& header : headers) { @@ -188,6 +412,11 @@ HTTP::Response _doGet(HTTPClient& client, const char* url, const std::ma int responseCode = client.GET(); + if (responseCode == HTTP_CODE_REQUEST_TIMEOUT || begin + timeoutMs < OpenShock::millis()) { + ESP_LOGW(TAG, "Request timed out"); + return {HTTP::RequestResult::TimedOut, responseCode, 0}; + } + if (responseCode == HTTP_CODE_TOO_MANY_REQUESTS) { // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After @@ -211,38 +440,94 @@ HTTP::Response _doGet(HTTPClient& client, const char* url, const std::ma // Apply the block-until time rateLimiter->blockUntil(blockUntilMs); - return {HTTP::RequestResult::RateLimited, responseCode, ""}; + return {HTTP::RequestResult::RateLimited, responseCode, 0}; } if (responseCode == 418) { ESP_LOGW(TAG, "The server refused to brew coffee because it is, permanently, a teapot."); } - return {HTTP::RequestResult::Success, responseCode, client.getString()}; + if (std::find(acceptedCodes.begin(), acceptedCodes.end(), responseCode) == acceptedCodes.end()) { + ESP_LOGE(TAG, "Received unexpected response code %d", responseCode); + return {HTTP::RequestResult::CodeRejected, responseCode, 0}; + } + + int contentLength = client.getSize(); + if (contentLength == 0) { + return {HTTP::RequestResult::Success, responseCode, 0}; + } + + if (contentLength > 0) { + if (contentLength > HTTP_DOWNLOAD_SIZE_LIMIT) { + ESP_LOGE(TAG, "Content-Length too large"); + return {HTTP::RequestResult::RequestFailed, responseCode, 0}; + } + + if (!contentLengthCallback(contentLength)) { + ESP_LOGW(TAG, "Request cancelled by callback"); + return {HTTP::RequestResult::Cancelled, responseCode, 0}; + } + } + + WiFiClient* stream = client.getStreamPtr(); + if (stream == nullptr) { + ESP_LOGE(TAG, "Failed to get stream"); + return {HTTP::RequestResult::RequestFailed, 0}; + } + + StreamReaderResult result; + if (contentLength > 0) { + result = _readStreamData(client, stream, contentLength, downloadCallback, begin, timeoutMs); + } else { + result = _readStreamDataChunked(client, stream, downloadCallback, begin, timeoutMs); + } + + return {result.result, responseCode, result.nWritten}; } -HTTP::Response HTTP::GetString(const char* url, const std::map& headers, const std::vector& acceptedCodes) { +HTTP::Response + HTTP::Download(StringView url, const std::map& headers, HTTP::GotContentLengthCallback contentLengthCallback, HTTP::DownloadCallback downloadCallback, const std::vector& acceptedCodes, std::uint32_t timeoutMs) { std::shared_ptr rateLimiter = _getRateLimiter(url); if (rateLimiter == nullptr) { - return {RequestResult::InvalidURL, 0, ""}; + return {RequestResult::InvalidURL, 0, 0}; } if (!rateLimiter->tryRequest()) { - return {RequestResult::RateLimited, 0, ""}; + return {RequestResult::RateLimited, 0, 0}; } HTTPClient client; _setupClient(client); - auto response = _doGet(client, url, headers, rateLimiter); + auto response = _doGetStream(client, url, headers, acceptedCodes, rateLimiter, contentLengthCallback, downloadCallback, timeoutMs); if (response.result != RequestResult::Success) { return response; } if (std::find(acceptedCodes.begin(), acceptedCodes.end(), response.code) == acceptedCodes.end()) { ESP_LOGE(TAG, "Received unexpected response code %d", response.code); - return {RequestResult::CodeRejected, response.code, ""}; + return {RequestResult::CodeRejected, response.code, 0}; } return response; } + +HTTP::Response HTTP::GetString(StringView url, const std::map& headers, const std::vector& acceptedCodes, std::uint32_t timeoutMs) { + std::string result; + + auto allocator = [&result](std::size_t contentLength) { + result.reserve(contentLength); + return true; + }; + auto writer = [&result](std::size_t offset, const uint8_t* data, std::size_t len) { + result.append(reinterpret_cast(data), len); + return true; + }; + + auto response = Download(url, headers, allocator, writer, acceptedCodes, timeoutMs); + if (response.result != RequestResult::Success) { + return {response.result, response.code, {}}; + } + + return {response.result, response.code, result}; +} From 039bab9d0a3e12aa7042135e23d484bebbfefd66 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 13:20:01 +0100 Subject: [PATCH 067/147] Add ability not export sensitive data from config --- include/config/BackendConfig.h | 4 ++-- include/config/CaptivePortalConfig.h | 4 ++-- include/config/Config.h | 4 ++-- include/config/ConfigBase.h | 4 ++-- include/config/RFConfig.h | 6 +++--- include/config/RootConfig.h | 4 ++-- include/config/SerialInputConfig.h | 4 ++-- include/config/WiFiConfig.h | 4 ++-- include/config/WiFiCredentials.h | 4 ++-- src/config/BackendConfig.cpp | 19 +++++++++++++++---- src/config/CaptivePortalConfig.cpp | 4 ++-- src/config/Config.cpp | 10 +++++----- src/config/RFConfig.cpp | 4 ++-- src/config/RootConfig.cpp | 22 ++++++++++++++-------- src/config/SerialInputConfig.cpp | 4 ++-- src/config/WiFiConfig.cpp | 8 ++++---- src/config/WiFiCredentials.cpp | 21 ++++++++++++++++----- src/serial/SerialInputHandler.cpp | 2 +- 18 files changed, 80 insertions(+), 52 deletions(-) diff --git a/include/config/BackendConfig.h b/include/config/BackendConfig.h index a46586f9..170a4eeb 100644 --- a/include/config/BackendConfig.h +++ b/include/config/BackendConfig.h @@ -15,9 +15,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::BackendConfig* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/CaptivePortalConfig.h b/include/config/CaptivePortalConfig.h index ebcd3f60..fd33edc9 100644 --- a/include/config/CaptivePortalConfig.h +++ b/include/config/CaptivePortalConfig.h @@ -12,9 +12,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::CaptivePortalConfig* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/Config.h b/include/config/Config.h index 5b9af733..7367bc86 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -15,7 +15,7 @@ namespace OpenShock::Config { void Init(); /* GetAsJSON and SaveFromJSON are used for Reading/Writing the config file in its human-readable form. */ - std::string GetAsJSON(); + std::string GetAsJSON(bool withSensitiveData); bool SaveFromJSON(const std::string& json); /* GetRaw and SetRaw are used for Reading/Writing the config file in its binary form. */ @@ -31,7 +31,7 @@ namespace OpenShock::Config { bool GetRFConfig(RFConfig& out); bool GetWiFiConfig(WiFiConfig& out); - bool GetWiFiCredentials(cJSON* array); + bool GetWiFiCredentials(cJSON* array, bool withSensitiveData); bool GetWiFiCredentials(std::vector& out); bool SetRFConfig(const RFConfig& config); diff --git a/include/config/ConfigBase.h b/include/config/ConfigBase.h index 7133444a..6869ae3f 100644 --- a/include/config/ConfigBase.h +++ b/include/config/ConfigBase.h @@ -10,10 +10,10 @@ namespace OpenShock::Config { virtual void ToDefault() = 0; virtual bool FromFlatbuffers(const T* config) = 0; - virtual flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const = 0; + virtual flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const = 0; virtual bool FromJSON(const cJSON* json) = 0; - virtual cJSON* ToJSON() const = 0; + virtual cJSON* ToJSON(bool withSensitiveData) const = 0; }; } // namespace OpenShock::Config diff --git a/include/config/RFConfig.h b/include/config/RFConfig.h index 932b4051..55e80721 100644 --- a/include/config/RFConfig.h +++ b/include/config/RFConfig.h @@ -6,16 +6,16 @@ namespace OpenShock::Config { struct RFConfig : public ConfigBase { RFConfig(); RFConfig(std::uint8_t txPin, bool keepAliveEnabled); - + std::uint8_t txPin; bool keepAliveEnabled; void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::RFConfig* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/RootConfig.h b/include/config/RootConfig.h index 2d40f358..29d95bd5 100644 --- a/include/config/RootConfig.h +++ b/include/config/RootConfig.h @@ -18,9 +18,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::Config* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/SerialInputConfig.h b/include/config/SerialInputConfig.h index d34c1dfa..44c27aaf 100644 --- a/include/config/SerialInputConfig.h +++ b/include/config/SerialInputConfig.h @@ -12,9 +12,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::SerialInputConfig* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/WiFiConfig.h b/include/config/WiFiConfig.h index db626c88..8d3f3263 100644 --- a/include/config/WiFiConfig.h +++ b/include/config/WiFiConfig.h @@ -18,9 +18,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::WiFiConfig* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/include/config/WiFiCredentials.h b/include/config/WiFiCredentials.h index 03308adc..10a9d03a 100644 --- a/include/config/WiFiCredentials.h +++ b/include/config/WiFiCredentials.h @@ -16,9 +16,9 @@ namespace OpenShock::Config { void ToDefault() override; bool FromFlatbuffers(const Serialization::Configuration::WiFiCredentials* config) override; - flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; bool FromJSON(const cJSON* json) override; - cJSON* ToJSON() const override; + cJSON* ToJSON(bool withSensitiveData) const override; }; } // namespace OpenShock::Config diff --git a/src/config/BackendConfig.cpp b/src/config/BackendConfig.cpp index cf6a5efc..9b276a28 100644 --- a/src/config/BackendConfig.cpp +++ b/src/config/BackendConfig.cpp @@ -26,8 +26,17 @@ bool BackendConfig::FromFlatbuffers(const Serialization::Configuration::BackendC return true; } -flatbuffers::Offset BackendConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - return Serialization::Configuration::CreateBackendConfig(builder, builder.CreateString(domain), builder.CreateString(authToken)); +flatbuffers::Offset BackendConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { + auto domainOffset = builder.CreateString(domain); + + flatbuffers::Offset authTokenOffset; + if (withSensitiveData) { + authTokenOffset = builder.CreateString(authToken); + } else { + authTokenOffset = 0; + } + + return Serialization::Configuration::CreateBackendConfig(builder, domainOffset, authTokenOffset); } bool BackendConfig::FromJSON(const cJSON* json) { @@ -47,11 +56,13 @@ bool BackendConfig::FromJSON(const cJSON* json) { return true; } -cJSON* BackendConfig::ToJSON() const { +cJSON* BackendConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "domain", domain.c_str()); - cJSON_AddStringToObject(root, "authToken", authToken.c_str()); + if (withSensitiveData) { + cJSON_AddStringToObject(root, "authToken", authToken.c_str()); + } return root; } diff --git a/src/config/CaptivePortalConfig.cpp b/src/config/CaptivePortalConfig.cpp index 78173edf..58383e83 100644 --- a/src/config/CaptivePortalConfig.cpp +++ b/src/config/CaptivePortalConfig.cpp @@ -28,7 +28,7 @@ bool CaptivePortalConfig::FromFlatbuffers(const Serialization::Configuration::Ca return true; } -flatbuffers::Offset CaptivePortalConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { +flatbuffers::Offset CaptivePortalConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { return Serialization::Configuration::CreateCaptivePortalConfig(builder, alwaysEnabled); } @@ -48,7 +48,7 @@ bool CaptivePortalConfig::FromJSON(const cJSON* json) { return true; } -cJSON* CaptivePortalConfig::ToJSON() const { +cJSON* CaptivePortalConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddBoolToObject(root, "alwaysEnabled", alwaysEnabled); diff --git a/src/config/Config.cpp b/src/config/Config.cpp index 85cd680f..6a3095cc 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -102,7 +102,7 @@ bool _trySaveConfig(const std::uint8_t* data, std::size_t dataLen) { bool _trySaveConfig() { flatbuffers::FlatBufferBuilder builder; - auto fbsConfig = _configData.ToFlatbuffers(builder); + auto fbsConfig = _configData.ToFlatbuffers(builder, true); builder.Finish(fbsConfig); @@ -132,13 +132,13 @@ void Config::Init() { } } -std::string Config::GetAsJSON() { +std::string Config::GetAsJSON(bool withSensitiveData) { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { return ""; } - cJSON* root = _configData.ToJSON(); + cJSON* root = _configData.ToJSON(withSensitiveData); lock.unlock(); @@ -248,7 +248,7 @@ bool Config::GetWiFiConfig(Config::WiFiConfig& out) { return true; } -bool Config::GetWiFiCredentials(cJSON* array) { +bool Config::GetWiFiCredentials(cJSON* array, bool withSensitiveData) { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { ESP_LOGE(TAG, "Failed to acquire read lock"); @@ -256,7 +256,7 @@ bool Config::GetWiFiCredentials(cJSON* array) { } for (auto& creds : _configData.wifi.credentialsList) { - cJSON* jsonCreds = creds.ToJSON(); + cJSON* jsonCreds = creds.ToJSON(withSensitiveData); cJSON_AddItemToArray(array, jsonCreds); } diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp index 4bfff643..b9897520 100644 --- a/src/config/RFConfig.cpp +++ b/src/config/RFConfig.cpp @@ -29,7 +29,7 @@ bool RFConfig::FromFlatbuffers(const Serialization::Configuration::RFConfig* con return true; } -flatbuffers::Offset RFConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { +flatbuffers::Offset RFConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { return Serialization::Configuration::CreateRFConfig(builder, txPin, keepAliveEnabled); } @@ -50,7 +50,7 @@ bool RFConfig::FromJSON(const cJSON* json) { return true; } -cJSON* RFConfig::ToJSON() const { +cJSON* RFConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "txPin", txPin); //-V2564 diff --git a/src/config/RootConfig.cpp b/src/config/RootConfig.cpp index 99ee3796..60f030f2 100644 --- a/src/config/RootConfig.cpp +++ b/src/config/RootConfig.cpp @@ -48,8 +48,14 @@ bool RootConfig::FromFlatbuffers(const Serialization::Configuration::Config* con return true; } -flatbuffers::Offset RootConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - return Serialization::Configuration::CreateConfig(builder, rf.ToFlatbuffers(builder), wifi.ToFlatbuffers(builder), captivePortal.ToFlatbuffers(builder), backend.ToFlatbuffers(builder), serialInput.ToFlatbuffers(builder)); +flatbuffers::Offset RootConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { + auto rfOffset = rf.ToFlatbuffers(builder, withSensitiveData); + auto wifiOffset = wifi.ToFlatbuffers(builder, withSensitiveData); + auto captivePortalOffset = captivePortal.ToFlatbuffers(builder, withSensitiveData); + auto backendOffset = backend.ToFlatbuffers(builder, withSensitiveData); + auto serialInputOffset = serialInput.ToFlatbuffers(builder, withSensitiveData); + + return Serialization::Configuration::CreateConfig(builder, rfOffset, wifiOffset, captivePortalOffset, backendOffset, serialInputOffset); } bool RootConfig::FromJSON(const cJSON* json) { @@ -91,14 +97,14 @@ bool RootConfig::FromJSON(const cJSON* json) { return true; } -cJSON* RootConfig::ToJSON() const { +cJSON* RootConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); - cJSON_AddItemToObject(root, "rf", rf.ToJSON()); - cJSON_AddItemToObject(root, "wifi", wifi.ToJSON()); - cJSON_AddItemToObject(root, "captivePortal", captivePortal.ToJSON()); - cJSON_AddItemToObject(root, "backend", backend.ToJSON()); - cJSON_AddItemToObject(root, "serialInput", serialInput.ToJSON()); + cJSON_AddItemToObject(root, "rf", rf.ToJSON(withSensitiveData)); + cJSON_AddItemToObject(root, "wifi", wifi.ToJSON(withSensitiveData)); + cJSON_AddItemToObject(root, "captivePortal", captivePortal.ToJSON(withSensitiveData)); + cJSON_AddItemToObject(root, "backend", backend.ToJSON(withSensitiveData)); + cJSON_AddItemToObject(root, "serialInput", serialInput.ToJSON(withSensitiveData)); return root; } diff --git a/src/config/SerialInputConfig.cpp b/src/config/SerialInputConfig.cpp index 6410af82..b912eb40 100644 --- a/src/config/SerialInputConfig.cpp +++ b/src/config/SerialInputConfig.cpp @@ -28,7 +28,7 @@ bool SerialInputConfig::FromFlatbuffers(const Serialization::Configuration::Seri return true; } -flatbuffers::Offset SerialInputConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { +flatbuffers::Offset SerialInputConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { return Serialization::Configuration::CreateSerialInputConfig(builder, echoEnabled); } @@ -48,7 +48,7 @@ bool SerialInputConfig::FromJSON(const cJSON* json) { return true; } -cJSON* SerialInputConfig::ToJSON() const { +cJSON* SerialInputConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddBoolToObject(root, "echoEnabled", echoEnabled); diff --git a/src/config/WiFiConfig.cpp b/src/config/WiFiConfig.cpp index 7f82cdcb..bcc0c47d 100644 --- a/src/config/WiFiConfig.cpp +++ b/src/config/WiFiConfig.cpp @@ -30,10 +30,10 @@ bool WiFiConfig::FromFlatbuffers(const Serialization::Configuration::WiFiConfig* return true; } -flatbuffers::Offset WiFiConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { +flatbuffers::Offset WiFiConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { std::vector> fbsCredentialsList; for (auto& credentials : credentialsList) { - fbsCredentialsList.emplace_back(credentials.ToFlatbuffers(builder)); + fbsCredentialsList.emplace_back(credentials.ToFlatbuffers(builder, withSensitiveData)); } return Serialization::Configuration::CreateWiFiConfig(builder, builder.CreateString(accessPointSSID), builder.CreateString(hostname), builder.CreateVector(fbsCredentialsList)); @@ -69,7 +69,7 @@ bool WiFiConfig::FromJSON(const cJSON* json) { return true; } -cJSON* WiFiConfig::ToJSON() const { +cJSON* WiFiConfig::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "accessPointSSID", accessPointSSID.c_str()); @@ -78,7 +78,7 @@ cJSON* WiFiConfig::ToJSON() const { cJSON* credentialsListJson = cJSON_CreateArray(); for (auto& credentials : credentialsList) { - cJSON_AddItemToArray(credentialsListJson, credentials.ToJSON()); + cJSON_AddItemToArray(credentialsListJson, credentials.ToJSON(withSensitiveData)); } cJSON_AddItemToObject(root, "credentials", credentialsListJson); diff --git a/src/config/WiFiCredentials.cpp b/src/config/WiFiCredentials.cpp index 11176289..546404ee 100644 --- a/src/config/WiFiCredentials.cpp +++ b/src/config/WiFiCredentials.cpp @@ -13,7 +13,7 @@ WiFiCredentials::WiFiCredentials() : id(0), ssid(), password() { } WiFiCredentials::WiFiCredentials(std::uint8_t id, const std::string& ssid, const std::string& password) : id(id), ssid(ssid), password(password) { } void WiFiCredentials::ToDefault() { - id = 0; + id = 0; ssid.clear(); password.clear(); } @@ -31,8 +31,17 @@ bool WiFiCredentials::FromFlatbuffers(const Serialization::Configuration::WiFiCr return true; } -flatbuffers::Offset WiFiCredentials::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder) const { - return Serialization::Configuration::CreateWiFiCredentials(builder, id, builder.CreateString(ssid), builder.CreateString(password)); +flatbuffers::Offset WiFiCredentials::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { + auto ssidOffset = builder.CreateString(ssid); + + flatbuffers::Offset passwordOffset; + if (withSensitiveData) { + passwordOffset = builder.CreateString(password); + } else { + passwordOffset = 0; + } + + return Serialization::Configuration::CreateWiFiCredentials(builder, id, ssidOffset, passwordOffset); } bool WiFiCredentials::FromJSON(const cJSON* json) { @@ -53,12 +62,14 @@ bool WiFiCredentials::FromJSON(const cJSON* json) { return true; } -cJSON* WiFiCredentials::ToJSON() const { +cJSON* WiFiCredentials::ToJSON(bool withSensitiveData) const { cJSON* root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "id", id); //-V2564 cJSON_AddStringToObject(root, "ssid", ssid.c_str()); - cJSON_AddStringToObject(root, "password", password.c_str()); + if (withSensitiveData) { + cJSON_AddStringToObject(root, "password", password.c_str()); + } return root; } diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 51be1e5b..ceec3e70 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -163,7 +163,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { return; } - if (!Config::GetWiFiCredentials(root)) { + if (!Config::GetWiFiCredentials(root, true)) { SERPR_ERROR("Failed to get WiFi credentials from config"); return; } From d0f1e8f9758e449b576e6ef3ab1330e2d5c20d01 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 13:37:09 +0100 Subject: [PATCH 068/147] Better error checking on config parsing --- include/config/internal/utils.h | 64 ++++++++++++++------ src/config/internal/utils.cpp | 100 +++++++++++++++----------------- 2 files changed, 92 insertions(+), 72 deletions(-) diff --git a/include/config/internal/utils.h b/include/config/internal/utils.h index bc07890a..850a21ef 100644 --- a/include/config/internal/utils.h +++ b/include/config/internal/utils.h @@ -1,6 +1,7 @@ #pragma once #include "config/ConfigBase.h" +#include "Logging.h" #include @@ -9,34 +10,59 @@ namespace OpenShock::Config::Internal::Utils { void FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr); - void FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal); - void FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal); - void FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal); - void FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr); + bool FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal); + bool FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal); + bool FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal); + bool FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr); template // T inherits from ConfigBase void FromFbsVec(std::vector& vec, const flatbuffers::Vector>* fbsVec) { vec.clear(); - if (fbsVec != nullptr) { - for (auto fbsItem : *fbsVec) { - T item; - if (item.FromFlatbuffers(fbsItem)) { - vec.push_back(std::move(item)); - } + + if (fbsVec == nullptr) { + return; + } + + for (auto fbsItem : *fbsVec) { + T item; + if (item.FromFlatbuffers(fbsItem)) { + vec.push_back(std::move(item)); } } } - template // T inherits from ConfigBase - void FromJsonArray(std::vector& vec, const cJSON* jsonArray) { + template // T inherits from ConfigBase + bool FromJsonStrParsed(T& val, const cJSON* json, const char* name, bool (*StringParser)(T&, const char*), T defaultVal) { + const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); + if (jsonVal == nullptr) { + val = defaultVal; + return true; + } + + if (cJSON_IsString(jsonVal) == 0) { + return false; + } + + if (!StringParser(val, jsonVal->valuestring)) { + return false; + } + + return true; + } + template // T inherits from ConfigBase + bool FromJsonArray(std::vector& vec, const cJSON* jsonArray) { vec.clear(); - if (jsonArray != nullptr) { - const cJSON* jsonItem = nullptr; - cJSON_ArrayForEach(jsonItem, jsonArray) { - T item; - if (item.FromJSON(jsonItem)) { - vec.push_back(std::move(item)); - } + if (jsonArray == nullptr) { + return true; + } + + const cJSON* jsonItem = nullptr; + cJSON_ArrayForEach(jsonItem, jsonArray) { + T item; + if (item.FromJSON(jsonItem)) { + vec.push_back(std::move(item)); } } + + return true; } } // namespace OpenShock::Config::Internal::Utils diff --git a/src/config/internal/utils.cpp b/src/config/internal/utils.cpp index 0f8e43ed..3c7e4913 100644 --- a/src/config/internal/utils.cpp +++ b/src/config/internal/utils.cpp @@ -6,90 +6,84 @@ const char* const TAG = "Config::Internal::Utils"; using namespace OpenShock; -void Config::Internal::Utils::FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr) { - if (fbsStr != nullptr) { - str = fbsStr->c_str(); - } else { - str = defaultStr; - } -} - -void Config::Internal::Utils::FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal) { - const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); - if (jsonVal != nullptr) { - if (cJSON_IsBool(jsonVal) == 0) { - ESP_LOGE(TAG, "value at '%s' is not a bool", name); - return; - } - val = cJSON_IsTrue(jsonVal); - } else { - val = defaultVal; - } -} +template +bool _utilFromJsonInt(T& val, const cJSON* json, const char* name, T defaultVal, int minVal, int maxVal) { + static_assert(std::is_integral::value, "T must be an integral type"); -void Config::Internal::Utils::FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal) { const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); if (jsonVal == nullptr) { val = defaultVal; - return; + return true; } if (cJSON_IsNumber(jsonVal) == 0) { ESP_LOGE(TAG, "value at '%s' is not a number", name); - return; + return false; } int intVal = jsonVal->valueint; - if (intVal < 0) { - ESP_LOGE(TAG, "value at '%s' is negative", name); - return; + if (intVal < minVal) { + ESP_LOGE(TAG, "value at '%s' is less than %d", name, minVal); + return false; } - if (intVal > UINT8_MAX) { - ESP_LOGE(TAG, "value at '%s' is greater than UINT8_MAX", name); - return; + if (intVal > maxVal) { + ESP_LOGE(TAG, "value at '%s' is greater than %d", name, maxVal); + return false; } - val = static_cast(intVal); + val = static_cast(intVal); + + return true; } -void Config::Internal::Utils::FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal) { +void Config::Internal::Utils::FromFbsStr(std::string& str, const flatbuffers::String* fbsStr, const char* defaultStr) { + if (fbsStr != nullptr) { + str = fbsStr->c_str(); + } else { + str = defaultStr; + } +} + +bool Config::Internal::Utils::FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal) { const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); if (jsonVal == nullptr) { val = defaultVal; - return; + return true; } - if (cJSON_IsNumber(jsonVal) == 0) { - ESP_LOGE(TAG, "value at '%s' is not a number", name); - return; + if (cJSON_IsBool(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a bool", name); + return false; } - int intVal = jsonVal->valueint; + val = cJSON_IsTrue(jsonVal); - if (intVal < 0) { - ESP_LOGE(TAG, "value at '%s' is negative", name); - return; - } + return true; +} - if (intVal > UINT16_MAX) { - ESP_LOGE(TAG, "value at '%s' is greater than UINT16_MAX", name); - return; - } +bool Config::Internal::Utils::FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal) { + return _utilFromJsonInt(val, json, name, defaultVal, 0, UINT8_MAX); +} - val = static_cast(intVal); +bool Config::Internal::Utils::FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal) { + return _utilFromJsonInt(val, json, name, defaultVal, 0, UINT16_MAX); } -void Config::Internal::Utils::FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr) { +bool Config::Internal::Utils::FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr) { const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); - if (jsonVal != nullptr) { - if (cJSON_IsString(jsonVal) == 0) { - ESP_LOGE(TAG, "value at '%s' is not a string", name); - return; - } - str = jsonVal->valuestring; - } else { + if (jsonVal == nullptr) { str = defaultStr; + return true; } + + if (cJSON_IsString(jsonVal) == 0) { + ESP_LOGE(TAG, "value at '%s' is not a string", name); + return false; + } + + str = jsonVal->valuestring; + + return true; } From 718aaee1545d5d508e2e08bc88293e2ab3fd9966 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 13:38:26 +0100 Subject: [PATCH 069/147] Improve flatbuffers docs --- schemas/DeviceToLocalMessage.fbs | 8 ++++++++ schemas/LocalToDeviceMessage.fbs | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/schemas/DeviceToLocalMessage.fbs b/schemas/DeviceToLocalMessage.fbs index fa51ed40..2e231ad6 100644 --- a/schemas/DeviceToLocalMessage.fbs +++ b/schemas/DeviceToLocalMessage.fbs @@ -55,13 +55,21 @@ struct SetRfTxPinCommandResult { } union DeviceToLocalMessagePayload { + + // General stuff ReadyMessage, ErrorMessage, + + // Wifi stuff WifiScanStatusMessage, WifiNetworkEvent, WifiGotIpEvent, WifiLostIpEvent, + + // Account linking stuff AccountLinkCommandResult, + + // RF transmitter stuff SetRfTxPinCommandResult } diff --git a/schemas/LocalToDeviceMessage.fbs b/schemas/LocalToDeviceMessage.fbs index d676b5e0..609ea198 100644 --- a/schemas/LocalToDeviceMessage.fbs +++ b/schemas/LocalToDeviceMessage.fbs @@ -31,13 +31,19 @@ struct SetRfTxPinCommand { } union LocalToDeviceMessagePayload { + + // Wifi stuff WifiScanCommand, WifiNetworkSaveCommand, WifiNetworkForgetCommand, WifiNetworkConnectCommand, WifiNetworkDisconnectCommand, + + // Account linking stuff AccountLinkCommand, AccountUnlinkCommand, + + // RF Transmitter stuff SetRfTxPinCommand } From 1d9defda49dfcde6b156d447d3f61f583ba2311b Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 3 Jan 2024 13:38:46 +0100 Subject: [PATCH 070/147] Update flatc --- scripts/flatc.exe | Bin 3364864 -> 3484672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/flatc.exe b/scripts/flatc.exe index 79fd9065b4d7f864b51149ad895dc775110b2b45..7dd09fc94a1fe0a6e33667d69a6c197bab56b132 100644 GIT binary patch literal 3484672 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

ANO9`+xOc^1$x zj1QkcfK=@q$palDa={kdSrNrsL&|SC&6J12jKW}xak=4|w`&T4 ze|=+0XIW8`<9& zB#^HhG0g$AC12^V6n^?hFL zGwF?>B6o8Wx0JyD+%!3B(&^=UsP$a!N&umpmVu-A79Qlzet%)2d;I%dSl9Zu$NH3u zWS~dSX)flHg#TwiZ+;Rqh2gHNa}z3W%S?_dOE|sp|Izj(@KIIQ|6v&tz&L}l1OF2{#BG`vLsoE2G=FFu3M#_F%wS&DtWU^BRP6DVO=fGZ^_yMT zJSgphLqR~;3e)E`FzG6Wr=cp-Hx`MRy;?94175$0Kw&)lxIkL_ZuLV~XT0Bi zbH%59q8ECOy|8Eb+1AUW!6Mg{cja+!4^c%KFgxcEoadRrqaDM^m|AgA$ zdaZLA+>81jG4v=<^ux9kX_>X19=aqjpsiK}_U)mH^qe`(CqxLS~k ztk(fQ%C5nop@i;8K~}){e?wM}t~2^#4!hqpg!nRF*P%7noTUjpNL;=z$MKnk z02bPF<^O4WQt*`x(xqSEK-F>_3-)48HC_T$`3=3tFeCz&KnkjU-+gz*=Y68T_Z<8C zp5>z~Psm2qjn?)n1Xa^DrjBq7rw79s55{1WOiCI_@1WPcyW$FIC!7SN?TuSvZ7FVm zwX^u+#MBLT()JVR<3S{^B*JaT(ZmTwH)7qStF3_kwR5fTgWR`4a5 z>E>k_{=r8u;vt6EJ*N^tPN@C|P_ulOVgUPnj5qM2_)#ptM?)+`^x*Z=W>|NR2O9-4 zeQnColi=|FRo0z6U_k6Q^GSj8H|WI>&s@$ zGr#G2)@6GmG{8WB$dF(NgXSkt2-bln`r$kPKoYDmBPAF?_C{Q*aYR)e!G8fA^?(*eOuVij9( z69iPn^lMo+e~gnV;d#Oy1!6DegxR)e`PxM7rPS{Dc`1Uoh1ZIY;~1^o%i#jsVOWSi z5QT&qch`P!f*8+12uK5*vrQItsK@6bNyMhi9Qp(nK8seDsfPzxtX4XpB1Yt0n=^myn;#% z4eKw);9EJgH%1(yrsCQwQQ)jK#4*Q8H;$87&p%APV!!z%CZBg0&XX{jMS_HHLUhJ< zK{2BtHagoHiHabU&CeodhS1_McwN*R+xv0ckV#~=9+00st~vMwtiIP{X3jz~>d(R% zjs5&)ck6^;A6jf!GK#e80unY@+b);li~6P(-!rv%GxHpL09g-qwAYQcHw z({`+J0_)LIB|gaf5FbGFqwV|OlEj&qxtX7-r+KEU5vi!p>y6x6*mO8s3p7ZBdi$pG z$&=B{|LCq*_n${Fw%b<#Li!5g(J(`rLR_&flH4NY-VWFKiZ$K@eu1=$zZniAbogU| zFIRDK>5>f6_xCiL^pV$)Lmfj43?9Wf6hMPdlMxO^%d7n6LJRfz2QO^kk6I7PN?NT2 zKXk{tm|hD&+~@uNCpFzk%n)lMb_nJvoLF>W<^xigP>jet-72D1R7;S2awQ;OZmfTLb3Y4dL}ew1Kh+%`d_Kq{QwRjAe=| zPm%T22)IFlw*hYD(f(;&(eo$HW+Tm%5?j_)?CE;Tc>mR_edaxLHf+dD3v}Ah@(BP0 zZ1U7{Y|y`KjE$!}t!bqFTowjAuPqL8O)xxhLIADfRk|VLwmOWa~>?szgr;vRjJgg9aK){B&)A`-xeK zTe$2M;({G_LjU32aU;yGGcfQIwufi-O>pbE|PFU;1!cbzpKZdR`fRM44 zK=8->+18$oFgRXP=X3WM=?z6E76s}@j^%I|k%?ZQ>C!;7O8|@s{yh_o=)^3R=JsGM zavyIj1*}leQm!Dr0GU9D90dFXZkt4QagAR~0drHrk^wNm%X9W6{9JwOhbKQlNPmD4 z5=sHaLNIr!es=*JDi3+pK2&}R=8NT*4(U?rE5j&-f7mR*0@;nYQHmWqKf9-$5{MOd z;6kQLJ;Gn{+Mp0*z~;cU zA*RCWK>iLv#o0$l6Z!}&{P}N9b;W!?ayB4sx57PVK04;a#F4XXE0Hj3%7G#hDIVoT-p06&Ys&8E0(K$OxbdHqrnje9zL6#4tcz zC;<=>@-ukLBAB|%2B69!SPm!A-dJ1&Q(B3&{bCyOMFraYUe?dwol+AQCcc7Bl*bd$BH%LZ|Z{xw^^L+ z&wtH5`vnvV<7OV3=ojN=9$N09*IgdbD_1P-a81aA5h)QB^ghhwDs&gvI03s1-~@t^ zEg~`xyos>JLh2L4*X4oOB^dELNcFHcT*ljW7zu3;nYZNm&2kWmcrbq#=wRHc%u@Il z$lv9lL%6d?zB~g%$x691hPg(!Z8i7g@ezt z!>O4ot_CT|hA+q2Ek~iN_zKIHwd0Q^3@)PE3`T{cLFO0zYS~T zDKI-?kwZTCPy6~{owDtt+D*aJE;%d*!dW9O6wVzkbLZ+7PfE172vrqXKc0aW!^zub zJjO-bmF8}S2g5=PEWUie_vq0UCcU{#Zi1A`yLaCIt_6Jqsz*44fx(dm_G0y(PVk}L zy#u}-E_cOM;0(ma%JgScEH4BScXU^V=MSOg|PZu>7&LtVV6$!*{G(lV#2_ID;l;8Rdk+jv^<(Q_JN;68@o>arsC^jGyAh z&pIoNMMgFn$E?DNm@X5+PQb|E>q?{|M$fp>3o}r51*)l3?6Hoj2MYmOkt;x@-=YUV z^}v4sxPs>jJ@{Oq$Gv>+H)CuxwZ4eC3G==jn&Z!Z(>?FCmZEHqIl%A`UHhUs6lsjS zyD)xHIi(!k-_9bUDq5@J&e#V~R!1M28dV=^T>nK1g{UqTR4h+Pb&F3s%}7m`Y_KVSh*D8gW5-*7(KV|58p>C$f{4eq_=>cJJ~ z|4F*DTo=oiuLSx114wVEx^s1A+WY$7PCI{B;@v|0C#^rJ`drF4{@CQ4C!x=2;6R(M zk9R_&HVj)*j8X9Pr!WJ1o5x(S1h3Vs*oL9o4QYjF(ZV6*teA!&##A!4VYsKL;r<4g zejSn#V~00V{w=irNrwB}ED)pgmZIsgW)>-`a} z__WV6K$xn7YO~X1pKNwA`oxWNbf_4#DCq-=YT7BQnq^&#vMO3K%kxx^p{gnGgZ}}A zu~8#HRlA~Bz`b;9`w*e3XdxQk=`2wb5D55ow+)@;c>t01>iIy8DBb{exf*sS;}@Xo zgwkLzc6%~eF6CkZG!tp6BeLUOc){5KT9n@hv#$Jm7NZGMVhEbj^bnXX3(2U#0r(WD zh_RCrPoj{^P>4O0&W2{Qp}iapMTj*SWNq1g5M{BUHJQ~&!JrLVmN}ml_z#PF4^LLG z=S<4w=VmBf!9J^c>bxXOdZku1N>ycMUVwzE$S)Q3jC*?}E2=_8Z53a{o}AC(sd`gT zAEj#;jbA7pT&f1>9lA?Ov=JUjiZ-H`dJ1jCkw`%s0mSCBiBTU+T&_cqjQB>zeWQ}C z=_uWXTL2cOC8#CSUD?FSgqS99$X9zLTN3NF9!t4k(NiZluxRCoK46QmonT!E!e^{_ z5OB+5^(g_lOY9)&bvbfE=5qP+c>l6^)cr(|C} zI(qicL9v+qq)kyINt-zTE0K=)v*O;q$;$SezHcfuPUSVWnXb!_R8;C>7Sf7Jy@*0u zw>TYiuTO?**8t+QzxKxKuDNFNgu#O`&C}zCn~hN9xQzLMWb&C~rTP+qr!-18BB@aN zGo*;pnA!hCGGcsBUL}Fxx$MwBC&^RE5}!zv_!nJbqKyBX#{Qh2vA1T{CJ^Ww1!^=} z`i2VA!79k^<56xSAyC&1NgUL7JG62R!6+P|M+5g^-N+&W!u=lMQdm?|dd?!(?H8Zs52aRHY!uLo6v$z(2i6oezxbbZg3U3V~6hfoOFHQmM z$uBkl*x(nl;GUTc_sm@Ii{KO26p-)x;qT-Szmx0NxbB;ut3xS%)0O#!gP+?2A=dOk zc*Ks0Bq@YaprW~hd-g_PU&vgmw{?Zg3|i)>+D3C-zwb?ZldTs31>~m5LDtMw!hJK^ z#HPf4Fb}Lg9(jH9x%LW`uHqPk`l#I->3W3%Ta~&(nV`#L0PVdR$xTarum=kyTJ6C~ zcWzpGzlQ7Kddt@}v1utib<@%d_(JW{;HIT?tLCaCDJ2WEpDU-^I_eZ9Ix7xUd*g!O zB)G~pMT41E#{$Kjz6G~ES_W+H^c>+%bvc9DE9V4jg^%-7;Y-1}+MTyeeA%>=^25De zV$B+)u@ztbocL(5TY%I7!)GE-({lE_n{@>XGMk$^4r_ri4qA}%5*UIf zfhd29<-pw|9mL3zMT!3CqYqR5C{|_{*_d!f8pmP?S{A_Gj*1mj55S@^hgacW^Olz& zZS6YSULW#6`Mj6n8Gila`CYE7N@}8s?*T~(Q~i)6g{iJqPr0@AarM;8RpUvdxoQ-F zNb-5aH#Y9O6wom8UOo{eH}x_9_zY{(y0Yb+JEXmQ602m>lw#+Sb(mJMIzE(GYD*=B z2K11J1WGbatT!@z*Xte2F0c6PXa7N-QMjJUupxj3<4-rABD1=(8kOqP33t8Tp$yKn z2fF{}HWvH-Z)`oU02zZUKqe<+x*}Lhqu6V?%r%>kcuP15{>J34YCNS8J5EHx~@ zgZCS-qOuwdOdJ|{pd<1FdTpJH64CW6bU_wD!Ws9?^wN(?z;S;x1~(FXBNpZIB3MbFYYcuB8Uug}Ow8Z`jrKniWRF3GtRGc#HV#yACWSyF?0GyVm09=QM ziKu%zM8JOUetVoHetIU=$_^tPeCS?d+$n8JlV!D)VdNHUVA*IbK~8|Ah@Ax!bs|QJ zOcd9!eJkBwz)5~pRuAabtE?MF@cI{d@(`{Yta*~YPp(n9R>*Y*t||VIN`LlDjyD;o z1?%R64feXJAPTMv!Yn2rebD7V0e|v9f!G*~Aa@VVt+kg=Y|QG@(_THrngAM;ITucG zByrUMmp39|R>_`0bOmvj?aHBMy>cFnC2_4@IeQ@uJ2oPnz!Z*!b2}H#p>~M%I=ygW zeKo4py16B}Zg!*RPYEL*jOEIiILQ6@GXXKx>U#&Gp}ytR6a{0hr8|$(!AEg#bv(-6 zyj!YIH3+k@veQ3h=V@yeFvjm}WUv{*4pU%H@xf!bQr^Z4EW&CpUn%$U9gmr0lxnUI zxPazlzSQ03`T%1r`m4uku21~^V4o4&s5A&q6h{horq(PetUTZz+}1I)Ceh@8i16V(yTBd9B$F|hq0oNkLovvX(xDq9PgBw%w_f=O- zolsUbVG7A&QJkI%kT5_S#YP&)u*QwB$vX^%^nJShO|?2jq{E6z0RJ7`ZF_mDmSjY#V%R z!-UptAW`99%NXOg=<451Ekmsr1Jvi{x;=8-towM7AGar>)O=$3rtMgW*%?qAKru!y z1shCr)*jrrKMr)ZUO!ch`+dj%uj4Mhlw~LmJ;~GI!`*Wzkfb02?voHuD*PXZG1DeN zbeRc*?Qc$IZjbA3P(P)}uacBflz~AY%h!^0`3h;T(bsj+i71&_Ue3m_%fnTuX7? zU|lcQYvjq5Oz*WmCiV-&p2@*>W6GDMKsv0GQ$DoU$r9G0j_dKm&@LlUS&fFS5^57& zDKxHL%(jZ`Oq+1^_^H?3HUY~4zblNqv;;qDi5&~i=Pdf!#V*+cx*xViAap#S!=rkt ztXB|U8$44TKj+Jz#>rxa)N4G;4eXYBHLsdqn1@>H-%$LhaBB{BNj__j%uK>|P0MwP z!rr%!QffA+-HYs+974Z_RoUx!ZKi6CZg8Ul&Fo0*gd%%vtAm8=L73;tj@nt?m6S&bHwy z#-@z~8v_{UXSwIJV0@r?aqiCs`ERBPet6(&Arp|DZy5yNzuBIh^!F~*YAdwIy7h-c9YA#@d~Ik*a7W#HMT9kD`Bp5 zvo^AudGKkny}(+&Qw`at7npm_(`-V*6VN|`{#Uo-fK`AmXs#6SVP8a%I0aslgP4Q# z3S4y(coXF}IaWhPJOj5rAsktoo`Her>4E4pcm+yxvO!VWX6AVCZC01@xiWU9kwsf0uO`X=ISIQ@MU75O34K}E<# zgOqgXudNeKQiNGbQpBmL$sM#c)wsiprTFQjlC}8ZH>T^c_hhzK^T9IL0^CI^7vm;g z`6#aFXJYCGAsWW!HQ-@O(If~UEXs)ae>gixDHNNAs}h1LV9KuZF!-7&{M^*|pY< zJ?xO>Y4`|T7a2SHQWox%=7`UgETH7?ROy7VXYAEO4g8AeSgk(3EPBo?Yf zKG!9xcdb<3^H{la31Ac2#jk-NoYqr=F|kx9095G&DvQe`K@szYw6^_46~jU!87$wV+`n;YbDJ6!h+mb~i(Y4dhwsIO!>s$`acl2y10a~|QBFaz|R z;)nFt7t1{%=#Rop7K*3hAB=#GAA@liBPR)(c8OcNcSonJyi zyaZn=yFg!{4L`CTJ})68meAi8u5}2xt%bxATS&yy)IkIfSHg+#b6+JSO6wim0?Td} z@Yj$V-+a7)NBUWxSli;#1r(9w7j#7O>isF%!;)v9WGr*@wlIgIZFT!o!XGj2Rz6B_ z5SnS11NTUF^n{jkwjFGm>FWI-h%c4Z_ymh_CT_48KgPRdt`4}1RQ?q=@yaJ~#W2mQ z<`1A)lhwyr&n;~bv@JjOR|M_l&zuCU0VSYOL@xXgxe}Wf6#tS!&-k@3zEXFUa=QC0&eytBHmP7B!f?rKMfF_IF^1d}$jSr9|ziS|MSRYGzvs~Yn z>w3AqA=g!MU5@Jp>jg+mHwZPU;gvn{c`V*)TZP}Cb|Wbli6;~Y{0e=WTNr(Qnc3P?DEU@JmUFZ#lCwI1$G zDDk|aU%<$ZSQ^IH?m0r|`1Grv@zgBxIBYnB-$ZCKgoK?045mYn9q$PIoj5xOp@4;u zo6R)@G~whe@bWP0VB*{j0b!8!&|;AuLTC8R;&T!NsjHlE)fKHf19r(lniL_y*pOY> zgIKQ*H0lgf zO?T+-;I{7UrR37xx_+Q-Y7pNFK!`(-@IM%bHmeE-q5{7*Jgz%VVP-YH-dodj z$y{PsuN=L9v^73B<-tvi*fs0RJn%9=jjPt%@*q8DfgRu>A)giwuik`;+?999(*VWb z=fKuuEoi_J2tB&RpP0U@%))1C8kXQW&WbMO>-x&+_#tW)Mjq!2vLfpJQuUsKh0FpMR1R3*eXI8;1nKjj7%kWfxw2suS5Jo?Q`phS%E z-umIMAd_?$A1#7g(Ciw-?%CKp*6wS$5I&^ldPLa*UdSVUXT>4w5o(DRYvFpoT6~xA zKgW=9tq7V>tD_lL4MK)(Zy?loz$Os zt@$`kw#v7P0YHN0Wb8FYfRFsiIezz?A%F7?G>V4r?x#VG%{Ddp+Xs1aF zxsA_hU>fUyDT9zL!J!_0bGtU)D=7D@2APv{fnwVU^;37q;v@jm1MxOpkL^*Jn@LMK zc%$qf=&q8)6m$WZ^f73Jc_&$ein?!~{1N>qpBOMD;=ZrqRT^{M<(Ye(-d7IG1;NQS zc19aDytxaS@P7Lm8<_myv&Z)OVCf_H09y|j6wvRk{DkVJM1e0Pzqbc)`^_wH6x3uz zjP729l@{HrBf=Vg7OKy8ehhfJf5a?5UYB2-EbuB6s3tA|K)n%>S)<11w=r$^W%#dr z`O{Q>nI5ivmm^k&HO|h}F(sFoj_?rzhHm#O+}^_a$i``kpz3dj1AiWsSY-o15ki$; zm5n8%Qxq8dJ{{Zx2w;|KZo3itklwKOA>DF0!*h;6)+P+og?gCAJ(?H=yYII>${xjp zh=Y%LC|j)-r1JabV~)O;e9Vz@?Il;YT)WD(6Rz59vG4U{a?Uy|Ce`R57L#6Y*nGwy z9Fc%f1clKXw<=~sRytXt^-4!-p1Db=Ih{LQU6GC$ZiE#;C%OD}wT?R!A>l>y6={$P zhT_g6A%e$30rCxIOfYsewl2)r95nMokWS4HM29nn0)_O!y} zV9_7GWpgwPHk)pReq(bq+lDcMFMO>+dwVH6Blw~%$XdLO-G1&6r@NK5w_!lqLGop2 zi*;W=x-yJ}<+CKCEZ;Ho2!(p3^d2ee}mgP>AU>k z-?Tw&x=<(E#8=Ypuw97GSzC@!%JRqDqAZ6A2{o6Xo3z4`+S%oyvUboQo#jPPp7aXM zmW1>QWoAp6V^hlXwp%78RqIriiLQbZ?FA_oLO>nDIpAk4uzM3GMIF-3c)N3rcyD(?P>*0(e z*`SAWa)}<%$Nw zue>JnC8V*%1VK1Tk02|Id?W}9Gf0QKsGTK>AR|gUN${;$4JH1UnIB%Id7+E&OsPV_ z7>(oyBA&A_G@=SWSd;Abu+`Yphk8|uF-L|=Bg6|XUU?_pgSlU2;YV{$FdBXQ0QdxV z4M}O0wf(=mkvgjJ6`-;dKd6eM$nxWr)wrfryw#bE6a6-FVTp6NZESJ4ZPY5ajWoJ# zq@}oRY;w45ELCnBRx7uSJWiNgx^3`4UDj$%$=cmg@%fJxZ*^kjXmHrth~QsU0UAEa zFrU@N@*=-E9ilP9L2-~_rf5j$!}qp)(4->lXo4S=oc4&R5C{OyuUS9t{-{0c2REDN zp(bD@Y#(w56a`9dvn?M{Ml?ukUosj#83!@(P`Ly zjuN?RHJ9f0BG`b|;-9cTJXS38TDL5)#zzu#vbQo}>gp?Gx) z*DU-`C-M(sb|DKQDOs1ke=Y0WsN^3M`K2`2ee*R`$7ZIUm9 z%iM#B=SNe~2!u%?`2?RMULkPUF7j1Km|5&|JDiiC-Y6kCHC;cyNlvy11avo2V6HBX z8)Fdlux5dU_nLNMr?ypnzYtFt=E+I?y}_oQMkzhs7N-jb5DOy{9i`Y7&~R#Is_=ug zZ;OL+E^$!Kh@zaENI5r=a-L>8yj43WXIN3r+9c&X6qAArnBSZyHGq0{1D!0j&Ny5o zU$*&Sp8JRO8`HWNq!KE}ryf@h0ukm+awz)|VB|e28n*SoaQP27wE9BkeHwWM&EWnE z@S_171{ombuRRhUQ0Ix^;0KrL5469w=WXS&lAGCEQsS?Dq$I^(J6k=azxF`&)Js0{ zc%*HAZ9Y%V_$QH>bCjT;vM(_M|YQ$jRi2LPm{ z+$U_+A0uqhfu1(C7-2+b zPzxri)ddamzf4^Y{_c?2%7W90{fAre6}UqBhlu1USQ1@+abDSb|$Op-4<~gg$LN)tByKK~L zZ9G&{W`%Y~vOT~{O^}a91)AkM4oM-%pu@)?O_mQh(ih1{!4dI-BLNuQw?}{JEh@bw zEX<+yP_&>OQGjr@W}sD=X-Nl8z3&D%m&o3xujTPpfpjS0YgzABgt$%-Vr}rqI)t;QFc9GNtGE$TInAGLZMqLj{UB{rVW9_;=_=$*$ z2zYs1Qy8-k)!0=k?%ujvReH5usgB*3vsbMb>RQdrOOT5Cvk_-6hdnBlS`Icq+$qSd zTPOU6-8_NFSKS37U$4;+(T!8`O-f+Ff8i4w#Wy3Zq?+mQ-S2K~{E=YTD+Zm78~oMs znp&?_sD?U1z;vDRcfDAvPz_LZ_J9&orUz|F7iEKns#z-9CZ!HgwjEOOV*x9)3!0A_ z*8rqJp52J9*8_rWGEf7y%N1|a4pN{y+i(l@3xxca7Akj6Fhd6tUf~?*ysYoLDG`5l zOMlr6w>xfZLx&DD?86=~1J;u$%hAd13OU4p#ZF$JfG?dqPk?W@fssBWBSsGfl|!!v zC3>~>5!I^!&R(^zZz^X?2Bfw`uRGEb$kMM1fT?9#hosgrDL-Nj(W?)x?iN&JJ=!$| z3d#mf8;62jmtp3>TVG|_>Kxsy4G$mGK;Oh> z9fD?Yf7F(r|EGb@Wm$C@b{9qGMn(`5Qgm)mxru|a(L|bJMmPm3_H?`D&=tQ0y15^H zb86@3J2Z7XWgWZ;2PV9ijrxT1atIP?aXmP_bgU8ZM(oLH0jksoHOK%mmIx3fowGsE zf7wF^g(%|Su`3;mW2?e}{RcRc29VcznnjtN6qQPZ96{^1g==>J3b2g7i0g7MF4mdy zF?m6O;3;@U2+E@2ah5vHc=KTq4M$$)_Qp&YIAgXsK< z=VKq~e2Be)t3BA`^U4=HS}K04~LglqW-mX;c>Z2Y>DO z@l(sDTzAv8{%Cr9R0g_qA?&z6xZQWEp#IqA)z!8;-NuNC@Zv@sM)+y0ZieH=0QX&w zL9B!j({zOp`hC?_r-qg)9&qHM{G+x@QmJqqh2cHfUmFcf1WSB2%j{ z0O{`8d3YbFxHSvsCxrk$s@|k~G1p&SQnFgEiVbMK4j-Aj=x8_n4#>pG*5H(Ibgz5k zEc~`rNmuvm^+29hm54y3iga0gXQqn$3 zqwyrU)jCcPpal*tagjsZYJ0Dj?2Ou&rkIC^zE{k{b8%x4%Cb@ZLWZGFMfnkY)E3HL zh_$jY3vU&txCqPMa{w!szZ%jg({+sOtuhv2qV`2HV*Dj;ECyMayD7|Y$UTfzdXN7` z?M|4`cRT$FL#wQh8@`1`J$7%H#Y1Tp3$4PmU4#Xwr3GGTPzjU0ZZ+!=eB&KRlJH~E z$I}Nfk%=pKi1Bb0zTY1!DU`q|6E7CpYW?yDYNO1zP{&q#Hhyud3_aY}2z0#!0Ye_0BJ< ztcAL)jd5dD5|Q+}>O`bA<@O@$Zj^&?gU{I`or*)5^gm0*q3`#!i9@&aY21Q0)@?Xd z54u%cH&{2xb&@eQ{|F8PL0l!D!{be|rJ<|Kov{&$ZK7M6A$5}#2w}+!1)2sNL9HkfeC;aH>=a@Te z7uN4sL5rMV*ALi_wS4=hT+0t}-*qL%k8AnlZ0A}o=gkR~bezog({my=@(i*)NJh@h z@J6O~ZQP0}CbLU2DKShPmqsycvz@8N^&XNuqz?JlOa5-i-@S2BN`57)Ci6d$%>S6q zk6hgvuS?0*y4G3ATr+hp)LM>YP1gn+TsW~?%!t#>@W`DNuZbcTW`3E(#*L)*XVopvN zPhpNfxNW?DWRZ{SB7d)ngu4LBD?;xt#^w|@(U3_FXKn}aX_H`_XNYfM@ z`u`#P^8ao8_rUkwi*Tkzso4<`09)3=xuc>v(|uPVFbF5=dAIIp@h>Pe=gjJN48-mE{@RnuZVud3mV0~>DHZ>%rjI|0eJ`&UM&PYbv8MEL#k96Lvpc?=nAt5WWM-?3 zU0Y{tJv%?d*U%&p?>|72vs>lt);ecvV)C4wbD8UzHmWoWaE!rvS@_HXC`pOMW&yB~ zz9}^YSz-(2mS`_y`3^4xXEa0`OEFKxVro4j%;@WhmY`*Fo+FT24{c$jyLwxdcJ!fX zKkI)xJwo4a0%_#Csg7@W{|x?}GFF@8cc~h`@W=M}Z9mo?zvQU32F@wV6XS6*lAyHv zIUZf@j5V$H8}EZj`>azng`7drW0Kfp+kZ`=?TbqBp>oyvx;*Qlh^v9;42s zg-A^w#5&Lfh}8E#Y>U)51ptiSKm8Ew=svS_2|kF8oo><5Uti!M zXS}ut>To#3c+qUcGCvq{T$*)1lp7Vl98!Kd zSa|4Xinj$#qlJN_!Q(?V4DAlz-l1h8LfN(`Pdt2Ozx77W%5ZxSKN7Rp6WZmi#%`cP~H>!9WH&Nf135m3i0Mh>^#hD zS`Fqk*6U0BU<0Dtcw3_mPgITmAxp1jT*ii<)e*7Suwi1s``@-So`~w@Q==ZbrOh@t zW^9F$y1wF_zx0HJo0|s1H=Mh{T01!M7&K z(}Q=1l(ybFsZ{aqTV>tSd~SVv%hq6P@lGs845JL2kryA?i5F{W$vpA+~j2Yr1jp0zE7!&ih+fx9vc`GxPEv{X(DSf(;g=c!XPfo+>M8b zGh7&%emGDboc~7akDvBVb4XfrjZrbBjo9ceU~i6?uAx z=+r5rkH8mdw+~)Ijvk8b_=4eB&H$kM@IPOg#pO-mE}o^z(qQ7yxQ*7lPn4qZ043`# zm{eBz4#k4`K2MRX4|Ez(vuquYvRdvEzr&d5y#OH~cR3ECgDZ5jd@I0!djn_B<5wxK zjt5>;0m3Z~pGHhv?bB#VY1)xS(l(5MBln^G#FhD^jT6C34`+x}4U<_7w5F*UFp&6# z86X?OX00IxCuYD)<2eJK<5k($GKlZ?5qIFe{HE*u2Q;pOn^dRTQHmNaXS7xc`PQOT zHA~hc++9h2wBn17Wmi;u(Y0(~#Sb0IvNgHGNztn9iY=2fm>d6Q(>P(slvtqNo35#U zA@Wnsx&f)kxg855H*{*eJtYTJbq?uc)+?~{FvIOg$l=g8xEjw#2H*1tfCP_SYcyn7 zKwg~vCg+T;SjC>;FhOkC$Noj6gE78?+g{K;YL~yF#RXLz9$yeU>x@G8s{?O_ZX^^N z^;2kY+-JT=MdXPu_JiI6(MAx$@Gopltk-$er6lzu=0C(i(2kGbb1&-*rR?f63%j+H zgPGXlD*w`FzR~15vaVun2MqghftJ;(4jdVUI@Ve1Ua;%nI`Z&QY2{Bf4G#@|D^Rhg zrR-!%RM`~6FvB+ECHHz4xYRzHjU9Q47J4dOR2_#bBt68U7!Ti`js+18rlYZw1A-Da z%OqaLJ7<6#k-6leh__r7g~)=rq)vGCHwwp=vfp5?lSkFbNn(nwrs&%(Fb7!}5Fl9D zT$`9e%>);21jrXbeR$9emD0)9HdMh$)QcMxXQziWvbe!=fkj|M1x7WY^VGbFY9EGl zAXZ#Q8qvdoE(2qO?T|PS2~G-i{=u(tGs2X9>hN6zYQph5^z(y^&;fq^p4_yi0Rm7o zk^sG}uD>Q(9jw{h_iwIsdpbZLR_*o#xVSD2@~q2xpXmDI9kAk27gbHi5lEbHF}>ni zrHBOD6)#9AB0Eeu8srqwyb!h~2484MX;egp6QR7qsiC~SSe0mpl)CE>O**>-qcgF% z&r||y7ezLqNN+_pSvMs?y@ep`SW(;7XfeQ{75q{W%B)Wmp{$Aus&(z@L+|cA_cT%0)~r5z%Y6NBVaam zi!c!M_}8u7V>w7Wc;(1w`r?N#XAz7T7?Y)nz#Lws$E31a%Glw@DdTDl+r@+I@@$7p zpN>K3wLFtBSKT#2Qi`l&YIv9MmHfDMp@e8a%#tt)rkXkfzY@dOiwTX+hSqAw zOvdnCpdB+MhVOLcnOR5A%(|2qzL*;lk_uZZp$t;4nM;zcnHi8}{6KrJ9f^>2TZkI-Fu#$sUks=+Ai^5z%Og4F7fAoNr~buXve6i+~uCbk{qI4_^d8z<-4#cj_cB; z+je0g8STMV$E*ZEyG()D>Vx7O>&v$s+ zU=Tqm)+_pF1%?ZsAs7x%(^$s0z_J_gb_LT6RRd_RcX8PUWr4fh} z=q@1?F20yVz$k19-VSvv}y!LX1Ct8w+kjhqjS zfpH@ZJ^6V&D*AlvEM`SP^b%}ti53dg@j~F=h4-asmNs3yb}r6QbI9IFR?_Zx-3*+v z&i;>@MBP3Vln0ec>`YU`ZDkw_AXLaOk62@=x8tD5|fT$F54j?wpcL4D}xDgrx^EfK9UjN32~o_`zS3~_jd2JmI^IHU-Jaefj+j;aTZn<{2Ey{ zLJ$h2ta`eJZV4B!umZ>BpAa12rEz9D6%P1apka|K?Gie7qHdNa?#)U-SLPm2Qgw@E zn=TJN6wNy5A(BLyLX77~4k}NiV#^?S(Y{myjz653WH-VND?{r9tE;ef?OO0`cD0B>eTD5 zy-BbSkoSWbOwzjIu!Gdu#c475N+LC)=l%d7>7iCFq_yiYYo@Zq~?H&ajy^;W4Bzp%C(bRe-85bZn^G|Ym;36 zE7z^KCgg#{di_j}pSF@&UozaLAA7SZ5>f%`4Vio3U>1gTBFMQ86GhPc1e=wshbhIR z3bv@uR-pO{2jD@o(rauLmn;?j?#q?5H=BRj!v5>fd$qmrOk(=aOG7Tgwz8B$}=+fR90JP*1Oq?@Kn}I^Bc@M-xuly9phgO{l!PohF=` zXab#E5DGL;{S3#Cul8uwit(xy;{Nj4E0jESG|IQE@76;Z8T(VMd>FE94fC!}JkPGPSwoTu;l5z$$0$8J|S?)Qehj{6nlz=kF&7^vEjdv)%w z3b~j(`uFbYU)}%99hlxZb>-#V4h-AzLW|UF~4y!a93mWV0*LmlRgMq_DCl!4vDX z;~tqC{K5*YNWsc0*YyUQJR_V$G+^F^Z}*2GCANgQsRgYVA(|Oq#$Ew>+;h%Cp>q0# zEeOMR?L@HcA@d)BiWzVk?HpoE0?wTdAdWg?c*5<*$V5Y^BjbJgqbWNh2XN+8PPt0aH%M<asu{)(By0W-wi%?_H=7$`cF|4YbSP;Y(kpu&?- z{%*%{?YOg#YcFGz25E=ioTg$nOhOybmd_C>noTLIl=0Fr8z8h_oRiH_LXEBfWX5cu zJz=dIrP3H-G^0L{zZ)9FxHVcgBbfh-qZzofo58pZEsYPbpRG{!VaPk+1J~j`?5>+& zlrFKd-h%|os11m>?^rBGglq&I=?z6^76o+F1|u>PER#_ch;|7eXaoKksd^@YHq6-M zz)jkvlel?%oVeM55D6R_J3KXqnXU^bpk7H=telQVG8(+cYQf>R{`MYoOI8pqej;*G zz6e<=bZC2GRwZTYDetnUb~(dam6Of;_R2Yz<(!Z#2hmPQ@<9Vx9L1No1nHImoOW6u zRty&!MUmSp`fCtHYvVgw{1=L-PLoF+#AM$qEFPg9vv8v*rfdMSDJH!oJ@98K@=SEk zT+5i)@S(ebjaz`_@rRlnEr>_IGY(i&ZRWu=~mSs!#}t#SPcx8UFW_Fp5$GJ zFWav6CTHGdu50(ImV0b$r$368L)4Nlfng^5Wli0QA9Y*>1X0>3W~N4fv>S6Q1O#{ zTJMm#rjS*B7t&vu3#=ymz%*LZo@hP zed86UL*Hm@2JIY!RK)lffF8Jj(vaFyN!Fi*o}QPyF;co14}EEJ?pIx z{;S-f+*}UbcP_wZvLqtjV0)-ZLTg>M0dC(D40jFPB!24&nCE5q;HZjyQql4kAXV1T zbrbvWupuwTy;G`Io|oEmvVx0rg*sHz^~OZil^WM7q+m&6Up_|jzhUzMp3N^GhJ-M9 ziA__jgcog&K2OZi#ox#(uiXJRJG#^+e%@jIX+33Ou_PN`^S`m29AnR*tP#S{K2~cfKXiivAQtT(82J6J9g-yRJER~W~3+v4jVAI=jp6N)> zl>!)k_jaB+6NX;|+SeX5AO>kL$Mt+5Vf3}UUto5aYgOB-^+bY7p_N0;@0<=bXi)F-Xj<-L3Xe5#{rmZZx!wNQtcS< zw#~ca$k+XLol^K7^{P_%E{z-2EK8~7_uGqxAx^C>D2s8-ih}TY9ZSd85(${5z!1jp zQ~^&HaBk4Q2GhM7_e+&x%c$jZ(-ke1nFPloR~X5Nu{dr#%DEI4b+>jq0NJjQ3dOGNXP+!w7tH^RCkub{>n97JUypXs zEsu~q(36FO$YY-@+>r$(P8P1icx{3reG53(>RGgWrIU$$97$L-MtMxvVkDzwItRrtsvfc5Q^cZC#cZCpTlmXgA_nZzYuCleYQ~4$OZ~vbqEc|@MeQKQdSlt zJd7tBCvXLB;9j*1E#R$j|(b@xxqc> zRSX--&2C)6L==uAJrHiIM`${l3anP)FKM&fkJjS*Hd}k<2?y0$?lQ9;d_!6rlLZiL zO%F7-1SSl)_qpf2)>4!WJ%M&X(_pA;mmrAX=~D$4XE|pRz?)b-+9oDvvQaLTmmYz( z>k3Z#vUlZ6#*jI!IWQO}ZPztp24Gh{W4Dq;UbjZgL_CHuQMb9F-FolD@K`aGcZ_QD z5FGA7oxCWha=f0TJ zfQGtrUy+!6SP!|XrSgEIaBg6g_4sOXeEE_-O|B=)^?12%1Aks+^_O%Xx%QB2ce%Q7 zwU<-v@0GCcOwL&grjC*t*3j(hZKf_83uwp$oPNL-GV#Yi$nIo}b1Wd&oCS>+4nfTD zkEms2b9ZGG=|shhrI?63Y||ez!|W>~|3TAT9BwJfg`(Q^kckx*5)0@64b;_0V@XOi zREtGSlw!~VO(z9M>mDoW%D8pjHA*D+&wy<3>f4gJ+UBKcrtcMxCZh?r10d!;+@Yx(8Xoxnm9ISawGP7 zLK$Ad)PUpE4Toduep3ayu3LlASRm1X+kvMs_g8f~_jH-u`){v5o4KD;xs|;hj-(yX zp@xLDmUM1Gg4}?44Yx}()&SA0OHnGgk1C}3yMWk7uH?Y^s97won<|cs8H=k`#Z`l} zZM3e!K7BMSo77|)M}5{B&f^s7k*Ics5@)I%y;w{NhH!}xTUXnJ^Oi%KOzZuVNO6Wi zV_jvflk{D$a!dM3N!Q5rd0d62V1FBq{Uy?xu7(Mke$2@M9}6@N=44wxj;Do0lHrx0 z6U(-M2<*C)L|{%%HTo4a=j4#=DS2$Jr2VmbD+C{C|TWyUE>XvCw9# z>mmxZ6!|t-{r`qdN9Gu~s=fn>G}i0JW5Bpbe#odZ;A%X>-75cXYu!S~7y)xYAb)&D z*{y+;T)V(@sZ00wd{haGZb1II~i zn@(anrXtCH8Q9#=AY!-v%VK`?LSB-4terR3%3f5(h zYXX)6A$U|&W=lTG+>%B7ae5$@cjjnWJaGDexiRiNEX_LS8F*r;-Av~B!>Jd#5QGJr z=G)wqB&7nORQ*yB9Y3<+_+f5LG|u|sX>LnmkiUvGUN~@H|4iTHa^8A9Px04qAOB)b zwVIm7RknCsB~z_YB;!!Yuzz8{ULFDnt*Apog685{_R{=2DUSc@70=)Y0@rYSbQXm! zZ!mgIjvtB)?)VY3odmKpoq7xCWyAO(JP})vYc)9A8rKk6s*TB!aW_GwE5+7V*5M8ilii=9@5NN_nw)RO+`BWdX)Ukm2O1oWgsRJO9aL&#ZVUh!Z+b(tniybA!j+^d) zPu!RUD$;A{4WeuKK>%5~9rY@4O_{3d>p01)oc@|Ieq*h85ahtO{1~KReE(>Q+NG%8 zy|vJ`d2dP<*TAG$1LdLY42lu>c@|&V7JAnd11`lbNGFmf_6SQMAYkfK zX`Wd|EgbbH*RoIRt?%!kZ?OxHD*5@af9Zo0`5Ckt)9{(v$_Rg;7{9Qt{t$-*ODkzZ z&^Ajil6$pMHIMwf9%E@xdtGEE@5JEuv#F^OkT$BoHp*w$NqSol?TBn>APn+qF|Xfi5V zdSExUI_;FNptt7ygypIZKbVFq1>Iv3Sk`*`HlAI#CE$K;Yg0Gw-x^Cl`7Mcn*(KJ^ zrwh|A8#GF-9TGm9vseO$11_02JtJ@t`A>%v2Sv&ojoP?DL(R9S%wG^@%Mm}j))7A& z`Zye$0u~>;G#XOkXD@Zc&&F&8;l%mlSEnHq1wUi_Y(;;>zrxlQ-8Mk#e*Hk zZ#yCT0%UiLIamsSNhK4C7*m>MKkZSQ*ROtA@s8-$3lxn}wv6SubpdF-C zA1zUoY5~U94)A|4Ythjx^yL@Y>70s#IvM1*46M=dq7kOP&5ska>(By!OwCN)?faIe zc6;l{|DoHJKu@bLTF7qy_lf_TZlBIV*ZiG@&fH$njG(T|RZ!Q}Q}up9M8WVTrw{hL zC@ma*s?p)Xm>2r`UJJQY>rS8fCvvtD1)P-U{Ka(CbUkw`8Afpdz4i6)^ zbKn$4!nq8XuCq$W?0{Wb<{E}%#JE0g+(6mepgIDYNnMaq_e}!n;}VHBkndp|&H!&p z<|oXO9g42@S(JV#!Fud@nKCi9lT2$*k%s3L@z&l}&*Ew7lH!#{TdesG;@Tz`UuunH z>7eYn$er-kWy=9j{#acX>}uhd?|58|c{U!##W@w7`-gSg^`bbdVh#ubCI*v=Ghu9J zt=ZdX+8YPPRaqXnc9Uyox&Fda>#SzEek<26<@&i?8|3;=xxOdYx8%AO*M#y6iMHg& zI>?X0shF;h$7nv=K=9Djlpw$|L(B-m0EOQYFg*$rB8bkp0K9WG8Ro)>5rGIv-_u%! z9Y&on(*65SB5I6V;$GIPCz25;K_kUa;rpjU=1m9$h@gc0yCaxyx$oM5ydm@RKn1ol zGy3Ln6l^9brZSi_JrtYKNrJ-ou}gnaFuz5GPz^vm*S+4qN(!RuaDF`$rCf*k7lvv8 zT7tD!{&QfDX%Co;T5uR0&aC~s0SC=A%UVzW5s@y6q}EPNahYgUy0yF&$!Xcw+RZ$QW#NyZ{}6?&>{j zak*Fl&X$d7vEm4sfk{^IIU2GcLK)auF7aBn(48T9y0$lx2hkJVaBL=Ne_q^0x^WL$ z2)r+@b|5_t;%bl69LKyx$Qy_~AnXhp>bE*wAbJqj`Q;=O(0RiB83xE1&D?J6#}fb* zPopqhh+q`~GAz)@AV^}mdR`%PA_6+m9m$Ascih0KDjZ~d945vr&&I{N?^%j6@)-J4 z9aKK7_mR9aLG~L_C%PF)*+=58>Gdws6Qf00aW6v&Ux6KS3A+edrASYNTS6v*=UU61 zfve$wPVgKkY=?5v=b?#7*lM+5`>_3y-TMv_F!F|QJ{3(AqPpAeq*Q=6Uj=C|8cX%o z>Slx}@A(EYx6cjI0mr%@RS+Nj7>u3nJH*L|hEyPt+Lavw2!36EaherW?ObowOb}IF z9_iP5jtvwUVbZf%Ye+Xz6d9M`EVe4^r6;Lzb3e_iAy3Yc>j=3H!&MWdw&>AP&?6z< zrYrPYn;wA<0W45w!G&fix=2aBXjluTTVWtI08!;S_nfy0DFCjb87E)&g{=N-$3hZI zA=F(r7>I?y4PMU7vDV^2VDBJ36#7^e3~7_7=`Bsjl^tXYG-5aiN^zh7UC5M3$q|v5 z4@ly$Q0hbgC04QQHrpBwbuBA75&QMk^k1N-KX&P~3VCBJc=>f?Z#q^c7A6E{9cNb+ zCk%A`)1{{AFO%0(W!37k*0w5Z*Xy0jycM7Q2&At{At=)w$k4Vf;9ulT^Pd9ZGEBfZ z$}eN76rzzIQd0t<+AiY}ma+RuDWgN#ZxlF_%RS)HZV@Fc;zbmZfJMC#QK}dP55%(l zoft=^Lkn{xk~EIo4k*neja{JV%gHD}jwh2PY>Cp08A~;RX#@}Brhd%zjW9MNJ@Ju; zVPU!%>(y6kl~L=}hd`V_1;YPwu{uY$2-ezlm~lXtP^|ngZAO9NKbXJMedinuQ9#>L zl0k6uw@l093D0}2S$8c#JGo|+qoxD3s`N)5+p2Ol3$m>$Yz&twPQ6mMrwdHj?i%>+ za_f0)^kK4GZMJsaB+C_SD0=%j_p1rc{&|VLWWfk7OO^!{vjc0r3?Rj+;#{-ZAKNOf zJ6oOrdaTF>ocv%6-{f5aTNR>#6KEGr&Sz0EWCmw@!cDSZp*)<549k56)~Q;oQ|K(# ztf(>E9yq#YU?IZRMLn^`%Gw0YmqINSl7Hu43Cc~J_Iwi=#HQkllktls>GmrX@^~_5 zONuf1BSy{^R-f(gm0O zJ!GKG9e#6VHSq9gvK*^dB!#q;IZ`tz`%_ zm0Vs)qO<5$kpO~#6M!k2Je~zAnk*pIG&!PavNhJG$zMx~H2FKE6iwzcO_TqNq^8M9 z#{pY5YpDHd_9Jt9m2nT4W*Ov{ts1AFX;?1L|9ksyDKig^?LGFi6(;V&gkBjlnjz zy-sH6=$?HaN@3tMrIe9Fk`wlKN;Y^+$!5s){b7EM%OMQ3pI>tX0`kGtJ38(@2aLhQ zBw$Pd{sJ&T5a6Zr=Lv5lXHfXa8>urWY#0;{Jt**R=46}m2t9BoBtRZF=EEI4A;l=~ za=i|0Zg)iQW|2ctq=Y-m2NB%pM2VVq3mDA;wm;lAEj;6nv@#_(C=~403Os`#zu4e8 zR%97tQQY_oNV-Cd`|h!ibDHn$pCXFqp#}-uqRKu&m#t}Hjuvt}nI}j}MQu3=X)096 ztMWOcw#0oWBq}@#6)Fb-Y=Rbk@OQuBAb^3b0j|}fzZ`YJxrqpL%g7Ln_q)-0%cO4r z96Z3YO#w(jAvkxFyc**{jJO9516B*pm)l_Nk!#I^q!(Wy4cZ~sPx!nIeykDHppMm> zu8svZH9!Docn59=KZd>Fni?!pSV|nJ(Ud@RjUWt~5YA|Y<>sE=LRq3O46u%W*dIsh+jk#`xIEa`_sI)L7h4s6*@I#3Tf zFdu$2+iwmQ+FzTEju1pr=Cfh(bgrK-b| zd5xqL6_|vyPyy350m*0qBR7plDpD{cUT|WfVh<_~n4^Uba#gkE9xH|S&wJR8{AbYeF$T?ePVC^iIvPeuw*+=*^ohGfL}zA#e0OU>_ZC~bdm zg2Jk)DBxQ~J8Hv(TVam&FS4PaB_g3 zHgK{P+NJ>K9+aU`J_R^MY~v`lF$tV=bu&lf7iXG(GDZO>H*=e$(9B%dmy!f7E3jR))G~r2cC(~ zN`(a1F^OvaQt>NYy@C}ayE-bhs}pq{xtWvgI&xjVm!x!cntGaNx^72`9j$Tk8TyPs zjjkJ!jQB>zeWMbM>50bdBP5o>M9uUFmV@c}MwlMK=MQJ=Xjmmdk&jL$!7SrYX}?e% zlrpm;iDJ53-?*R3s2@8xNn?`V@ta@5Lv$=?T>lX^Vcaf+u^Iax)Szs_v}n+rjYW!B zZ)_rG6F1%i>7b0W$=W(lkv%0nY8j_}>G3fxWdr_blfAZTl87!+6ZcY}$o2n^wr_!t zs<{3SkA*10E=nXQN)(WnN(8M~s_sG-b|ou8iC`@nsvy=^)Fj{o2_y>}udC5YrPkW` zMyoZo0zpNB(oGbU_#{{#v05D(T7wS=KFI(3Ju`Rr?vfC&zds+ccjn%iGiPSboH=vm z%o%n4Pb=(97WV92@xrKjUf6`nNu{Dwv(z+v)Ki{d(qEH;GTQxK@T!a{&+2_R0=!&d zP4B}Hf``O@=;>|~Bjs@xIW;-&Opz|H=HCpq~$awqN>z%7g4xkik8l=j)2EcKrsSi2t3K z|J^t({dVwAq9rltc>B(H_p%9+OTFU~Ugz9^HjW?^FEvhANBy*dpFq{rFOv(#t9W&_ zIQ8uvJi}iL#xI>S*d#EFf7yBVbQ6^jsVn1d1hFxl1%xXQ^hLbK`(oa~=j|%QW25pXz{|y+`MBWX+Lgd15M3@0ten1qeF*p1q8YcvlNSm$ zZ^w@o9DxhTJw&r7u@*Fo3xH<8pjk_hl%I?>oQB;ArcsJPT{Wit<3)da0^7xP0mcms ztXc$DInW($MHm)XY0@|1{0`=_9>$_NU4>X8X{JuQi3Mcl4(n`+R4+}`Qo}sU^#X$M z(hcsk3L$W(A`s$J2uA!RG5>sYOQMs-D9qWoEw5r3iM@l9U=f3zZ#nM?ydwOH zhC$bBQ(U+KKbr{igRz_@AA_VC!F8tEavD3}+W2t9Q)U+-%m&rU|0wrD+wt}!)fVG+ zXdHVlDiw`mv=ND8@>ZN%ljG}?bO&MMd&;g2-HYk4y?VbkzK4>&0^CdS+V;KmC{Fde z9qX95(%AHrSe=MtIoP~08OI3?-X=9`!f)a`Qj{_Gl{B5vz7I{Qs&5mae0gmO1U6x( zqleCT)HMb|l?~xwY&>5@CUqhpQ1RP(t2TUFftT&rcp8Hf=b&y^ll)8dj|!=jc;n$_ zqcP-@;gK-p69(0SZ-b@W6EQQDRd)82^|cmnjyV1Ukr=Z025RxjWe^PhyDk>4le z_hG)*{{mok6*JQV74tl>!ph{yn*z{b6BjK)eBK5+W2p1W9LTYD4m?+jF)f$O*csS{ zp>`JD;o2PT-gpDncI;bBNK>CIAfwkelj5#hyd2I&8(mN$T~@$)U7ft0j0fBDytM@k z^tmCWC>PUs!6o{-HO=o6^Yuxi4`RNqonp_|&m$C{IkoKf>Cr!Zz8;Kay+g`Op07We zVb9l%2*pc{&)2{CX$8xC{p7Nwg3(rq`8o>`(^fQFDXZAK3qKRSZJW^K!Gy*Y zH=*&03C+DIhR5f7y%KmqgQ3aiD_a(5|*UCDhE`{38O35Ah*y`7G6HsP%|s~=R_vsw(zMg z`aQJXQ;$wD)-=48K>H4(XNGgbwkb`M+4OE{XVT+rBi3bRvzne>JDVhyk;Pj;l?-~u zjl!U@dkUuGb)Jd_VaOyEs)Dwt6eQk6Q;IdXIjIsG8?8=lQB$X74q%!6Q6};pym#wQ zI9|7vNp5p?*=S=+J1zOo%=<@^w??owvrd&GZ@aV3R5eHE>&U)^d%dgSEdUEEu`PK` z`oCk_k_*1#RP$UZ7wmnO@HYo?H&6nweUFq_-rkjAYd&Kxk;aYwB-1s=F1`|>eYX^6e+a=K+bPP zLRazlR^M@VG~h##*FL@F<1wBwfePaoSI$yEL7hr|!mx zGd;HZO5I~vv*rhQ2BXIj(qoBMH=M;OleVwYFXQrUB39nyhq}YfBDM1l4>4~~X8L85iR?K7ON9veg`TlI2Pjr*F6v z96`7`#b{>mxVn$CRT76vNbm6UL70<0l@fd(@ePk$sBh2)nS-#5QIa97BVe{n!dm0% zjS$w5xsh4tnq!wJZUu_clo+mJsra*8Yfc9-$^sB&`~{InnAiS9{usqC4bsM$Bhl<5 zImsWgw!}|G$~kBriFVjVwzH^0t)r5Zo!sT0DT^wzpsAMvI~kmhbMCrmp`I^?U9T53 z94cmAi6L7>IF9AN@TSfNeLmrK16*_}+X>A@IBcW%Qt4pnswZJSa|>b4nu*?$ULxys z@|6RoaIwam4QOObwZKd2sEJ(j{zM(yok6Fm!8-T;*KHImt~o7fv9^fqvUnrsy5ueY z!<#vW9wxs%A^6j=wBz>`u5JH7W7~wk zalHmnE{~G#Om>ntLcxynfL4;%s{8Vc;oQNBWPc<(XuSzlj=GM)%7T)-*dtdId$4hv z2^%=Rv+a?+#32uPKr;pz=$eO9G6$9zRCNeLw4MN&ZX$U@DRg<2Acqw~T>etNt3tfm z4CWdcm>CyymJkWO3UY(%d_*yygNftU|47XL7#2)CnuWVk`A-Y!Ur-!L64DE7A-xbn zdXKn}UU0BN`olM(K`5l(#v=9+($^fgkbXJ<*g|@UP;DVyU>G62fI@m9h4cj#{ZV6) z(t8*wz3ptLl#YWzqH1{J#sd}77dQk0vAFGo>DEr;tOP=yHT zB*LgTb`vSR%eJ2+rSlx4x(k6V62#(-P)FD#+Zeka14RfW7Mli!7WL&}l+!Q=jSpmfJj0hjS&UkD=meaFN_b__hR zGlIOHUz*DcZb22s?t5ln@yjyHM?)>@u_Muy-~o|WK@!f~lZ{r|(GL#HF|HQ0=cR^g+{q1q6q!8HUf0brB6OCUh4qBB*`h8XEEg@X4xCLhIPWqsXC zh7M-wVF6LLt{$I60WR@m+o-+(j}8f(1}hDn0sI>m&qT8+)1R^PD=D|HujU9OMCnKpBwy|%d0}IGmZjTqbQ#XTvfqvnXKPmW_69K7a7_ysNDHAzf~1bnE*T>%r_4zj@I6KE#(}6X*KtoyH0B*oyFTaD1$k%bN)j#gq0mVn-0`4pa zT0IBSy}7$w1h|xo6jmL_L4E>^FIHgeRSDG*=Gf_ksW72e8Ax*T&W>hmcFd^7%{zYY z*xDfOiw#2D=FIGi_;J0$oHYEU+zK-V`2KPBU{qY;!S+M#nyP5W5QPoIlVX^ z9nCbMGvY5=KS?2A6WXD8}gsXBi|!3Nl2J?_D3@tDSVn%-zr^Q{^sM z%~fOW^7|nXBm-AL4K>^%;4&T?EIhZ81)f{Ev#nA#5)B+mm{}C2h$HM&5~Y9Ipi7s0 zOL00Qj>_+6>_+u4L+4`CabB=&9c>TN+~qGz1v5@RLxhn$DGwdT3NjM1^u=U)hA{FP zEG7w85+5f=KwQs$%KXv__#(xBu?n~A+4*s9OEVT#7)5RDG@lND;kez(nmJX38wDjj zeZ!yIzCCbKH|YV_aqmi@9^h#Myq<;Hog+=dp~a4Aec#bESEAf_)7*N&ZXi)yXp4Cj zuxg3sBdYs*ktywOxEB;vG^J&u?NxV_hKV^YYh-+RT%z0Vy`#Nuqy8%iudGcDyxz{# zcnS2Fi8QcNw&lxRg_^rOWxfy>^(RDlO<_UMnvC1*xQIu;K8AbpAV_O#i@vs8EfyE< zz9L%V8ma|-++ivbP%RdM8fOz?@6o&3wlBwf3kwGYWU$(P?VwIu#}|Nx|)LFDM$*BkD+7U&`l!9)b@9D)!Wl|w{8Cp zJ?e{2ZYyi;?6CbyR)pd%lr!|`e@FYt8tVO_RVd;5&kK63`1sNQPL1+ zR_p}ZZm_|?He8MB+>X${QTL6*D?}$=X0<@_NwPgTV5*4(!slH!&3W z#;ASlp}-0lMoO;LwN7`CAT5-1xReM3S9|vH>;9?`n{VNO@y` zqJvGmirR#%r-oFcr=Y$NxxpR&8{P)B7sa4)HV?l`<@e*Yt^XM3D_t+jj^aM>?UW9` zOvV4+ezUYqhBbzGM@gLOp^x=k#fVW-AQ9;o?C^E85nov?r<_i_M`p=b0TC~))eMP0cJgoT_; zruO2T28is2H=OfF3$fq$7dCf%{;Ni646sh;zo&n6&`^V964jwh4(K+bU=I^?-AfyF z*D*4TK|fp)_*wHAVw^&F}O$<%r+6W znVN1Q*^Ep!5f39jM}*x@hG;FUq`K{kVY}L_^tM;a_Fx)%a2HKImsjIEziq-d+L(Si z^c%Ko^SKzJUOIZ3hqXSpn7t%Q0`Br1YSrPy)Xm6qlJvb0#@2e2kgWAOo7^sF#g$&` zdFg@H1yr+1u)&B2{~=h9AoURN7|fR<5mJrROB6Sj{)@RK*bdQIif|<;&F%5$L20*lx&j*gh3G6k8}Qh{D-(CKAWON8uMWUtWqQ zw>1lsF2kXZ^Rm{%+)L&H7W%f3sjxD^gRagco?9VINh3l^gw0T{ULoSar6q1)I*gOU zOrIPQ#C=se{8R}++0I97tvY2|}OgJ26QUl?p2t=_qW26t-T?{JZ% zAU6_fC~DKH#|TGaqlKY>}hIGv2W^f*q4q~b)T0)D|VIlE5zUvRqb zFyIuv*tQu-#{xYQHOFwrEkk(fLk(F-fDs~J2b-^>@dTx>0%_y43=U_#AR##~Q!Dfi zheoS=uR$;pINqFRNGHPIg=ilc4rWNvaSUgJ)BsQ4aZ`y6}8=zjA zB^yV}hqHYg5Tw02gYZW}xJ5&-Q7eKz8Aj;KW$@eP#b6o*38n#&(sdJ8E9f!u1`qby z`-U4?H8=+60|OG&cOXpT@12gi z*A79+4_~B7<0lc<9fUC3K=?_-bsixM(h#B~2Z!yt5Q$A(tR<&e*3!K+`dUh4vAJlYU!nvoujVzh5~WDLL#8`H#_A@jsbPm z!&-b3gr4c?K$@c_a6eYRdCVAd%h24(A5k*>w(gFoaE zz&F1JM!vGmU4*!`Sf2+FsAD0QI`M!?#&)DcfNWMAdw?o za_FSl?4jS6V57yiYh!xRk-oCecI(fO37O~h9;hL{b(e47+ux*!znX7d<=c<;w?gJy zZoYLX$^gv0_BW~8jrd0OL-BFwb9NZ0{Y&xpvh~?hzw@xA@58%FfB9!O_J#EM4KA6{ z#P+reSnk^BE$WL3tS4!)t=8c!+apU}e~j0H#AD{Qr^tiUU*fgYY1FEv|3K(R!`;(gIv|e-H8x<#+WeHs?K1c^!B1tJ zf}ierUN3JX@BQ8NkYG0Tj1StVE7UksMtXXpjG}`pBfQ#C#yDpgQ&vcC3g$V&5me1n{*4m(*$9QLuKLTh@;xQh-c2#5pEgS%f@11+wQrAX|ids)n4U zArp>8&a~cA@1JibauT@%Ld$_b_?~pL!a#@soU`2u8Se}SuAtQg zfPj0WpjevK>JHzIO`CwVu#|>5rR(2D1))Lb;NYIUt9-Cl6qXP8W z33fu(d(#d*qL1v77;QaX*OTy(TKATX>Zz|b>vtpdyGpjlNBUiufKmoM^MHvk8HK1E z-r#^DCEMd^dRPhE`%EN{0HgL7Vpeq~=T2OUb!x!EU7@4i)3<-euckEiRwcM$Eq*oS z{BiU{H0C_C5f0sP$&EvIYuIFPx4D8AP&j;tN5aSo9-MkkqjlApxa18sR#O>11>wy~ z?$1+0<^3S}9U#9)$Zv1??J2)qG=7JmHPa}OraOo>$``bhBy)^*Tv%mH4kIK$-At6;Szs3Pe#!* zU`419Rye#^D%-oJi_iKvZr%k;XBBIqDo0KxLm`M|GtM%->@Hu+_OsGU*S3(ZinGer zuEf(_oDr}psu3z(D>PQ*@{Vb1?%IY+(5UZxxptlx z(Xm|WL9UaM^%Yb@ESd`XqK#+`oQh$n>a{$%1)ETq&TUoA8Mp}wS4qmjt>tXMKs2;K-2>v$;&vlmnM2D8K~O=i z!xu7bv7++}!4(N#IFhl_jI+6HGc|Xw97U!+>Cn;pDu&;XSv( z*&wP?s;*EJNpO>JuEq0f@pZzt|rJtnsDmTYw8J4|&Ec zXq=3iYf`0waCLau8|e^YPCt%vA&Th1BBHwW%GR+eVmZM&U>{z{6y03;Z*odYU(w>2 z^A4!0Jy_NILIct)QN*{^qx>xpaIh5^bWeIm&{*^Z(75zYmKXJLlW>0Tvh}TqbtyKt zsRW{DPDYi>YlCk8kL;jm?{oHY4bpFej4b~G3@Z{09_-MdzUD00Ry(2e7hThecL{N9 zJ?X2qvNu3Q`LGC6%ol{7EP8^Tsf}&-@ zV$X$tNd|`QoC(`<>{e^90;L2E{sV3$C_u+9rA1x8<#Ypu9QqRKjRjy1=@OJti{&NN zybyEw9m&S=n`lU-Q|hGefP|CHSguju@sxYxuS7jjk}!&L;l|SfN(O9bNT~JGxeiav9EJaYt7RFW(wtpWm-_oZqiPDoERn z32kyO+I^rD%y5 z@)jFiBUb9_bYiYfNk^TI!ek~3g=>qZkfs8`QMJw+D&VZzzGYe@2waTX$|PmAts3ool#+5c1=dpVhfOKwTuA)^E9zxMAXi*61(Xe=ZOp|9d4et>zpCNHo;R6> z+D``f+azz^m*02ryIH*<;d=RfS$<#S`;>pQ=S~k`EeBJ}q9IwF(LHkACNFfczN7vN zwNCR{E6Fv2+OLRu?B=#Megd9p)>3|Ht0y}-r0k_uM7k7>w(ej6Gmbmz|N04Db5rap z`>{{)k^CvZ`(Ig0X)q!AN~VfqMr%fUfpZ09Rr3Tb0@6W^iPTYIrm7Cn{41le}I}0!0)aTFP)nM_CQe+NTt{wk10uDVJ zTiYni1je@cVeK03&t9<3*~cktFZU9jAt0({H|a}RyE0$4UIr60Xj_TdjKk=b?&bKU z8hI)NkKvVC&jTrFo};=$b#=+2z_U`^k&nQT!^>oMewFYbuF z8SWc!V=Qmh>85ArDR`5xk&dwfw)1N};*vdhw|m&&BsFgGfV5_p8d}RnenoaENU5s= zlq&8YQpHwXys;DyTy;8SH3{*MNgz=BAN)yVj(w}HOFB~2`MT>zItU!G!*tA}WBv3a zlP`tk`aqr2vIBL#aTL@d)3Pe2dFy;R^1ZJQ$M$?2DB#4t0w$PS=L=kNNo3kN?!G?k zEl$I21&d4ZUT2=??z=c5sTY&ckd*Mf3J;xEK2AsLEndk_6?fI>6tyNrR+rGy9vzTtTBX@~92W+`)W2Sbf!SN5m zDB}3P1t&Xvj&mJV7`7NG1ze0;u9utbr9d7E%%vM8P>eavk)@>r9>1!>>IazlR}x+1 zJN^_No~(q1ejq|PJb4drIs(Cn|93f&Irn0st44C_7MQJ`*=lCrfcC5KS0ll*NYH=} zP0%tkLEQ1kp0AGKE~L1^`WE4czY)oeySEmkG>0<%=>%!H!hRysg3=cu6!Cw9)ZZe% z2T8L~M*<(tq;-Bz(Yz~ez~_GWoQ>CBNTU24(2#CuBBX3Ux*DN~|5PMB4N3Emg!%?1 zou`u)05MbqM_61l1jqA`_I#u*#G<1VNsaIjK~U$o1|X565IN=u^y`u12FN9q0ytcS zhsm@OL7nNxoy;UjkZ&hqk?`I4niF~Sw@j3Db+5@?AJ07=?Sb6Ye6iX!nynLlR_Fek z&fS0q5N^Ulx0LL6vuwR|x~BN5t5DWEc!9D=!AMQYHmPmuu9I&?*B8UL_@m$G)I#Xk zYes6_%-X>dK3cA)-P|n{l3(q51d&L%AJQRn1|BF%4+B}9Y61$|!=UC0p&?0u^rU~J z&%*<#72sjg&*KLaR&&KQq&Z1}^ylgHg*tsH9tOFHNpHElB&aY`pw&*7Rx3gTnTz=j zJ%$GgtHQ%9GgtD1)ND}>GcyH7MhPM)`X0oP`*(ba9>W8`IisQ7`wnoF;}rs#@miswL{ZP1x$Uw}+4cpxQP#^6iN ztV{eGF0wS%*lS!*A_9EB(Ybf&+~nKHorMSfGdSGjuDN2aG%ZsA#l!hp8(t!j7coPT z0h8Wx{b!;Skj)pXU7sKp36DVpxySOI-u*%D0>liB&Ep3YTqiq2bFR99G&WtQF2n<= zOYyL~(WJIq+W{Tj$oOhklN42i2r?J*9l8+@WUj&k{~27#4+z#=cCA#5DUkkdzDCF4 zfkd@<7}Vjf5K! z0f23MCyS95gaCu>Xm=cfgkibPMHX}%)2?y(5n;z^0K51SW*kV1+*x?wKZCYT({fe+ zM=~%8ihl&LNceC>Q2Y^mhi=3JS-f}{`~&=8@Gn9R;?Gn7aJ2v!hX??ifk$q|ak&+< z(|zJ;;@-0;Tek)(F!6aIm3lpM>%5s=x&$k5Fl$z2aGjjUZENc`7mM+7l)!mtlN_3Z zB?blP-otQ#HiaH+RiOF29+VB!qEg&!lvX?^bjCI5?($cVEohy^gRsMSzecw9q6pNoXy0qeyf z2PGng@sl~QGoAk!TNU~picXRK5yFvGK{R>yx5z{23EE>tzGY+>JE7AiqnhK z_VF6ls%!(R0I>1^>z*MI_5jhd!C`$8U!b-NZiu=M;6yCHeMlv$((cl1fSfR^v>PpPLg2b`{D?N|pjCHw98|MG%yr z3(AQcBKa$Wz-hJlv%}8kZ}IIa{IQ1K^HD=|G|2P)wmc6Tt88QTMez|N>tQZ{k!IW2 zw&>L1s>{#Of>`X2A)?XVPeLCC*CAjC3o=2JStLqtWC7y%k2NY5MbJYL>LsrPDsVrB z^M#C0)4s5c9ER%Z_PuP7Zr{&7X|H|32jY!a*CqR8_$r75yW6d2IsptPp2%{IZ6@RH z0-iexp@^?5dJCDlrDW2xp>9yibyg3|70h!60udh=1oOD;JRNp8sGmF}sV7r9JiFN0 z;q9V)>W?aRb;c&b2E>iqq26bCfxA7mU7_Q1jw=5|)^-Uz@sbY)=-+(*01 z*D?2gT}Xcn;9qJ1*uR@71Zoy$Q8diD87O=l^M4Vq?*s>YeW!zcw@U}^sRg#?R~k0l zQ-8cL4)3d>v;zzcBNP4|+5>8lDj?u9-pxnj9>2|M)(QOm;?%f?#L%B_Mj(3CkT)?A zE2*O^=L4Gp`(qbQC=l)xLU&@jr2{HFl>*3qbX0~4{|1M&nhKYJ3fHJV|5Z~V6ll2E z2l+?wxc`yYpAITK5^V;*m9y56BtV4-blc{uk!z!)8PoP~qhOO-`~A^rv5BZWu2wR% z$rR9sjYbNsu{u)98ja)i;2BsA@79xlsHdh)kSM4A5U3|bWraOjxg9%T9hqxQ!ptAq ztWL5)&FE2~ ztM~qQtRAGMsQ+G5J*GhQK8x7ZgSZ;HSLNZfy{_I?gVz@tudN2JFH-OdTJM?5zk}A1 zAzi(#Y6Pf5z@Rl2dGM#@8Z;H#Xe!>MR1VihIEHNJH#%|pR+o&`lE|px+Kb2+G5=O{ z=fU3h^%|N&9bsU7JWRuSoHtGZmfMNf?oL?=r4Lm%M&tEc1FL7uznif1rBlXB3NBNM zv!xD1qeXxtYGLqKjL7b%%82CXqDZa1#Q)(zj>Zd5;okY32xISDe#`h?|4Z>#c-4?b zjM3p}z<}kdYP83wM|_R9a-Te#(sCfz`h@DTaby1xieBLfo-r$}xMy{j?K?m@YQPBl zUI&~_;D&Li%51B-2c>amZQQ`LVzgERh^kWEd^pCZZ!IT#h-Kl^k4b|h%@21U85gAs z4V+RTH)ysEy_LeXZ?YgADn(O9;^Uy}^&>FMq0Od&7B%8}oFhcV`=N)%a?-nk@DVqv zXioB={O^8dQ$C!VaGxcAnjw9vvY}!u;LkjRPM$`GriQ8b9Q1{X??Hf34`*u{xpt_g zw^9hvg(Q-dPJ*j+5J~%U*PR4*fdO{B0Vdb^$r>}`1s7NV{neD{xe;=1c$d4pC+GXM zW^KBNrHsO2r#0QZBnJRNyo2a!`pW@E+f=aIcMIgGE zfeu>3S0f*z8Q~A~WOMa5Xp}O(Olv+~#5{&E;x0o1G|}@qJsattp|9G^>=Ckl7PJ=b zTjlYs(iiRyO3$_GFaxnKc74sh7@yXxcLi{IQ@R6kDoa|xlC1I}rNGM8Y>0a#$OgC@ zG$muYQxoPAp$w3K)HSUU`PIgoC1G!qGlt*VYUG_?AI50Mnly=tDf=>LeO%6 zfT2!e9AVU(wJA`8VNB*;-3X>r?_@gFoid#hS@b8PbkR>|>7r|6{%Z7}xyRH9-wmC@ z`W%g`mIIdaPM8>+QUFxC6Rnm`K|M%N=V(wA(Pa}Q=5GP0gVu9k4Glo<)mRCKJe+-( zqNO1ZbKbNST6zW^fJ^!+)%@X{fqP51r~LkX1mAp*Th(CyCcj_G?{@q;mv8&pv!#PC zV~TD?QJA8CY%o)FxC!;scczG0`7Uo=#pzUytqZ@3D82`tJQJsj?vM$8*H%T1Oig*%n0n~kadEMINuWDs4wXB6KpJ_A z9L|P{n~=1&XPpMJoHcO5u3|hPinb5?FX&j+GK_;%Ou+zIS^{}vVL|{18crov-36V( zEFjGL1?Iv+jMfFjGv+SIF=mUyy47MSK~L zgdmZ4E7)X^+yd9P-&Jl@T=}s^M<20d{zFiZLNFFCl{W|7UB5*(^`D`D3%j-8_z&FS zkKn{1XuV6)El`)!UKqC)7oA1>qP!qvnhmYp0?~edXK}%V*duG5khKW*MRBobzMqGS zDghjvi_o^?fOZfr53Ohua+Ce`B%v(cNS>I?e($@74E7%Ry+eK@^1DQSZ;{^;{3ckg z=u`7@FYTHe&8RwbXB*~2$gIAy);{iKy#Rlrb^DSRcTuPLTH7Z=KivX#6FpqM;Au7{ zzJH5~zi!YwevMFMB6O9n#}a zP%n|BK;@T$3RIv(g(^_Mx437r3GyPgKPEuk%jKOl!Nb5f_nHZr6c2`rf7%?Z_D)nE zi7g^k%*Z^&y65H6O(*ItyKcD^Q#@w)Aed?IXJIH!8h03n62!1OyK5^O$v(I8qi_49 z@$Y7|C;#m5Att`ieEXXt4bz>4KfA{QQP&1o2Lvk6#y->lwXj}}YrnC76m>oErTPA{ z+v7`j_nnZQ{QZ>e`_F$J_V@&T2l?N`6}kH>|3({r2l;(AejVU{!AHE+^2n#@!!@-`yR5t{u6$Y1s1V3fMKT|%>pNi_I^N`B;D0! z06o{l;fN1Md>rEAFpjbkTQx$`=#Mu$Y41bq?;X^4@xN00E1BMX`}9Zh_nmfo$NMw+ z`zN38AO3)Sz9+Z$o_+cw8UET%@atmtM+f!4u9Nn;&hGDc{gUbNkk3-DYui5ko7{eV?ff0! zKimEu$1jC`I>GM@yZ-ILFUN%-&u3z&Za?do0WdU>coyR)C*s2yKQ*DL!w`&27#W)|3hZS%p-o9w1&47*W(rPb;Eh2en=*x9Kurb> z)1W)V8qvm3jbf&z~@IgjeiTl zr5@(mFJ2)LAs`}TQAG2qpRM3TuQBtgnqE?5!9}mA*N=+t4CxuXllIKAYon$dE$#W# zmX!A7PMg$Dw%q!n@jR}3k%*1xv3lQwAa1@wYu^@|N=0j~{G z&d1Ls z7#6tg>By6}cR;*(Le6&`A{(?n#Zu%1RX6|>uaz(p`Q|9b?;paIsM)E60rzdV&~38{ zWG0BvrauUVGysudEkjwxP+3hY@~0KwxHgY)NbZcQmoh<&!(Cg%DQIk?%) zaT-&Q)vu-1X(#C``(6w%<8+d5QLW4+%~C{X>G%eogvqHi!IY z2ooXR^v(CU={pefoug4Y9Vi)|C+$-QrI&MjFMB&4&$T`{AEUFDI9RR+*2PC>wY<^R z*cc1Jx`{RH4Lobf`OzzdrdNuf5B6mW2Xzc!@>1AR{D`z*rDgzwpGrG%?;1RHw`u(0 z+*`{s16b3v`t)v$VcDn1joQ58d{GVMse7AvM65xYe@YKCidGUPl`h&G%nXf$GN;{r z#mm*OBe~GFe#$63R{c9ek3wlIEX=P#KV$UO0u?a-!*G9JrFyL&Ri9}HvkMNGKBoXQ z=SQq!^=OOJr@jLbGq7U@I0ngtK5_fu0EBt_Va$7!CWqm!I5~7yK8L%W&o}jx^6zih zr~E9WVK0tL%;-yziu4-uX6YhVbx#y&C{I5Qy#BiUqWXQx_t@o|`p3K;U8uL6LN)!r z6{q)3%6HWN2&sP###WL%Gr}%CQTuE?F10*k#wDoP#rKg3!($UTpV&goAG#&AjNo_q zwm5zgANE0V{PL!Fyc7Jrz)tsHFOC20n^W)~W8;6eB&9sI0BMBVcw7r5DAL#x1R+0U z$0m$%p#MSFB=lhq2YI2cIT=69Z?5y#8df6L4cmM~W^I}e3k7+}Ni0{*Yb*&uDU!X-px46Cx&@0RXMgEv;!^RpHPZA`*8FpHBm-%7>Ab$ zB(x*3t$jJ1>*M0ZI9qu2N@sgqZwQ^U&E7E-PhQ-JFb5xHSiT1@W>q#J81apa`LqlR zJTY6`-v#Xl-FJX`ytC0qTDPQ{N|X7+G!G|d2$xyv#@mc=X*H->%$|^D_m!_cSQF>q zm8{_Yk{MP0fajk4?7?FiQ^%RPF17b z`yCHnrm5?LMzCe=apaBU`(EK39@oy-$u>9`=s(FYkRK%I&5C)mg==W4e{63?g6e~8 zT2YCre=pQjpO_*bk3bv|Db{kiSH+3BiiKMo6E=;2FMC^}_jE+gv0cV)vV7pKc{hV>|MphwPZA2VkCW}+yRb^DMNd?Hz2 zldK?-3}37G6_jxk8WM9pQO0_w6aJi-U#{#e^UI0gcS-ZhP=ZaKT{Dq}&1>~O7NH6{ zE_Cr-WWtcxgrN@ReD;rMW+!(z2z>r=nBen6e7-g7_mTVJqsR@+`h5q&Ht*wmuHR!5 zMmmss@&_kUx_u}xg00-YjWV=mb>#4EC&MwERxhxjw7sb`1}6$VuZ`7s-j5}1QoHrH z@ibC_)w@EL!X8LOWwI0w^h3MdBun8VV-xzvQOs056DZ2~odE|^h9r~danZ9W^a#Tj zA;)VP+aKxdD{l4-@?lW-`lc{un@<@O8 z5j&XD+!Wc&vV7$yogUHYjicYNN^c0LvsZ@jEuiVx-Z2eX`k|KaEy&F7m!^Q^kw$V@ype4MR`Ng*wGAuy zYub{J1C~er(Ou^McWP}GZ|48OL==tdSnby$jfi_|djB0k=o-jpUqmo6;rQ5u!8R+# za_8x9QYZvM+S=!bBu+dczWv4I_<)Vc@k7=p$M>YS)Fi{ZBIWx4sMwwLeKn=L z)b<~dg8%PR@&{i|hId8^ej~8bcb0eIOUdz9Q{ro}M0KXWA_c$H`XBN_a{4n;>!0#{ zKnlM5&`%0|T#*vLFr__%DfsS5>EA0-;sa9fIV7q62kfuo@Rf%5$x&qZ!H263QD7M7 z^N)I9GX`U(OgzZta3DJkL5S9HW4@vmZ{p{z7X`$Jb%5gh-md)bLNDo(Bt5P73)uY3LxwEFhq zUZx(LJhHbhMF{~q)Z5|?j{mXbkf8M=c3pyHFAk(ukI%R)5Cg}EY=Ji-= z>yPZoN2%k);3OOlk(jt-u=`6Li90!A49Sj#cQN*+^l>!Ghid(HXWR1yf{1=m2AH%o z458<@XVa_CPsH$Atbf#L2ZCYI_WfaaK`Mry{E(S8<{#T{20sDwq2dHArwR{u`RRC< z@b}Ozx0zfd+-3$I!fj4x+&ayRhj5z@03tpx0{@5H=1KwvxB2LMG_c_|v-qwZZu30S zbi!>Gz3kvNGuz`f#VqJRxJ}MYsoduJqW=qSvj_yK#sZ7>xlPcTkq*zVbWlR&bAkHB zBGN&9G8cM0qjN5F=?VW67s7d?1L8u5ZP*VNy7Q?2kqgb>aCChqT&*TKF7!3HwEDvy!-aU${7)U@R}<1SKy&Hznn(rs`Q1_A>_@zCY^*^Kb+w<|&XC}6yA>{sScTO%Lt27gJ1gT=v zd5anuW5YK#cl{dQ<{Bcu zOTPUUejGC;d^mnLtHUJRL&6((@$1Es=9{_9^o32Z4Vo`~()Jaqw{BlUmZ*825dL*Z*j@5hvB)eH`L*2P;!1-8DOk~c2);BLtU`_Imw%CKV)$Yn#N$d%DXT|y zNrQ-9#(6f^!ok}HoV-zL%k?~i)*^X>(dUMgqVzyTaecgWobbI0>l^&!`EaqfI^krGL8~W$1cDWAZZ_x1k^wLBf)!ICZJJhFz(rD2-0rHP?LR=OY-O%O@RoO@q*b^< zI2Vj!tGWPRD+AF7W}>xlz_=l|VpML$mGJrn93J|reH_HKEF_E+?v$%?mJoIA(KyjhR|zwQte(sUC+D07 zCYmfk%dO5w2B53k`W&X^A`$0jD3n8SR>x+;`5Dky()k(i1JRdd8D%?{neb7xAxr(e z+9>ex#;s-ZGT5?j-@X%&7_#}U*gJOMkF!#{<}Z{f$u(w$P1*%)Rqc;60IxK9kmW$F`)0jrO)%CXCgwMrvi2g_RBCAf7= zpWur|nN+>D^;=9=*Senl*Fc`S6;J#zfdbN&qgL^3rAUu%;Y0lv*>p{-_*Q%QNB=O$ zy;P1o%k{^V)Gvms_+qu|F2o|?hY*Q{AI2|+s?;A@s02L}e~xAXyK(i7iP~3ELEYN} zQGny(F&4fJzi9V!J-jdpTfFdUhE2(E72jfcjRzb|q3X4c)>v4kTcZ_UsJ+rO12 zyIveG^S#r;lYEmjjgHTBm$y-|V{LK|@}}A6r=Y$Pw;SVvmzJ&sw6fO2=MVGY5L)GF zZhZ)?2BRgd`N$fKqO@jr4aRULJ$Xu!RFRg;Y&`%Dpn-ddU}OCqz`kg zb)|@v!hQsIv>;^H-()f*7cBeH9du8|x&5hGaG5vGU4rv#2wL;Ap@_*HzboXP5L4-Y zJ31{~Tih==e%B2>#RRiCeQYga?t5!Ds6pkmMIN}kL?QeauoiimO`I*6Ykd*0&L$#7 zWdTbn;Dfux0cpiEgWP`%;;=l*bp@f?$})r3ptXh7%;r54OM>gYp?!J?}p^CYA!MaH^$v6Cwx!z#K&w>>t>G<=^^;gWz6mYnZsS4lSBg9)R zFb6c2$qD44kG{p^+Z697>7XFW_u|YoJ327FzUUOw>9`hwbD^AU&JK(8F*>{}<=zf>Y)_74MbsRSnB&5wc+xZ$&zrgXyBk~xOiPjswb z5;sd|4tdii2m2_ZXwXM3eIJ|CsSr^?@*sAo;h-q77BPHiz{5-yjR@+=V#wVxTA2is zMJ8gA@XLtA!mr>L^>na$9?DNco6+N?_QvCn`u2(-7R_Q$4*sv`FQmY+Z{9gf)c}k~4Ib?tg->zLMlGpfo%&R~>h*7X9xT7^fP!U1k+l0*xw_Krj}r!Y@E9A4fVPRDzKHRRrZy8-428m;A{PizTEltKYgz?3|VPgC)FeS_owmxKA2Mn;qnt|zY z`+x#^sD;E{G(5aT4C9`0V3eG6urJt+KQH(*%XfFeR!PUr57CJ=+r$8d*tp zskx@3mhsMrh5G^O$ImHML(6VMFhtRGAQ0|G@2D35!NF)sF2cyEXKp>9wd47?n+ELE z|L#HT)XNZr@D@b`lkrAm!0=v-SR@=nBo?m2FS^M%mgu8Se=oyXPCK{cWXxP^7}|Ki zNiZ}L5s)Hr;X&du49%XOX%AuFloMrY^<+%=nI_;q>VAou6f|TNcd`wl^SM*UJyA<3O*&d;0aQ2v;a79 zjq@qmnhGqgHahk}e8qICqI!P%EsiM6lJE@qohH9iW`tyV} zp4HPkuDSuu7+??41a--$;6K9b$5JrTNXw$X;-0s2rP#x)BQVao4c-?2*5Vh z-Cw80!Yqr8qRX6`u8w;PBNNTX0RlD0xPUdo!!->DasFJc@8SJvY9?2Mxz-`MP@(9| zzP4!#ungP;Pu0+!*zhvd&Np;J$17?0;Q>`Lih8L(e_}7aBu_;u<+W3ZU%g58l0f`^ zh``*RA#PTG;;*(n1S%3?>VTp4NP#+OU#Oq3r8z|q1cAtxO9qVhW^Oe5Tg5JWA{S)3Iwv(}t+yCE#tjL)S z>|?0@96bz!T2*`*`?tm3(3d{{G5xt_n9h zTk+X~eMsfne-W3c%>NL1T7V=)9tsE@i##P$DDo7_?{DPyGWoq&erMvBa)|wJfAR=? zR#6`Dl0q%lub0^J2p2uM)^>PYi-?o)Q&4BQXaHhAJZf4GD7N9K2b%bRqBaozN71G6 z!|#K5>%_9!UicOr_#u)2_$HO}^>+#VJO~vxBOV6TdMFOg`kjCqh3yfz>8n>?KL}d{ z0*`k8n3TPs*+m8X0(!SE47@~!jDL%K>p=sUQXAdngVRChtKk7JH#&5AZ3~JUi_Hgc zXfV3`!k`sOQ)m4S>Q9EOyU5g{6EvqQ?qS{a9O828!2C<#5g!`6a&-lMV-{@agZ*V!Y0ue$DKw=fwPnffzywB`<4}*H&4HB-lbIMjj|3;O-2VWe2Q6 zsO^e|dpl}DWQfeG=48sb#-dipR|T7l%yd;%+`<<^|6Z%;F8*AiLn84A;wxiBMwEk>rTS0 zcmZE24p0@J2bB->bPHK#(8|w(Iv?l&N8qzLXcYs2y5RWTP|?NI2M^dPy1hv%y1h06 z?(#cXt+~;PERGuU?k0ccH z=b^Lx=+9OjE05+uvDO*48vuahc3ZX@+0L(gYdOYn#d51}9l>IA5!9)QZY%_K?m!zB zM}knGbCjY9O4^~w;`BPd2RV_p3G}E)2gM70)}Bg?Pza^)GukfM*^1fE@3(us1I27n zZ&QF!9V43PKDUYPUI)=hb&QfYuRSGkNCiQiAiE90@jHd==4b@^OV+^nH*Ro6ecw|{ zjc|hUev2BWQr;I}=AgWln)0fB@Egn>z zN;W9Z3ndpRP)utr*T-dC8p>sL?;#lRkBRxmqLnoNZd-);uap@^Z2<8%;&yHKlD`0M zZWJy*%jBwGn$#f@_18O`r|@i2Zq#4sb+4uXOm3(OF?hl5ua1N;l<+YdErRV;_#13t zV=v6~ahss{BKU3wyOG@p7~zoJWMe!As7wo?A?KqNi@lEhiFx;F>g#ZSqBtG%2qt@jb(8a$ z0Z-W%@Wm#3(?S)ehbrc$URd0Z(Ousu|0|(Nb@1C;piB5~35oXgXLE`huUK(xDGxEfFZtM{94st@DdwhDw*| z<)U=)E6X(vL4AMZ6ohbpWX%7q$y$#rjTkj?VZw6#;ok$1x*qD7oN zwpIg8r=6*cLR0PS=3epwYM62+4vIz27Q<=fl0|+2`gsY;XmchG9r*}`0VK72k2G@B zb>dUfrq!&Y_S_o;dT75|d9%Epk7!tb*Ox<5g@AgZQNe=ajcU0by^`&yptkxGLf}n1 zV*dY9{Hn)n-iY)fjzPxL;@4(Op%dUntCGep5v{_~#c;WWRv{ab*7UA{NY+kk&Rf%d zYv%DiT9Z^p9TA){!~e0qe%)?OP1YBP?LK&WA=90L{wNKMdXvi+#{g;9Ht;mnqk&sw zQ400ct6FdBMFyq*ju#ny&!(RA%Qt|adR2bga6Mh6+JoQC>T3!AM}Do>ndVVRvq-`> z;&=0NXS>t7dG((ic0QZ&eKY>JKEWWmWk_azz}kV+uwHmPMwd~}pcPBS!WKO`n!v%- zt~W5#cwAp{hoi#Z#F?zl-*TGn-qwUikdKf+PI!4-pGwf1g?knefI6a)eV0FWeI4UOfLm_s7ZKWJqs*f)6^5h~#hYrll330NAe5Byl@EVY*<7y05cvGlh33JK#S(-0RlB?{+AXu=YwX(7jqG=q8! zxec~!vrNU=L()F8Uzbk#^-|M5tS3MnWzspYor)xaEzY!0L6}~CaCI5n81zyT1wpwp zo36;pHhO2#CMk9O%4><9z@oK^&~ZQO4QA2mpDG%3O)I!ypcq$l`-c%n2$t%l%@_j} zemC9?k~2j3CU|*V-~W-Mf-9f8KEO`nar+K-Q$2CzYb`R4_O;zriFCM<@Z4^=EM@ww=CYL0YR+HHKCB1>+qRtO zBscZ}&p+5p#kk~$ zo&2T23a?W3{czV0T4(7Cdh*5*C+y6b>jKbjov3CW1R84Yrpz?jUyZ31izEM_m>+Dx z%AYK-%mq869kANvbLXpL0Y`WLm+0m;QZk-BSyfQ;m$NWEXk@oN&#nwjB{y6M!l25f z3aP*iF>&3Hg_|yi2dz(W!)33Zljphkdm#Fh7OhX=W+O=R@at@SN}5oK+*e(QWk3$N zU5-BH2B(b)K^PKnS!+-Ck`rVFR_pW`m^5E+M+q}P9i~feN*ob)CjI5R) zO^Lvh(Q#N}x8_=D zA+Xg9gdtLTa>x6#uyDlBsF#~h+qI#4@$vZ560p)afgg!*15)9Uo_lFpZnq6g)&~tL zVvMm*48K)$7}~Q5IH=QJ{kF|l_WAd~qMKj=+^f```o=yOZiyWVR6x8*#^PO&azj8) z#X17iRzWoq(gq*ax+=sH)?1GL&^b+CADI1CAlk|Li1u4Vg#T>&Eyg)UlkK-eCnVNe zziMw`9<4%-j;yyf+}??jKrhq&1Q3a3nzrD28mlxm;sU*tD)mLrEl?FP3Qk<2m)fMy z1=^Em%L0uyTe%e_c>!ayl@lrPQbAb|fY~urMELW}&8aAXim130c3ZV5mP(=m(MO88 z1efYNAW=K}M>@u~+G--I#%fE#I1NcKVDw_&34$T9s{VBZ^0e+@fe^5Sens&!k%}Kk zfC8a2mi!FYQ*ZyBnlUH5gD}my0T8GaxC1~EWA~*)fhY_NIe>lZW&Y9phf+-cMS5qs z3Li0qJ&0lmuS6^seiFYx=CUD$A!`Vh(U%P=2wL5TkkkW7q%M{iqHkMOg)9l;&apo4 zh`u|rOZ*(l&W)<@Hk+=$ap)R@m&O;@#zcL`4&{96Uo*4)0@FLES*zJ!r2|XnEZ$HZ5a8v7GJ0E2h;) zzt}G=2il?K%JyiPnug<7lL(>ilxZc`l3ozSr>%K{?}~;L&C{%n%#@TPe!Uj&q&7P< za$XgxMQqIAl9$?6(DfkqGB+wpUD^;-E{|RZ%R`nB-yyhQ4Z?C`vXtaSF^a)Sr6@`UICT~`H<)!H-|>Z&fZk$`;84dzio-z zBtx!UOSYC))Z1E2yxQu^S`R51P_|YhIX_@6CX)81^yL97^l`w-hfT1NlY3l07IHFo zM?Qv}yoEv~<>W2St2O`74;6x>yl5FL=5V!U^0k@^@l{L7JuvHTQG1$fDft-)nCpeH z)%okl)5y%uxk+nmo&hJDgfJ8gYhwPjC?KVlUz%D%fAA$L{S4O+>VxyeDITtzbx6|S zB%MgoUt$7N18cP;t)A18bX&~-C5p|jbHYL~oxpm6uo~9e(zH|(yLptRq>@*tXyelDHm2PugpwX|K_EVx0UF_RU&xq9mmK>F+?8DuOK3 zh41N$H0Gl}KGT6mKW$8{0n~{?7E65ZMOo)dak35q$(nV3ulahNpK&+>6?w2n%Qy_7 zNM65~HzRF3RCj6WUS`J}We_$ho;ri@CnYw*Ur30Wp8p`EH9dS6cW7vEz4od7;5st7 zuw#G#+tZ-?&0SI$8Ok06jgDs*g3y_ub6XIKOc)rOKvryuOG9y$!u%Y(V@s#weJiWp z^a5M1n0HElK~5I)Zz1cLEUd$5<41Q2>TZHs4p2m6nB+AJc()^Oy9@Y{Y8Fv2>+*l0 zaX1w=0pPyt@*75S!n<02FURj@HCui!lHYv!or>Q|6_nqJe53!F`B3zY(Wi!Zu?+=n zQZ43o45LeC+e>!NDNrauJsm&@L7cAQ*hlje==G=GVFl6W#rzk*JW6KG-tKT;3=_+B z%NLqkaIToO$dI4IKyZ~Jxwbh$LSb!di z8Lv>S!A=k4M&dm1F<=RHLXCHxOyMI#!cLY)n3IHOs0Bh*ClgHr8QbM+HMQt{Z=*T_ zOzSlCQVl^Zwav(`?u}N?Vo^WUH)ng3){wGOD{QXan zAo$Pl-g)|MHj?J+w_c9N3lZjc%(GkiEd_E@Ty3;->ZZANB{)m15X7lW zDFkt{r1Ve6M$wg+D7cWx!Zt!4a-qqB9(BbTA`=-)fCFxkD)Q$6sIa3&oTO^Gsw-_A zo`vs=5%<04I0v6Dw_3zU723y{MC zT@RSD_+F=uw_C;|Qidc*6w}{X%zcm9OnqOX%R<>|+G-LVXAwzY82dcK*w04+nD$6W zGZ8e5Js&~M*ry_tVC&z84dVlqu*?a%Qqj&6#h`(%RAwap-;0=sKbdzm;k& z-#GuJu1|c^efho%d@}-I&RLo{H?a>b*UJ~#%(;QpM(+*h?jgeXdWbq=0X6WAarT<6 zHlWu~XJM~iHStcHy-MfG;&@dRGRL(MY+am0W1|u*KuVTUNuorD7cResiNwGds>e@?q}8*7nC3GXIaZFM)5W*#0lj zKoLvIQmKg2r&Ul?s;Hp2wAj!@5~)kIDrj9m^ojOC3)LqQXbZ`^M(cv&O5N*wF4d<} z^r2NSt%6uraIepWTkBF3p>Fj5{hpbd+_WhH-~ZRor#F+EJLk@vIoq5$b4C^!g!6o% znS=C+-wSZy_ZRc7Mojb05By&EZ;${F{N4(r?Cyczx1o-8;P){EWF7d8w+A2cv&q4G zNSEM<$^Rg8^n-olMJbS<1_#X`gtj0M)co(&a`^WsyL>~fh{R{GlZ;lQD+lP{eI0`G zZVBZc7ydS&6mT6Cb{#E(1fnCG@r0u#wf%*Ym0j!>7SnPUzegA(e%7p4sEO`-njIVB zuDB*GsdT2%Tc)Y=r>nI5Ir3vORn#cmU~N)f8MI8wQYq1-yapwjlq*wt59?4_X!u`I z3`{yGJZTiLRansa5_rPcqoTE!v+`aPD_RGZo?r1xuhPM}^-M8K|37N9-iY5;W#WeU zpQq43G(a5=C3OO zFntM18q>fstOXGu<{z7(N@PnqF^>eB-{vXnp^2@gXw#bz>i9ho>U~ss2cc(NKljHN&z{004!%Ihef&@!h%%jkP5x5o>}|SQc7_f3{SxW~6?Nf?6|dL5XXI&gW7$ zq8M=R70yA5ZeXu%uiSbW_E7pl`~rijz?}J%UXXERtKr#~FJb^EP&$ZR2l48cJ&lD@ z&Xb-?uSY3RkQT-hFc`2k3kt^InKBBuFMmUnH49pQUZJJ}s{7g^OH9itpcnJKC+!xQ zu8TJ%-~;ZRH}6n&qk3kSjlnxu{ajY3=$dyJg0$eYj(7mIa+-(Jfg>Kk`H-C(%!5z| z`iXSO6}^7}lQMHaS9*4$9kCyE)s2r)C$&D#>qxn?w_Jzdy53BcazDBD;vN2pzACg< zp($yhnno4cyl6;sjfMwEz=}_t7|f9a`J`TvrtTk6CEVt68jihD47!HFh#Z0v%(8vL zE)2PZul#^Iozz75?8kW-Rx;<#nDN)J>!&1e<09!bm#9O&v1ZMe5$5_qsNlw2CDGI@ zPD`}JvpDKd^UcQDf{ zA}5D)_9B}(!Di?t*$gP24*6yA*iCmU9#a@md60c}jKnpl=9pz@PBk#8y1uLP|1FGAs>gzR-1cbc`wakD1Q!&ZB z6~ZKya(rF5QXpV_Zq4#ru&o^1uoWYK0FW+8xrK5i8R+qms|8J9%$_cPN`-)&s4 z#uO6q4q|)JS`PYoYs~RDc(2+#Lat+Q)pTKfbhXDVNms*;7>*MPEJ>G-=q&D7g{(_6 zo+sWFOZEe!57X}Akz`3qyZ5InY1a=z?roGIuA7(%#Taw971eB-+p+x}jPI{5nlF zbY*H1phAMe#hSVuHv{g$;hZ7S7o39^xQ&xjRB%X-uiC@*D(%Z1sbBSodXrJ6o`EJ<}-fmM9dVhPD;|ION5f1I!`mR;dlZ?QqoFCElS|(A(5WX z1+-S~!azR-!?3J{t|=4hFShh?_~F z>CRhYsR{_rttVk(5S~L#sZm%Z!>4M@LJfu38&22j?FuE@Jtvqo9Cx5Hs1eA#1tlPJ zK-iTEaGJUI2b8XCV54&)5oP~^ZcBn@Ry*&!?)(FHKG{gvuw{B*CrlfR_iM8Z9`X=0^ z`-T^eTEI4tN>j|6P~VbX=vIG)g$SGMZ#4p4*bn7^%NfQdsL1P2m)Gx14CVl$+2{Tk zIW=CtP`O} zE~@^=`mX=6z614xWkX0_U2TtV&er4wEPRc!wmm*U5w=IzH8_fem#T>cUq0uN7X$B{ zN7ew*-B+NVUBNkH8;(w^HoubVXSl+MQu#o|fq6yNTd=h$>R~t~=Uax;NRRP>2VrH# zuU_U%EW8~FDQ`#6isxb^i%WAZT@L3JM9DipNfZ82znSnrl?f;#|z6n~)n4u{6IR zmZq>Do7vPhO(g+!WA}_e$ z0qoa#1iKlZM0j4|N=zJJWUi3&2{xD~AcPm1=M0U#0s=(m5F@W5k>G0Ot$2O>4GnA^ zhF?82WuqEsj1KGl4!?UUuFi1sSoZ#$`D6p<7-~mT0kj5|fksmuWnvc+6wgxbOIo4w ze_O42h4ID4fYuN`Qr%pc5y{7KuZBtS6sUB+LotJg5 zso!}8YtHYXCi*$HdrjTXNvuh_=>fMt!#^CqpV?QUW}hBvCS&6iYPyXzy0QmTEfNhH zLL+74sW4Kw2m%6bUGqo$*AH|qUfc~xtj$B~4&ZJjI8AvW-wHDe>;p#dJqa^xWh9s? zc@Ab{xyexNPr{H|K@mecYDHsm%HfyJD8(sc$slOg3LQYDn|dfkhbc3xuxVejA!9SneS?^>`MtTc@|z~uDwG!thU?d%AX~y zo5{KX)TMX+Oau!ehlJ~gu%u(?o{7S zBOxs1N|e`|&r7*n%1=nSR<8Hsy1qL7I%m>H3!F*k;?pWGyw;ht3jbgH9d-ad55w<2 z;qy{_-iQBVuW=?_h~MtRXEvX~2LB*ZCS2g*IGhKUG&v70uZKZ0 z_e9GeY4?!;Kjh|WH}aO|A;db*6OwqAJmVw}RuteyD=?o<0|n)V@;jMg6I&IzeWKa) zzQsvss5GlrTc+ZUI>a6~0JTlzjIgVY0-^3j&i=B*xePGU{QPf#xO=BPNL7$uq z%Afmb%1pQOx*w%A<5>J9YAvBvJskP{4~Q4ji{?}_SIsP`t(aC)k0;=kBGw*=+Rz@5 z;q5f8ZUJ^^&yoya&%$h*>&|tKp4*Pg-&?SPFPX%rT`+wO#`x!oj$Y2&8Y;2m3qLBh zbtAdJnOP->{k{8*tR(Xh_#<*FI`=F)R&9Gm6HBm^9pF|V=mXeGKEMCkUY#?`GTfc7 zNtPFGkG6geC#QfGa09r*rf9!&&=ko08GaB=K!^rEbweGnrm&YtRLrLEAGFMlI_DA` z;Ha2727S)O@AE!58}3Kg!?4sMvE>x`_4pP2>|KVQ$0RUDSZ6kR)2nPKEcMSX8Ife> zoh!lm(IDx$7xGBg^iq5v@vIdj-Nzfe7=67sL&r#0+ww6Y0C~T%EuF26Q07RMjD_TD zg!1~&pW_YXXL^h-yTue;F=2uqW9l=S^o}tfHW`In)$nrEigvE}Eno6$u z6HQ&_v^8~}UTZ=p|%tj?q6R;Q&L@(e=B0&_DBI6?6S2LQPWe|_8Gn;M_1QrHjL{Nzh z^YIt@hvGh~fv2@_Cki;^|Nl&optQ`WCa)F9onNSYQcX<8s@Or@Th(LhVUMo|-` ztN6Y9CuVNuGnQ zdbRaF@-@sG)254v8HA5YW~y&iRM17l#7da|lt99KFPx4fj0ihQQ8H%UXp6g@Rqta? zXDng5KRn>9?2Yk~coyfF6G9ULAsJXSNtC{NT>0BJUzf%G_B+C zYZN^zq3ey?h@Q}-pB{yH=q&4B@#{cm)qIqrk5%Kb&?Hz6PUq5NQFbqfI{0I*cy%7U zNqcoXp&R`GB=N;d>RAdE)^XtrWZeK#Z;DL4dd>L@re3`;^=hC&MRw%Wt8OOdUR(ll z)#*tWMvD`=lc0FiqzgGEu+R16C#+p7?Rv*KbTFOs?Rs4RCUJ~CCX(IC*?)E>RUQDf zo5OFg78uerpiBiQO#{m828b!KECN88C#DnwR+_mXWWlP|uxb=67>Tl2(bY%e%d9mNYUETnu}tb zA}T1psJMx?*y8JzVR`BzWmwjPUDX)$!qFmC^}IGMA*?Bcb&Q79Tf@o}ud=}mZqYe% zdqP+a!urNg?Rw6y+68;P9pcvoQv&ukQ~lHl@jN_7oeFY;ey&06`adB!m(e&Y#an?m zrBj?sKC~uWOm7lFr*rXYJ?rXbn`P2ATftvC{J|!cE+Z8$KR7Q>=l!ETj^irXp=hX!3-nWSUPdg&_t7Ttt7; zEVYi0IhS5t|K(U~A-@wPy^y~RMJ(h8im<|aCMv?Kb<=#k{$&9YhbSP*d$_Xq0~(E` zMf{HSiEr?Q$Cnicre$3e0pbM^hytv`(nC8(L702~9I| z!7Zqlp5e$dl{ux>8=AAH716xhJMkyyk_vRxV|;2wH6P7PLe#GO^UL9=Sd4gd39!JZ z<~(ZWP&w9xH@CQh`5iQ7vfECqmsqihn{e3kCUhhXjAv}8d#axX!i3-XfxL13}3AX zT}!>C&KZxlr9$i1V)yEDt=>@R^FeOCgm{F~@4!kH#n{VU?q21Jv1_?jdVB)JGapYV zrI!kEzT6!DuvU5;89^fAq(txWhG;(AU>~B6*qp!w5ZfjULOTtQ!c8>7IXNjZQI6AlTe6Ml)=jYb>b5rzz9^FC z1k(89r7Ffx3=6%p31DqvExy+O3hZrOU#YZf(bY=325<^!IeI`(3U#&R&?!m??rwrR zL4)hBz=3lCuL$sxTzg8iM|(5fw^D;&Q3v03cWEIAftNR z%fu&tn*eVz-t|7k%jPhWqJvf^ko40S0~RVoqKem@%U5;3ILS3FM5PlVd6+^Xm@bEt!`Wmbg22&Vsfr8 zhf~zqz_G+t5-*F^Qc6cp*h7TnFI%W*&h}H2Jhh0|&2r~+xqc+q_i&AYxYK*uwNc6Q1{@JI<;hkS^ZP;yQc*ep}2f$KX3W2i7_QQv9#M z4>gkC-xZp=2U1K`ovBky)tJ36)hVVRaxEq=(S%=Y5q^n%ttAgEE;;5vq2&?IOqqks zu{@j=f}I>!O!Uf3uGsy2?wmOnUY&VDraL$^B`>BJbbvamAsr#urC}&g zIzo2>Z|PIUD(Uz@KBc1rw_JWL9r*;>cQBq%?Q_Vx_Ga_w*v&&KY33&41!57CCET$v zhr3bXs6|E&7j3U8Q6wzF+L|Z$ZDbfJV6(RaXqwcx#r0A zI9wyFDTSDL4HL}CGjqV4XC7!{PK5OTh~2=nQ6_i|ACq|HI@9EQKcNYH3DCT74x(F; zyjq4S3VBuSJ}WlMwr@eSG9nE?L3p5ng!0xWFliBiXcVM*jU1#NYfvUnuQ?;!p-GtO z=cWN8G85|q8H*Wh+UTS<79@6jyO*BiVp z4gVR!K7AGQAReO&?~tiUq?)SyHcE)kE!#+=hb~Yw+VQtoZc!Af*Enku!lHmRTdq~g zW0RdCF-#Foi%XH$nYF0L_03Yur0~A;g&^t;LHylP%mcd4!cDt5xw%X|Rr zkKv7~$KG=ef_lV}%j`@mTY!MMLX&2cT2?S(AYp+V;yifRl9Yn$u4bmd zsTk(7Ga`z;za;JHkI5MBH%glz0udlQA|IYlY<*H5Bi@1N9mok&Lh3Jed$ zug|mGHmw`~tvo%TpBeD+GFWk{&<)3g}_{`aH|98`z1jms9pOx{Xi` ztHY4Yx<(k7%%>yS%+;I8zAJIHv8=UT6mbqTK?hAhE$E=;{VW}n34Zl3S2be>8TB&( zr-$cF_@^Ilb5`9JbrbCChMS;h)eeNdJ@-g6f7OPJSllW!l5;%#!b$0g$mApw^c+mk zkHr@`UmQU!V^I#|Wu3yK#;4#2Ail_p4q{$ZtOHrp_6*vCxS7LwS>^!QpRxNEM;~;+ zJb%8T%0sT`VsX&jK&rH+OL$jAD#xcuX6ZKv0v@I|+dmhN-?c5^xXLdht0ZW5#3+tX zXC4Hj?R-26k?YT<474NB@^VCw*nf--iOKjPNQAj`3P{C{pQJrBes;G%KVT+co;Z(D zD_6k40Q<|!@roSK$?oI(A;SB&1&6LMiggpOyy$Z<@RAWURp4o-(# zgP*PpJ?_N{Ay=2OrOj+^!Xo>g(EG&}9N(5i*9Qso%V}y6CGhG*R zhYNyLHZorB_C>%#$dQ4_N(_S^uCxG#r5c_Iy3}egJh)x%ag9i5pPIZ*n%F& zgt<}W&c|27(Vhj$l_x;4oAD)3^)7zEDOZf*a2t1S!iQLk2n0K$T_zF?zHTw!pTZ3@ z%i8%Eqr~>Q2kC2HN@5%Nb>nncW?p>+LTDNF6o1(#)3^mku)ywJSPWNp==OSf&{uCB zktQ@d9mMFXcTfDlS$Q!0wTPF{hghW^|Ir9&5XT>D_>q3dEGV+)m4Cc*q1Tv&Q#HU) z9zz-cGs{^y1l{j8tdRAf(g;cnhYw9edQ~D3)P@!&8xyvKa1Ir1F-wpbK8(AtFW{mQ{_C+gNSlqsw_&iV~5i07q0MI5O*yqf{E# z|K-T6pzZV`IWh}p*mOBEOC><4P>n^ax*nYMz&Of-k8NkzOh(4; zWSET*yT~WoiKtlwd*bY@*|TAcz`r4$H_evFCws%!GLPxu1S3Iw*Auj`hZsp}^%+|7 zghU%I;~;r?Mi^Nqe1Xm_D}$p>)2iZNGduDj;4vvztQJCqZ&JQPc#uBLUuLti)N~s{ zs}fy$yiSWORTEj1TQQX||8oU9Z2=-x2%ud&SZgIf(0M)&PlvyA*ot3})YW51Y7{G9 zs*YD=pyzbpif8vkCSh3hPDh)4#v3@B4FTxMJ~}6$=7=#+#F=`-3YH~N~V6Z zc?;O@O&nhIGKH0=^W~HM$M1;=pU+r}19bFLmlRkB(UaXEMO)N|@ETpMRU)5c^(dr% ziAF+RvS>6LH^Dv6`|!sdP^r)~S(?;|k9h z&nQux7u(WJe8<&ja`c+gXge8I(9y5Q5U_{gr-P~r&`flrSbfZ5qZ=F47}*X5=Tqjg zQ!t1?af&*uAS7L-MO{F4Tv^F;t8h$*I#BEKZU<_`3=8;C4+~G$5-cLZ&pUCOj|ch< z7^~z`4~J`s2q1ah3CuxObdgO3aQFC(W0+pc4Pmq#vZO|(0K)=r_9@o!S~U<6GTcmh z-TJvDr1EpdHF$#gIOR{DuNBD8i8)>?n4bZtaHev(>R_1sJ~am}iAbhH&!cd$&eswQ z>+`jwT(O#H=5on0eg~}(`{vBc;H?6k@JF#rbwW3(lZYgjaJHO1OAPiuN7Sbf!uOY2 za!4?vY(P58Y{mjC%8C0#jKGzSBk={M1Fb-q4hP{|pz3{m30G~z6_oGu>m&{mn;?A9 zSulZFwJSFC(h`9lyjhk$RpKE9;vp&<++IsIqyazU5I`QvB%*?H?v!|vMNuekvi=Rh z(RwdIAf;kMZ%x^ZuZH+Z27HeJMI9nU^XyAuI*O1f!B-8&kD^#L(SWbKKqgLopt0;T z4#z>1Dcq`Fpe=^gE$DIHgqeFgtCpbT9O=gujl>fcwQ0G;(O1-WYG%(zYxX`=7-6u@ zPUxF!thJK8mkyBk_IRr15+O;IU;f;kTL%_Hb~##e(HPYLn}uL+fV1*8_OA;A?hEtM z#(=e0Ij&n(j0eqAW>8ypfPd;Ne31M8`e~H=e8Eejychp$JHp!u`#pZP7zWxR;Aqk! z;PG}+Movi%Fb9C&!G0WNbMp+ve*DqSeo`k9`whV?#(e4$#eSnL2-;UGL`L-MtLCAkf4~`||7cRDo z479!lO}2>(mCWQcJmpsN3;f1MGNX@;MG^iH*U^?!XNr`V;U^O+Q}~1`=BP86jXz@G zRIKSxf#fn#s`~6lOnNcX=SgTyyLb}X;pXob(SZ}HCSoudUj#g1GR~QE>}0&Ym<#&@ z-{zD&MXtT&S|j(jy~X>_T*zm>k@A;v{Zy`-^QHub&N2Mv}}l;Ylzh&&lvd1JFr`IGoJT`W+N_S zK@&r!X4i>b;lcz?4x6g+h34;Jg-lgPL!&}d`XPR5-sO?lsZZw}1ete zP{Jn<$E`?YFrR>>d8myeFVbr=jH?%{wTRBZR~6ILGVUX6wTr49M9eS} z2N=iO3+oUc)gUv^RuF)oANGTW(ECvAg^8{z70AHL!jfSPS>(2`ShX!C+S9fwrLd#PZ=9wQOkF->R_=jR^gThr|v)(j47p;Mb2 zwjn#hVe3#Nhry0}1;s!9Uul}>GP?yH#t|WD=EKu;uc8uM!Kv18YP!Pdx=$h+NLtffM(RM)qQlj= zmG94SlR#2y_k<24JqAyxabqB9wfX(ub^j#FoaZ(oRLY7ZEl_R4Dq7dZS-drMijpj~ zVub17kHq{tiWb<|^ORuuZK@J1HGghP#pe*0<`?HGSWjwLnR-jb?n=Bn3G6lv>>>>; zBJp-}gT@&I=Fz~?HLxUZ(Aa(HnMzoHoRg81+gX_*Y)NhSO=&!i{<{gay=8*^|C%t zZMx;oB)J|h*JI?Gjq7^zdrTjqwi!$D>@!=;<_Vn#z;?tIdmaxBlaw)=Rum2KP;5>C zt6)hXKaIx$rW*a!&bcM;!HH@(k)qjI`8tXft*Oq+{iT3AJTe`*oJ+HK=`Rl*hFhHX z6wA&<$P#WwYP|-F&&rbXL#$V08{=}(SS~-rkI#?S!eZhvvm4A?9s&Zf=u;4N4!Vuk z>9r~GjKMKTXvyM(knoH-GK)EP#N~>tavt>NbLMa0x{+JGsz!^hI$!A0UN7-|?htnG zPuy(9+5hgYc+=^g_$$)VBc@1vTzCkc0A)4io~ObWV5sWqV23^D6Iyq-CPZpmE~&CdJJSqfqxLz zWFkfupnf_}%fmkOS|F!KaEglLiR>qHBVA$CQ6Vq4*)9z>W{Dr#a5X5v90wdQ=&bV; zCHt(PvwC5?T@HL3M_8K+WhSdbF|`Z^1tqYd{-8trU#QD=%-8K`54&10I69b5x5J+h z7CqzU1#AbY&$;AQI!i-^y%HV(S1B&_4Xx*+0=70K=Nc)J5`6)_SG4Zwto%2u#){V7 z&dQs?PUH-bJ;=jZ`3?rqtU+~d*@$@0RrE6t*8UaTaVUNk?%>|Va!#YD$}Imk)~B;) zVnq%tHd^IvVyuU?nYG6Jq8S9{HQuz7o!@+81McS5lYC$(ZJxo{6u79vXKMY9U5IlL z|24M@)pQ9)i=cRy<0WTe24?<#h8nIWw<4Qr9bLSeWRpo)b$|s;y}M-d4MxT+)$Pd9 z?a*YSgAXwNw1Cwfu;M83I2X_7{qB3foJ)@b)YfzGtN8{>I~mfy;pd$W>2&0B=y6EX z-i$Y-zpl3r=}-dTkp6V~ZVf4Bi_2x1o0~5E0^x{b)uzk6^Z%#es^HA2*Xe(1xO}Yp z>S>B>Zknvx(RH}KB5%bRt|s1(H(WPiq+0(;1;@B5S3*_RbT0rUP-Tw-=KsAan^&M! z*<_O9pHXFZaiXTTjEyF=gsSYDy%MOht6v8J!hZVSRM~kK#;UR*NE9IB^M9tweg_4Z zv!*KIIx6pfQf1E()(F7*6Eexqx-F-wc06`+43Y1yDm#v_ZUro@%3gz@k5y&P#i!_f z&E3v3t-`#f^-%sAPa`3_-+%EyeDMX540?3z*pIe)9F2t8`00vFtPn3Nn$jj=d&ot! zmAbOQM_OezA@QBMfNGlQv+x_tbh^FmX1cutm?gW%&{2S+&HvJ42OyZyfmEM#z)O{i zD7V(*usUgn1v^;0y}tq(@8O+0MaGtWdq#%qHQ||v%J~al6i0?7^L{)T_8HpS`ZZ&( z)OIW#awb8sF#c(c`wV}8y}}+4SfqXKlK4DLPk1rnwDbibAjfmr?VY*C_5P#Yb|!iHH0kW9z1@wI(jb_zBrz$2^Ay9;{}-eQ z?F}DSG75o7$*}bE0;f3K6>Bq8YEh{p#HZ`P319NNR9flyD+)7%laf*YA`}CY`l|Z< zy3|)|^wv8=9jvaNOz!ezZ0qLAlYo9D3O%+CI@s2ud{t+qV-gB%oO)5;E-#90(tc7Y zev@LK{C)ebHvU6-5{-Wkg&rFp+u*HN$buHnx&d2q8cX~$d6r1S9^ z!2i?u{~G_pac?UA8}(Ih%uU}TpeA&FuhwA@!4==Ylff8(if`b_xE%#p4VXWbj)rNs5gv-o zBmu+mTOF|B+K4Xxj8ee$5l(&hxOFX`ALQDOxD6(Wcam%I!*{E?JIeMB@3j+r(%5>9XXnOwP|pYMbG5uH+`W)6+c0DJi+eq+}#94VL{I+38lI zr!OHHu&WW1H6%7IL=f^i^KFR9wz0}Ym41-I49BI|Pr!bxbXyo#v>0NqC#TQ6@Sonj?;kAC)XzO5H=h;GY)MRMl zVA*D?1!335q-|?@m5v9jv36L)62Tf}e&nK7$2Jxu&Bp?1G4Mtu-$8^gTHAn+3(kiR zZtFAD0^iHk#MP43LSM$(!ZYmYE^3>oh!%a@0a`)&$y%hJTn>WU+NKGvieP=lFLXHN zFb4({zuU|GmLNdxlvg1$v>(6MA#Xw-Vh|;RhI%I1IBVgWnK%5^sBD zZzfU#hsD`md0b{V4~MVoJ(f^4FfdZzPO}W--sX-=xX-6a5kg>dmiwp_B6 z@T^K^#KIQL^V%`Ht1;in!~Bp5F;~~%Jt`;WvvquBw~Rw-ey->GHMU`lPxI%4;mou= zWj1^~L75G8VOI?XQ=1>V>^I0DthFbT#2D9tb+RJvhA#Hv>nw!^Oy6e2cp|~iHK4{i zCE{H5N)zX|3Aexn=Qt6?fb0IS>j9X24CUvB2HEjl17zWz44=8hAtS3d9PhGM>#tB~ z<{&hgQ-S5e0lVDYeAaz$61r>8L^9Lkyl%T%TOZ+EJP6O=tVNC*GcfLmaB}Wgx<YhAV0bg}9Z5!HqAyudBD9hdSm5XBixZsB^}$}V(duEfxy27j z+#tjN*KLk@+kFx$uZMG&9gA0hh0VU`JxIYsF1L0qB&1oCBdraIl9RnGp~7NpWWoGGW!E58ZxX83fEyAD zgufAR=ShkqGVFCh776^k6IpkSs>@^yQD=4JXg)24=Gl+tb1s$mCCq!4>i2fo-`kS# zy-P6;<`mZT7-y+AAL=m%Qtzw0m2+^j+eriSFW@NyLs89xednIW$ubSd4fjPy*O?{Q z>+Uu}4IFvK{{Yp_(a&VHP&1AGPgXNNq2{QlqH|ep&Pjd(%`h)Io-?41$65YSuHVY_ zYq>sn0)PEb%J0f`gIt^B`U4lH*Pwscp^6ROf}f>MiCeyML{=S6|-90Suna9ocbf8Ho=oE5Cf(X zztl)E8{Ts0nDGIbG3*c!*Y zsJ2~@xu>I!C3C$56p^_#u+ZutbFo78sz>d69@1wYXnn_*nAA*i4oV&iteTwQObX_W z#mQNYPxwP1Z|q>KVkPA|pX;YZWQ!I$5Q|zy)-XtC?fy#U)Z5vtCLx~$Lw*8Mx{)~dSJ9$jnWU{1o?C$skDst&}Tjhu@(b_c%NJBDTo$YU<**A?W^iewu-8 zhH2o?I-E~Bo}y);luy8#zbYm6Yt1Iz6s?t1GQuf43$84!rbvJ&^39QC?2E4){KR%S-u$)t!OzemhfT3j_ z_@%QT1G-*qW1-g75ytXFBCYLD!C<6L0Iq{_=sh}SH7qRezg9=nR%p=FzJ%VWG@emE#4uw6`G@1soQt1;N#97)~&6W>eD~?+&1DL!z7152bV}w438I z6lVq}XF{yMk78i*{_fDJ2go+1cg;Qi7@mYEg%dG*<@6!6ECb9({QV92fvRIE6H^a6 z(i>gnvbWWBZIbum8PmK*S#h4Rpa?1Jon=FE{V%djNu~Wg#&azwv=!ioK{%!|_|S5E z4X!3NdV|l_-~&4=XTkcdMbWu(ddbY-J$1Yr3h_yEWe2w~x4WHB{?s-g7ZPvVds}%! z?X&^E7no;0BlZaPieg$|zRz^+s_8{c6m!-gG7I(13cHFVMGVskSo~x7HraND*4lQ4 zA^?_2Vw%0!8QRR9p+{RuVrpzVL;Y%JXuUVGGjyQWsH(vmK;&#ccZVXn(N|=Ce>6lX zn^<6;fiwMhyeKG^*<3IUp@}%X=@+i0;lOgToVKuw5;DgAoF?CMl&H}^!B?%EcAk&w z8f8#4v**Kq=sw7IsbN5e!|%`Nd7B)mALyJTYNOfx5cf7-K@34*gw5Mg< zB~5*?`Dtoo+{-!c=Z}_g4+Q`r3<<&Di5pS24gI#4dzU)4y_{M47trAU;oz5>TgF8O z|18;D9)iRV6=HPPnKQyN?$NQ+Ll4SGFhLpzTid+Z&l^|h7h)# zh&`--k$HHCk`qd_9^Hl&sJc*uMpTX8<+tsR0iBoP5|?bN(bL6AK<^dQZ{SqB9ORSJ=z6E=eT_RaltBM46# zku8>HNTDG@#c|!p`DV*lz5bmg94p&~!d0w`*S~2V-6~UOKVid+o6MnFw3bF%>{R)K zdw~ga{9&|M-;i>nT&oV}ofoA1tX!Xz>!WggK(6=5^>(@5Bv%91^)svQ{o0w-_5UH< zb9!+~zdi#hZ?yN-C-z|f&t&&mooYKp_6Ql;|l8KKV z&DY@3{6J1EdL2`-xtS^=5_>io@m@sI!u}SNR8VBw(A=j^jKn}P9q?sdM2;YIwTN#j zcfwCd2OD%bL)*b#T0Eku5u%Lm$j+lw$UjW4fA6mx*|lNUa&Y%;!duYf6U^52e^9AA zUh8i;Hp<}Gz^gGgXlDWI2Cj}SE)E$?8N*eX7$)=XLqXA)R;WRiO+y@H?XmduOZrLS zA5C+7fudygajs1N4CR@@f{bv^a7?7S&(O;wz=02dY3V2N2ljpprK4tkgE3*c2(fULSdxW*NTjbDEF zmwjyU%K>vgZ2MOmOKSDTlKL)-m4H$ELLW?a+p@%Hp;*9L5T?#9KP4i>(JZ_O*B5BX zC}5@r*3kvnwl&E(@$HM>&P>06V*aZ|MRssO;01xKF06R4l+gwr(?S~iXqY>lOcyMP1dWFYRTvRCi;nw&mXwAi$1$;_^eiiM9XDe) z2wr}ywXP`}1ZSCladYr_L|=(sj+8EReYYMeOCls5s(*8G(HL7FX)FDfdDa&U?qB-q4JaILmZy8d>l)e61{Rtmw)P z&rR?!WLYlbCif}~A^-fLGq5lAw|S+OuOWK6@5D{qA-f6KmmRW&2SF6k*YG{4KW5Di zJ7hn^4u=op?~vu9rL{wL5Me}I$4$t&vk9)_7U-V&zshnQoC^!2G!=_=6(|MsGqG5g zr5y^Zz7>bUNorO>Vt~9TSNfmUGoAjrflPp$%mJ zel3{0elYNW&jzg#^H2*K5%o`D{aobI%nj!chSzWgPBQ&Y%RTSJ7U$AeA;=;bWM=ER zPC#RPxereK!4}E`a(Y80US;i%l%_EjK0m+633|(ANusu>}Zb66EyO zEH3X8ohe%QWpvvvOvz2!*K^Ip@@5eYqGQm=>gO|o0s5Xt^IJrI?mAN*Pf%?KpuZtU zW|A0Az%J}v_(dl`$eXa4a`2grPrc9|04|n;1ZqUiQ^>(<0=w5*yv3txIW&L?WfP3i z6!UO|!mxF_+0Tb)@SKXqp{{Qhts1>HkZoTZD9p5DFD0S0E+o{B{T04i>~)(G)*Z>Z z|50^uOsY*}C0GXi7URV5PrrU|l2p~cCZZJ+J3||P6A)l78_D_DjdE?xWO=0A-&?LjkTUzKNG!gam*b2TCSAlFv8ej(RStcG zowQn+SuZJR6JusIM$D|!pyhYL%xbHNnpxH6fk&6@pRWc)Tx(Oe);6&ku!va5 zG_&N;F)_2OZL`2WO}LZV?PeBo0Owd{R-G0O4PAHm;5@e%)}VIV0ou$efi&`i`*6OH zSXm|DTue}GR#v-)1?x1%T(DVLViDq8T@^1}Vk5u!Gq8PV;Ji8#<88CDn(VAomk`D$ zRM?9Y3}t22+SrFDIwY{N?k9j803aXiIaKk1+U~2ZEZEI%S?J~zSdPz&r2Q@pSfmp1AFvJlZs%d>lO1Dbm6*?;7|+b=_GWcDS|sUl z;;~u;6T;kkKZT~R1}ij0HXo}&(^K!ngLWK&t>0GxTdsjM@YFYt(P)c@f|ZqyN0AJ{ zZe@uTR$$aP0EMOQ^jefjV`I0jEICl82bPSiLUAKl^w<$JPs+IZ~x)sij z!Za#txB14WDlkg1lr|(1v(%;3{@?ARRAIoz&)i^o;=eOSyh3 z*G+PL8`t$_wLBA+I}LJuUarr`^$EGw;%YM&y2b-sk;S9yWf8z|G`wW_XptQ0E%DJJ zPW>0J@pv6jrH`(MN#IGdWksrbt?WRpLJPdXOVkeDS!B4pz$Hx8hDfK-IlbCW<9LkG zu9;h)ay&Sjt>S9rz3k(`dO=**%wMk>feFtmmUpJk{Qg#8ma3a)<|^|)P3xA-E^)no zUZMU@*_@q$v0$9{3G^k;vXLWg_(ZhKB|Y=IVHrt&osx30g(A)siy6Sqf}n{`&;33Y zrzcPa;j}ltP?Qxxl${G9AlV<@G#B?ndSf2sFlGzVN+dfM7vm+2Ca+jXB=Y!%SR~?S z8b{YavLZyyLSnP|=q<9O=xYJz!$R)n+G+uYo7rL7T+Q@vj7BRWDQ19qvAMpn+g#1& z$>X7R8Ro%Gi2BDuwbuUyYK(BB%OD|E%Ts~FYe)lo`Hab!`T@P>FtC8Y>M4Km~?TSk+c%?OOT88!PGjX zC|8?T%AG^y&P8%(nq1G4Yk^!(!F9b^-Y2SKxP>7F=dp7ClP#~yj8&FuL9afL)GnBO zGB#a_j2w!?ZV|D!EBlTSvDMnXV?^u{lp_(bIO3BcGKZ_Eoe#<4x)m&Gd28@n0^4H& z>{j!H!I0MzlS(aFt=eSC>LRK%%IZ1D_>2WA6{tHKUnr~H80%BOgSsK__hKq~$BLiC zdh^Qx3$hafyERmYia=PXCmf0$L|pTJz&$#gbFej+QKZ#np#Fx(^gvyXBFQRtpwP5<19kAWKRHl$uygt7 zoNb`2lcntg6<4n0o2ja%ufyg*Y={gJV6HRIZ<19+@u1DYm~yw9gn_6n?Xugg?{$1X4%Ay18@03YC7N<-0e zY)Kl@K6Uh;A5F(z)yiQE751ZgyYyKc-OZ2$8p;(f(Z)%=~Mm#@}a-*-Qh^;=16MWpTv>LUtxS5hF_Hmc5sP$zr%SG^91L0*;-LJlJ9mdq1mj$oBKuiXeW7FZp8DFw*|4rk}peVMt3gB zgoz+|u!gbFik+pKAOa<)&z@4~?W}wfsFP>DLtlKM$uJ@mx|)!9J|4OT2)YKuN0)2` z#u>v{%^uqvo_ox6?GK^CvO-)eQg5b=g0T>~aG6PxE@MF#EXpP!2+ZAfpJyvGX^;_iuS zU`1p3YDzCF?be~PmNoHZ=aSxR2o@>*1Hc(v)cOOcj|renC2OUa7w`elXK=i`F+VMh zaDx|QK=vGtsRE*5!;{mJTIZp%G~BfryCJs26VOQofZem3vD-JFg*C~k9Lv)2}SlHDM zEiFWr2J+6?ct#P!W;^dpoCWn6pRg!4#X3HFnU=W-hS9io}+1VAPs4Mh^(yj;xoPiD{5K3bq4+ z4_T=QX7QU!KtjiE)=?5#NT%QkEhI5%+H7`=rUw^u_rurNmDkGR90nJx;<6-zY8J9uR z;~YxQd=aCD$#{u*$bEmn=YroWR`Yk6;LgGXx15x{`T_o!esc-OxXIj6gReMjE|fmv z!+nqg7+*m&%UDmer=Fk9igI8N96cJM(R{2ga2ra$Z?)Bw6@bSm{s|sygZi>sf`+Q7 zL@bcR38eoc@_31~<{fv%-<5-8h}Sq73cktg$5u--%RWFe-MX0#Rx|Zh5CuEI)S(h$ z*X*rY>I4fZr2V{tcyWA>6b9~~iaLdHJpttoyaby9lE7ft^Wu^pt{}hS=*PO6xE^rbZ+hvSXwhyln zTFyJhvKsk_cz_O5K`wfijO^9XEG=caf=&V;`OAS*zjdcLqRhboMpvV9cZ6A@5VO}Gh%YH9#cQ#|&TOca*864=h!k<7cmY^H5T z!~eHqZ{3`)#*zbAs=AcXlELX8DM6LVl!ATXVlc{Cu4n{1($x5aR29qtIN7EAk&nxn8bM%k?qd@A7B)Cvt7)1Jq$oQ2^XQqOPvB z<`g;B7GVifo`B$zkmHfh$j&ZstSbdG4R|YE{H~lBt{N!@I116?KQ_?ib_Np@bqwKg#QRj+X+jMZNw;X|f# z=|<`j<%D$`$0)~!_TLuxLS+seJA_RE5Vj z3fpl8V6&spIy9?oGKBUjIrw?v%RL`(a2NozJtnkco=&JnhYdz=<~?BhA~`gI!}0?8 zn6FHAFg(zB-*hzUI3frsdN_(nZaL-?Nmdk5i}rxF$B|A^C&;dQl$Meg+d78{C#~En zoCFUSd@ecm-Nqmc71L9LML9p@NDDU`pZ&GW=ymc>z3SMKkpK4<{>M8ZL3ZEq@;L_9 zJXY1--9!-oV%$eVRO5iK5SY^{zf9;TYFs(RwZW; zS=Hp&MQh2pQCB9i2|PEOGGXZNTM@@Lssk@G(5m4(GU z|BwfdKNxFaeeN?%FAsJ{G`KhD%Nh3?*Ick2_UQ(oz-=rR1!p{6hi}I7+zl%XtQ0wH z8gOcrpLg+(O=#R*81P-eeP)9u+|Z1hr8#cn-WC+vWRuyEIFw0be^7GQz<%Hhu&4If z27E%*@<(%i1NRSZ@;IOTv~3TdYvn!MMz$%kjV#AZN1}XCg&Z|sVBWqF-&DigRJg-_ z6#DcPgcPYh+G=$(Xa^FfT9=!6`zKla9O&Dst2fSP^7%&1nI z2#ZC>YW9HgPGG4W3Q1`e{VqfrRb#tslKw=KbZ=DGh=a^6(z3T$WUnLhNyuK88)A1j zN&%NQ?D8dXYzJFgMRCUJy|ilDhH|HtU*KUkh;@;rn9c)K;ds{43hLPSQY}{DY zfagTt-a|f926=>kLsPQNSAPL?%p?%R33@13zF~P{EGwirF8R0R9ll&j$~$}|%Gx{Z z;Qc`E=)gG#+Xzd!hFzMl=Kj2o5Ek~iqXc8$8<>8o#hr~}peahMs^MGlkJuQ14GRB) z9tZLrRoCN(z&)JqGMr?BKJbWRB-`VCOs1_kKD4X}PjQDlGGioX!GIVYL6_(&ZT)hD zWeidw(g@+7E)%=rk!xcNed(w9rWQ}OJ=MA3;x`T=gp&u48gvD;cV!g|2f{EN z3v;q?xesaSo;gu`J=W^ft{Y~TQjDLzO@zW#o5Y^S%cg?`$`HRYy9hQtzPrj5Gy1VA zRE;5CE(GK9QwG%Fd!1%bvGondH&4jY%~3&D4QAvm_{PVb{YDH3qvI388F= z*{yQK1$ql%gZadVzbVfb*XuB2hLD$#@#uLvm@MyX4`Bhr0CGrx@WY{`cBgdRLzrV8 zIFyrfzGV=yiD3(20k#lkbJjNiaUFQAWvhCP>o8$J&Sd^A^iJ$>E*%50YMU_V^-L?~ zqXcI&^^MFKie=7FfzHR9GsJO~mTtw!aL%x<%bcO@_+6SQEapt%Ia(Zhn4<~Hia^v! z^-4IADu*p{R1oK&$r#B*p)WGAaiZ|?^Y)1X79C|;x@7BC?U95`mr&NU9_9&Zxzi%Y z;)HVVOUjZpKPkC)qp5LUf_XwQ=LweVB~7Y{LMHTT3s?XMeZ&0p3>BW3VHY{*a{^1K zj4wSEFNJkh2t5#0$e9W2p2WI?b=^%;R}0RDgmwF~?)yKg&fdRSI_qi&?C8&Jek#%C#TwNB>BknTVf=`X?UC z%KS}4XbW^aMCkD4mI!TzD1*nB`y?^tFOs8j;6%ZWYMv@wfOKYJ#_%Ai18;&SmK&R4 zsY9S4rOU(x%bk_`41p?q4yQoQwDK2tjd7etyO9Z@9T-O5v#+o-3E#HxTd9LTmLt3p z(l|BkWrpXil^Dt+cfj8%4rE9N}^4WaZJ~J*8Fw zB429aS>p0QjymZ(n_4RA3Ux?yzubC^6F{badWm#Te*F<7rdCO?rLd|R6`X1C9!X}% zsv3NaBcbHTY2ZfyT!=jwxrU1|2L(~Yy2gD61DTk`2Qljkxv=7$-tUnpW;eds9z|d- zPLdIfzqRz=g_c!Y_$wU_{Ncds{v=I>#Urr82D5}J^~^Gk6B+He#hfc(+)&kA zeK(&mWQgVX4$PqBNo$a=K&G5%<6~Q%TQ9EjP(IbD{notxzhcV# zYy-afuiHDRY#(oEawa>VfB*8fpF4R>Hfh*?MsHqLinH<~xb=L-@mUC{^TUP+2u-ms z1K<2bR?36eE39C-L+(toai+xK$AC+8&jf+zZd*QMY;ZDwxc zW)u{{5`9T@s5w%vJfRWm*$JHaxR_}cBCN%|lpLCV2vONht^2mY$C zibu>#?~?bEZ16RA6;}nl!4L;MceT)@8hZLA?|NLOD)J<3n_KY}Csb4Jg{$tw6)#NA z0x$C2ZleT#(P!&WY^ZJCHko#338jLeuI0TCb`V;*9nU-nGgf|i8M=bn<53=_<`CvKSQ z2<86F#-MC9###9w-q?*+9>suyPHG{gvGcSpH#D`_T-Y{Dp~+PjK?KO82HB87+nP+S zi;#&ca9xhu5R7|*eGzVv!jOxZuHbbU1Q|;iO0aTtNEx4evXumhkZ!WJ9ukkxNmVm> z6{kBNfi_6FVzr4|lwI;2Y}i6l>i;ca!~nptQuB^b=WsN}1l{|Lg&m$Th*56nfNUJ; zT$+bf9D4McztN5qA*^^pXAcOS^KIh%qIGc@*KkA_H*dm~dv{~pF}EnjrQf>SVC;p~ z_>7~-xb#Sj-5YY zUSE%Kc4k|$CvQ?amD`qnFad=(+1Jy6DmwrKL0GU~D-qNIZyZ zoKd>0_wI}m-)9@8^^fUMl6I(3+P*8J^dw9ctrIt4lv*OA^lPJ~6I<+~^zRF-QQ9S) zNRVAe3A+;`thIGhoKdO+`;fypN>Z*^-DGhXzhjgd$YG;4Cmf}%>$i47yA)s$omC$b z@4<(ffq&fu@If{qP5%KCG#H`$0{$t%2cBpr;edZGDCG1_Kl)?y&mfH}V8^Q)x&GB$ z5J+-Xp4Y!Cc+>U0z*RCkls@NfF>u=X%HjPXCv|MEyqAj=nP>xF?gjrv-~Yopdh9|W zsdu_;3(<|4fyVH7_?*^fP^)6cKxfq*Xf%T_+_@F?vanG$KYpKs>@$RS@F8V&u~9#t z4?9jbswx|I^mJA=Dq;g#h&f9)teSOK-Hf^xme#-dvt?KEtWB&3ylECa3Nac=-&?;A z?KG?SK0{2)iiRx}9lhqC1N1lZ#i8`PyQExiP@L$rJ>`#)Gk=}3B$4@DLIIC?w7hN@y=!~MD% zCgROpw*e6eR=e)KX-jA8CTzeCP42AdK)CB#5DZsZig+Yvu?&~LUdX7l5G_*;46%XU zxGkHm=&A>Lee!f0y-q?y+7>WXEQm|yE*|4uG)!7qxR?<(#9tk;{Qh@BuJWZj8x(1< z@@U%|0DF+JK~8YJ2bQTsr}oFHoD@F%9R;59`Y+6eNtc!H!WCDs1BawMkB5b36&I0I z-4*po=qq?=y`VJxlqdJWV5ot-a2n?p>Wd_G@)~|Vjlrts2Qg?qHkN)yU1MxD!Wl!3 zhI2?i!o^m9e;%`qIvKA-NSXkV&Nl;&d37IRY-UK4Ddq4*0?Pwt5~4{uR!dd}&kx?YM%iIj%qU@ z5Hc+tX|oP@D&Y4-*qBequYaoWX%aNukQzcWzbAq)kq`nJLW%`Jk4QTSA`yg6NDOl_ zAh>xxv%6wVihJVp<<6?@IP->nGN|Bp&_#$39>5e)$U5eW%iggvAFJ|wZA91?zzbu3 zvsu_MeVZYiQcZdI_1Qx8>0du5_eyy0ZGCT#6>_f~9Wq~3_o@iU(wGE58A>EW2;ng@ zd)AqX*`?Z2Lot=Wy+(gwJ#)7HA}#Ybk;AGwOF{ieAv0#9yW+nc3}%hpHoXuBPuON~ z*TNd%W~+gp5O1MoHVqEZTLg`FXH9@OhGUe@%BW*>`kJWBOXEmIWL};67K^uR_I)t% zhK@G#iBS5Dw?xr0KFKC%_;AlA&Yo**CeBs=PhC+aYhT0aUnzJ-i9m(*F1F4}@U5am#kI_uh`2a^5ifZ6vUfm!8 zcar`h?>il>6E&&LKW9}VFz+?$>V!8`GHhqn)41s|meBL;F>YwUhZ}nxD(}K==g1tq zGh6$T%Lc+L0ETpbeo;P*YK{*Xm7$hHM=QN7&)y!O z6_$Revg_nlrLDRQFwjxWrYR@2`R)qcX};@h)c1y#)UvT)UZ94rIO1jul&G%sV{VEL z^*?^cP+OXGU#aQ18K;`^1ptO$nhEoZ1Bma4rcYxJBUCRBcGdJkmFxeDcEvLd2^8bj zE|^kX!Pp(vVAG{_YoXR7-5@x2BdIM*cKx$Ig1#^ zQ6^lB*!&c}D2pc>n1Gi%hX`q`a^pkkV%|>zbL3QPNP&m5K%%!eJRmv>SC#2l$8Q}5 z?;(j@hj8tOuL06NgSe_VTY!T`eIk_WM22#W!6P;Dh(vRZz*oO~O+$&i9vjjn1})B3 z;QJBMwI^|c2AUf-Ztbl2dV9r&zG!0(`c`0$SwlV#@~oUHJ_DCqyF28l)7HZa{1?%on@nt`e82> zFYBDN1rGkmwla8aks^`X$~N;Y*yV8Wdr;6^O8*!)yx4W*srb4Do?@tYw5x3x*G!#e zA3P;{!FUf@juGyx8Why~N5okrVYJW|8_XB(8V;9S?%YXbGiT12GbNaO_{lt6K_*^U zAnRqxE;UXnScpSJP0ofXDM`KaH|(SXi3>XH#$UCxKfw}q3LY|zceVM*8g}z>S0Jnh zQcaJBK$5XTV2cx)kJW_GPeBNgAc;{cxSeDg4Q@AoD@ndj$Kn{UeXu(!Cjyhh5a<+@U?Ps#OPa(zgyE982ITyK$U zNUlre>JrE!0j=8HTdqUonkv_RxauY9Zt=3Q=gBO%+FG3U1B2L+#7w@hV&IX`>E?=Q z86ncfS7L2T%30Y9F?ZHtH8W1npTpH^Q0W9DmXl2x-ifa`D`&#dfpAj)s&+C&S!Ts5 z3NdF{x?7z;<6lMDg+=O|BRkuAcdk+P#Vcj&awLX`mCO#{ETj&f8LqTyr zd5m&{weg1{0V%;M{0Ampu72PfVd3(bI{i$Zao{)qK$yKc_5-oNhkb^xh|ztV2Y`gD z=)?w#ahGT`j;7tYbbq|xYwXaWG+yIGtlc8)h?&!52aP8*&kCejP>$oZoJ$r15Yy;% zjlGW(M|0>~n)zR$J#LG=-^DnZg{Wr5(X`-zu}B;Zni71Lf(ik3)%eH@jzU+jVz518 zXu=+2qq+Qc?DWH_S`ur&OpqJGSqQnHB3ZDm$^dPsI2skQ)_p@z?u(S?5Dt8WFs6f!l)`2qP^bGfysC8gO9@&9gDEfk$LRGME^_eXayEMeS8E?%Yx|6N-t(x zI3EQ^spkGa-o6Arsv`M6Aq2wZ1R)%91&jis7)1q)NCp_0!HmQsf+tZFQBYzefCm}~ zfy8kn?#im`0j|3Xp5O_nNDxe-Ai?zjbd`A0F(@c<$!h-JZ*{*nZzh8S!QY>czPx#_ zUv+nNRdscBbyd;EROqnZ{DUem;JdYSbXj~| zlhez+!69+z=$vw&%k!Jwd)|WgRG+#`6RC~>LNoNKyW}h!J{O2(lZdh^FG%F$iMsW~ zjB|VlCFTgnvjg)tq64yGC;E#Yq}zTlamaI`He?F%AbP5u;X)t2%a-TxcYta!Rz?GU zR#^Jw@_8^QpOxxF7QvE2X$yQCB+~_4_Ao@rcHqN12Wqc9$^W4Cyks2rz`@#YPgppb z3r5k#_(OZ}8TVTchF!;BnqfTn+BvfTfSIn_u?x(E+S(QqXRc(a&($`l@QZ$Y!{63E zw4@iNhC$<-XleJbF43l^E+IaqCTkT6C5?b;mJYBhP|O?f?{}QEt8(NHTB2S4xtHhJ z6_z`w+>twIk@ooC60RPW3urAFpdPjX>e(o@^nKacMCx0(zBMym$9hn-BEhagkzipA z3&jYJqHj5wy0jyem$4#Au~^Jb9#_LQXmMeaqk+KsVv^(Cgb-&SB(qIaMU24Ne>e~% z0l{1AwO`!5<$B<#;n*2MVkB3AlVYCwa=9!SLU~q96EvD)=u_{Yohk!OkZIRnTt0QQ zEcSi<%AJW0I3FA9kZ3CiEP?&~a%+Eox`+8ee|b;#_Qi{I5dECI04{6M3+7;{6$lm* zNw67>1JdY32NgPGE297L&q#V#rn0N3+&uFxuQl@IQ@MVGD}0&dzDlld%k@pUzJ_bK zKOKBhCZ~0x<3}nT<&wvEi*{uC=y?3ArGvNw%P0zc`dqO(Yj%A-U!k3Gda0!4V2h$v z9MJfwJ%i`%ei~a5^#zI8geW+cmn#Fs&*7z%oCfTT#@c91C$Du@K0d#zK3+Q#&tXpk zjWB4NK2&Q`VzWN@gAE@LI!z0as%p6z1^3h|A-J$Zm`igd&SS63949&cLcP`TQaX)+ z!*wA*!CP?06r+&I=^Lc{MpVlI^&Yq~6*IfMH!uon34MFJ*1|QrkGz6~{0=R{ z5ep;CZw)3uwsYuH3@vBH=VRnHzei{gJ111zCOSHA2hh)zkbp+MK@<}K49SMu@BsQB zKkA6dM&LCHGLP=Y3Et8>lkq=7V89_eL8}ty<4KsGv~B_MthpH=9K0M=**--Ls_Gb5 zm#9u~lTg=k4=9h6`s%w>fgVd+M6AwQSBO93)~fRdk`P-|+S)PjU$mpsfbz=tB$TLh zH|2mp3HPj92bf+V;`5kCDRM;2Dr7H0nZuN)q@)CSIYY9u0&RW4g zm9xrCi4u8^*H!xY7W^?lYD|#{mGaUPS2;_Wx0SPY;7&JpmPpgmS^NxuDbJ*7@*IFg zRF=+4)vrl%`Zb^9HJJ~eW#SK(PQ3M+B7ww~1zg5U5qPTnJ{6uSvrfm`idh42#Yn*u zb6qDg2YQth=im~KPgY=!XTZCGmO=N=Ps6pgz91nms%ibZMF(2A=9TjE@oS(Dz4YwP z`oMj&cU+RJbGL!=ApPKsg_K{JY$N}65@fn7;|d`4QDb-^;=x%cCkuXnO`;Txgq9Tv z&5!6`79>vz0_UNwvdhu5_s##-z4Px9yt@bgJLQAP&&2R-45cJv6G*I>WTb?rw}fZg z#hBm}6^H{KO+>VI&ECWHEM(iEL_}-!9U`JNb~8dE!e6QSfwRh>S8VnMa<p-KLU z5RMQt9%Q=nh;)R)>#3x0I5`yo4x2zicq&cY5aJcES3G112)OfeajtmZgm?G+tb;be5v)F)HuE8wUg2unR0T};s^k%i)n^0JkeIwXZ?DKC#bfbjXtE znuxCQ`dX`d^9-1WG?;k?%tH;p_#Z;|7TVnl4c0>#lzFCmo_QRs)S1>`%?lr_F^IIG zd&9w+r`lP)X`WR&JsJONVQz+MG@gV7S(gS-mYZeHJclTcz7D(`Or>soTPsy(F4u<* z9;)!n1KLfP7Xxd1Ojzv+tDAvU`r94;scVcI23gyTOuTeI$6pE|bUj zD{6h2NM=0XGhgs_s0qwwJh(?e^JVe1zrhHjrY~=APW9S}YJ8R0S;0!yS6@DCP}exb z)8bZ$ze;_!2z!t2m7J2WZ}ROsU3B`lD)sX}u>{nIp^(snR-EXmhQ{*fkjxtul%SER zhMMHVJB^Z%+sjajpy!#xT#{<2WlO_fG}rc&Lj*<|UW%sJ337X`s_^9QGkGldtGx}znCM&1cG{L`L)*(%{9*PKTHKg^_e7?Jri@QoFjKbe3+=i*?V zWrDHNs|vj<@~#;_>6#m^hbGz_2E8PhcHq>dDvQjaI3B?SJ#b?>P*BKN>shXm)g)q= zcNtYfFLtmzfx&Xu^ivVt>@-sHSa0x3dSeMC^Dbelfc}6p;EjM@(R4suU3Xcc(Q3$j zFK8d?$N%C84{DMsCA2%d%o*A}hL6H@ScvGOaMPRYX+-Oa_BYArYD9PpEfYU6!((2~ zVTQ-T*=ygLF!u7Qi==JWQLs#f6%a^CFI=? zFZ2=tQZAWIwV-#LX$0RwCOp-! z^@J@Io+@A)89Iw*E}|V5cL+fPcEFib{>DA}NW;rm_2zqsNb}kjRK3V4HcMiPO|e4V zVX8jQRQ<5z$~)p5aD&*5{(yzk&nqB#%Q;6g1ss|c=WLdW*{t38QhmKbKshm zjwO>{$|yTYF+sgRP!9tX&70RfuaVoS!jpt%QTA}s(ottXLk?(B)tx@-0zh)T25rON zhb#OK+1*f*OZQc76Ju%ua^WGy)T>l_E|>dDC|R&9a|HF5vv|N@mE>E3;zrp z1M4~tF(tcKMkS}IUb7T zZP1fvW&%$h#qBsShbPah7C?EFJ&%KcwV>nK!aViuCq|c%UAF=6A}mfht0)c9JRxkX z_v3V!IsFdNe2u16k^~82G7b0x*r&Q6nMr$t%kZ%p{HT!&#bx*@uovORMBdS``9@2L zpnm6s4JQx2&kD>XJTDF*@DHXR7d9n;lxTY)b1u>wAc{pvxyD$lKaHVq{Rr%<`(N!C zC%&&W1W{Q`NLrVERRhtn5goA0STL3{M`Nry9kA(Dt06BjkShd19NsFva6n$h-?1P| zy5TLa2;_2ppm$tFw#eWSa*2WLntKySL5G;jiwSxs1=dV}u04Zag+?HF1)ZPvMUW;FXMAp@j)Iorz4S3!t&J0FCgOla1%Y3I|5^U{VKzE1Z-W*>raYCgkd{?=mIZgQ)sVcGktAlVqXZ1!1=!J(lJ`5g*2wi!xqc+qjdHER z)hS^!FGlVG+xq?ESR+nh{T503s~nQYgzF2ypcc3=!uSm@gW1orS%I}ay?=?c!6r+M zKhT1bH=Q00eP|p@%?ebRtSYolU(_FBmjPir`b$eN+D9Yh^< zhDue>y~x4A%H0^D(>YkP))fLE*5hl{hEy)c?_K6FKS$0llheKgHmdLi_5y0gSnFdK zW)|#zAco;QgOEPh?np&3&{1t6j_`YfIZLtJ;nQS1%?ez<+F$%lK}YZj1oBSR^d$7w z4XwUy?KNb%q6+B2h%FfIBel+#@s4ZulNecu_@&T)D#=5*gBIM!woRQS%OlTxqm?Zj z9X#h`D`V+=y{UqByb?2He zgIfN&YXqQ|FoRFv z=dg;VLm8AS^>pB^p;!s}=c|DjGOc=68`X1Ll$~Orton^<9FoAyc?=6->MVsXP|^A% zrX56HW+r#uE|g_FB(NNd!TH?yQKQj6$vQY%=XMq=r6ri=$AqyJ?NY4(gUZ*C{vX(kvMdh46Dj#r! zbNnt!n0*|}S?kCK;S%OvWZ)}P>RHj@p67LjJjs{qWL%xHh4*4Vr}Z2--oZT)@Kwnr z7GKeN4!+6?d;r!WsVp3@*AGeKhhx|=?tttKI*xXR4mt)9QJJi3PTK)6D8txG~ zqYzk3-A{5cS$1!bC3U~g@3H#wVsQ*YUvL`|TRzsiDq}S?6 zP0N-=R$EaG89S}0(XGxkFiff4&uUn!7in0VD?F7X<9a7cYZa1f9hML3yrsI&SUAiD4418`Sl3 z9VbsNlk3HD^~-gnT-~_JQ~@8fo^%l`Z36k{N_Ho?+73%{?mq_;A1RJ}?@IP{a9=k6&L4{vrC` zxdHs}_TOl|Kg9Q^#pvHpG2XXrKtJLA>l@?!X)(sv9=}7hzo&&C8~@?;#~Qy|W8lAY zgZJU^8}=_8|F;%Kj(_<3ckhmT9}fS(J(2Ij>Ekr({UPx4q=o-z?=vrk-dU#g&g4-> z@0^pS*PB~qis60+)*r@E2oA2auuQ-cZ#p(!v1hh26%SO)ry%pN4nyEtY}Rp+=dGNR zR*1hQIQ^PCBy?>>W-_!gm{j$CTi{}t6tMzUFMZD09;=}9lhk*A!Rcym;6eFZCI~B! z*hI$+5mi~gTD|iRalSla6K;1Ez?a^@eY*G1^IiWGF;4VgdHj4^%J9X!hO~HZ(VC>% z>C1k%&NImG#jC=9_pY#i1K)5Kkd!Rj(w{@9U7@Cvz4g8PY z9{D};BggL@UXWknoA80sRR(;BL&fl;{R4?F;3=2daFSX~C#ex>Crgtg;g2|HsHp@wM4=!?2odo_5r@Fv&p}Ihu zzu-paJiHHg%z0Rm*&!+=_W3MCiC2~#1tn&naUkPHP+~m0<)Fl3Py-YSLy5;TQ=aN3 z`SM7A9Y40mFDvk0a&$Ry7f3w!JR8HyKPLp_H{ zI>M8)w`=xqDC-YY8Ecjw!PxO-y54L|+&4`Vt2SpDTh@JPY_%%tV$4~2S;0B-$ZJ?X zTP@!jLU`T%2H{Kam9W0HLufFuxc>%K`Gny7LCwTY3t3*QkGrdT@iEaZ$btYkhQlyx zT{)Tp0q|TKqWvbE=PXl;a8D_~ZGJca&)Ttw%?%`O7-3_a-4>@6pcA&i>@ak4E#A>J zn@P&CHV+vG#U!ZBSwL(m;)!ty``v9I;@9AGLQ$Eg1|BCm>wRg3QibWO-Ye&BH1qCY zH(EBCC#i&Ysb+B(+S5QbM3t9o;l?evk&t<_v!Cdz`DVIF0B zgxv$nB!=T28J@?|WM^vDx*^) zQ88PJJX`*$%?~1PSP)~AK0I=4!sfSF@+KWnR2rLP&vLy8*vK1^#>t73AQ$1&388$e z+)0+zX}E>NfmrSpRpPw%Nr(Zy4;+QWdH2!AN}T!llB93py4~YK`a~T_|HYOh{bzX% z&3(L!F`uR4b3LEc{aw#zz=WR9Fx69ZbVCW5%|uIRD~D`vKp}>+$9#4jZjreL6VBDR zD;d_cVpun8V#4&c>fZ3_Z9|0obK4`njP(SLPX3*EDEW6Hfd>+lEi@1xN0 z*OeZn{CnhRMAMHlOa@k&qG9UH+Ff<-llpNi741D+~#^cwA!pGxoj*mSa zU7K?}KK&cVBN_Mhcr>rI@vr%l6FQ{(W7lzG5t~%BD*KQJ^n`j^k%SL{u{crWg&C<5 zXuchQCO{v&^418xCA&uQ?MM_dd^-ZS;o>2R|(AYJ8-1JVn37!XhnpMi4HKsoJjTQcm#iebHla?nNy|MEGY9BgKK zxhFH8$Shiy4a_w~ayRk<|7m%I0A%{-;m=nYXglcsu^TM92i{VJQ<69-4Qv+-9b7$#yI5$$ja8 z#9MG%I&4tIuybriOHvOMHEiAnZva*SoG1ctIo1NH`R=91hfcWQ_wAR3|9<+4@ZXO_ zy!Txh{(dF4iS6|t;Pt&c{P$%MS;H+hZB!gyU&l z50|TvNhrb26|PXY#vzhEuI6LqejSPueCq@f4&Jf~(1QLQcvWf+1ceF%3rK}##~F_2 zXTtIP7$8wz23N)LC9r~RXMLY=z;ZvYR^MMjSLA`>ii{J&;)e_$mmohs#X04VE;Avq}c7T+y)P;EmPQ*F=)%7$1Sj6kinG&nXQOPLtO~@xBEKANu-s3 zu&03qxu8g)MdR8?nvDr*GtXnZ3`l6>Sbk6`fwMJj5dw)y_~GXnRQZIca0(riv>=mB zH6-`ZoL%*==So8~4UPj$I=T5lb+wbl$*plMJd-VKdpIr3{=*iY9@)ZGfsS#fe^$$r z8W5llqwNrzi}1%aXCFi|QnZY~eKct~GC`!}82k}wIgq~tXJ+D$NXzE{(q`;GQ(B%$ zzz}n9-5ZjYz4*N$9@u0;IdqmZH(vn_4WmOovJ)?;c>%jX#> z`nm|O#>uFg3F&4)iYY~(yX}vp=>7LZNYT!KX-QEdou*#pwKY0X@M_0~OIO$2{~+PC zo-@Pe0N3o7`3624Sl}YcEKcp08($@Q;nps|Ter~-rlwi*VjKnlQMNmwk6<@!d{nFN z-rR(;7<4se{H!D;!x~)dtfk9nR0!ih_On}ko*2}?IYJ-a_x%i2KDJ2mYFIgTgvmM za{c`m!r3p^*H}jW$$At@9QyTXeRdL0!xpVew{{0N(0=MGy*Sx@DYhx|P^@y8EDhn< z0YAdLq^#1@C9jREc(tG_&R2RxCtvBLUB1%W6ylvzx$u?VS>rDqzr|lVX%n0kll=XX zd}|IM(-%Uq`AhGt$}$@hGXMAj=cNLuH&CMW5+q&oC3*Y3$9<4gFF(t`;S2@~fw!V- z*cztho|DGO465|hTi{OZ4PK523`&d)S^d7hAduG28@yQg5eEs6!uAYdr53awI)AGZ1&ncgJvmX)J29(#`$}dv6>DR}*W_zMHq1v0U*=|Xw z2^l}4-YnO!chpLs)ZGJ(xeZO#RmslV8r7rjF(v`pgA^v#8$O(uRhpl?0wVyzJ&U3F z2f^`156qlra7cuQax!@$$D0+njyo}T@j&HN?9<@cLv<9+f01ccrUUYWwr3i!UhjO zYGp5h<~FLp;yv{+NTu`C&nf6ZR_T;vdQRzcfCykyLFQ`a1q5L7G%pMkgBbJ)ah+Va z&n_AicXu-+dv95XVFcXt5m;5(`;_jY1N8;X+`-G5)Ma}zstbm=UyHZe*8nO&F}$LN z*{VKCs;ZBxJ5B%(sykLB(L7hiHe|@G@gGSJe*2vKCnN23|>9gt~BKJr$j_5PMx(AJ3e<1qns# z;RdF0ld!SXWy!LI>n*z73ztgIJFV6h)pUeo@A2;T1!qYbEg*4JAgiZi7?R6ySRxC4 z_Bg*_Ng!MLj9a^;>C_h9V7K2d=z^TmORxvnt<`9rYDw(MKdup>9N>f0mrpUP33x!V zfP2*%c+%l?*h$~@!UwR*sT!EHwA2Y*8^n7|qHv$JW4~yAiNW5`GzVY-TwEhUa+i2N z|Ku(8mzg742%egYvL-2ErrzDeVp#6HlmeMXr_JLTZw?&(mQdkeal;g-y(p14qU5f$ zeA?Z-%waf|x@;~>@VOT*&CB4KUyjeJ^uw9U>}s%BrU4c}`oQ^k8E;b6z8@uIaN_*& zT_OFN`GQXr0$5gQMpo&a5Se!-whzY|lK6494{VGDkbvSa7xM60<4rPaT=WcGTS+y&V!2Ov-^|z;FPC7Vs+y6Ns*jYX1xX z=5bc9UYOA)Aq2L1I@F0w_8#r`stv3nnCLdm0_VNOFa3e0Y5Wi;&lx86Uh5-Ypmmyh z7~hmxh@X$*IFFCtZ^=rZTiu9QlT|tp@kEl`!3+ARG}aM`OEe!bD_={cUJy*Y@EV$M zJ)5#h3nt?Kyb+}Z%>FyUbx(02+6w1++{y_*K3arF2$8!Ce@2wNx&nV_A1B#n1&5rQ zh3Jo^Gjl6FSI&@f1zTuOK*C~p0q3fv*z*QIdp3!*3=XNzWzBcB*#rKCDsy-a`dCnD{rqM^kHj0Zf)N5t|EAI|m8;SiL{sNtVJbz5qE2Pl@FY z2Q=E8l`l@b!9tL0g*=UOFYAvba~_x2LH{Q83PO{LHy5HGd7JJX(KfkR!DTM&`vis~ zM*HyOsU57+Snf673(xGL;Yq1=$6{e4Fz5)jUTqu?$r%p#iiUuvJ_9AKgf&x1Goki0 zlo%&h=AoZz!CkULXRvrE^Z{!%IHP1?7IK4V_5<}7HXRWhrbd*GNTIjw8$Lm4F0hcR zj+-W+c{+{qj7s1eGeJPJ)=}PBN}qNSzMu|eb-WYKzYDc&>WZYoJCPIZ z6zof3VE(3UQTOwYy7X4Mwy%G^5BlQ`bWv~L*)fiVr^3ZqO2`}aEFPnY6FZPh=2Ch9 z4z*bvHRT^S7ku1-KCfsEoqY+wTMKnqL!jm_TS*;3DnjA}Stq zLa0pNGY-oPtqBs4zxao#w;)1`FF3Z7zu$hQ1+eqaLLJON#yI6o_|R6ukds!cgGiWW zse``21#Hv-xWTo=)b|;OIit5huR9fduo>){&%G>mzxp3EKK1ar=2J0q6W` z<-JWPnq$pjUh5t2{-3vBRV}Dn=6Xl_f-6~Z;8T9)!5t5BwRwG)ps-r?xE-{pX$CkZ zDCuD6dwzI8?Z6&_{;&@T6rjGF5%oi(V#xQ5&zOpw$7T_eIIxG&Dj@&#u}x_5;34nt zMpf|Y6HSahfr#g`drDP~Bb(k}`y}@YJOztzraAF4FbD5Q@X)cLSu>gl?7_%Q#51k% z!a^A7U`pG&yI?*aBBP5i(m&KCWWE~j3_Ma{g}*dgt<$h+4=zIQcQtAP3J29 z2L{nRKN*g5os4bT9O$AZ3ZcNo93&uUI)QFpEh7$eU5A0T)zbCq%ZJF}qr=?Nm~pt3 zYxap!twSl-OE9pV?DeL$0w&;3@DTK!tU#shndViG@0N*0b`3(&C2BBhjHwz_viynM? zt>y35P3D`w5haXC14-Q$gl1{VslLD@tk=J0{UiM`-!_l* ztqi#ZzS`ALpa+tTiHkDg55Xgx&-3fDr}?vjXZ&dd zn{-*_pftAOg9$#@-Bo1lTYXS)3D?HnPh@62=SUqCGN?|*EfYl&UYhpg;8+T&lV$mDy3ZcRg2lA`N zXyiY4Hj$rbk*TJKHqYR#MtmYM)%!t;pTtG{CYbUf{uI8o32?AN^K3Ga##}uL`GoPt z3eRa0SAe*S$gwn)b2V7r8A!Hieh)OSsWi`U(9p`Ju9hMhIA)C96s*sy z)nk7p$M}bmVQQrFkELxvN#n;d?rK=HrhbLNQMbr-BCa8BG3Q?)s7?IHa()^}oZH!A zms2&nWHE9HPuORNBwrgrYa1VSIeENQnlAPrqE$T7gDLM{s?nM=m}qTd^@VTIm!){C z(b|T6+4L9oB{Ie#UTn_)r5=fXY=%W*(41;AY*x@;4SfMWT?`twv>KW+C}+Eqa;jre z&M%}KSH7mg&n9Rp+*aYKh9-`UFbaed&{7cyF7@f9mOxl)1j1^~gG&t$u8zio0sm?= z3$``e=;_=IkWbV@VV#5PYtYn{0uQd#e@*%>|uCAV99g5D3qrZK^y^ z3k1wz5D15R())H*g6}8{F1cP0!|DppQVN6KPB<<{8=_i&d#Fsn0biU-zNoqt_u6aE zihOttQs80kz_m=}$aOTI9Eu;NbvO)uI7ay4nCSd)j2_aNm*^q&oW&tM#^MLQ#c+

@8Um$(?Zcr!D$Ry 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�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


V?>`K^%$f5(Z4ytD`^Jri)Y7 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�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

Kn7k~EWk@N1E1iO0tR+T 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

DICXk(eWpIkCLy8kX!hn{|{^3 zBfbe|A<4s3j@yBx5x7kTRE}NTCS9JFVKW5Y9nm7JKl^jo?g)#~wuW}%)h{WXeL#8< zOkdYLo>Q>9U)EAx*h+?NnQDWfWC?0-3V_q$1L!so+jDWe}P8biC4+KhO-aICkU0k zb|e$0=8ss)Iirg&!|tXm{&DIC=>H^jl^3(U{(|Q`y@f4oc6n9E6+LfICadl=yz6|e z{twFToB-mjY`QFQnU$9fIn5{=3a*tE%Y#Ravfq{1Wx-%oS$PR;9E{cXO_Drs?M2i_ z3gAx>)*#rbKA;PKy#=MWe$+~H`>H2Ztyq@l&+!CmCHn_Ai|v;05Q@2)HZilM`GI{z z@nV&Ih)K}9hweRebw}&nyKc0_jh)wt8<+cF+YI=EA2~s6g8_QU3!&!^-Mx|pY=hw~ ze9)QLlN9d(F*nFJsLxbSK-$;VH?-f?`eda*q6ntlbz4MmKOQWDRWY{-!!6ScIG0RW zz%Xmpz?$DOv>CVUCD)CvcU|N0QCA_k7hw#{xev(yh7jwND?f6Uio<9y?k`GU*_=Ezm> z+Zgl&@m;njwGeXMEn~)<_-~qbQVirK1dl#1PM)|~ETNtUCJD)Mq};w8qDmHf$X->* zGZ%Va-xO5oxNv}qc15bi4icrvuc_n-&Jn=;ztYbrV5%SdrIp4;J@8>piGQelxU z|B$k0tL5wC?`fYj(}B!HU|FrM8d7s(x1D=f>weVa8gTkDBwUnlnahx`Dsu$D1QEwpQK|j|~&p zW1lnSVvlVnD`2rV6pWvWRoU!=)(;=F*TDy^PXzb;=!3Rv2y4}LfGmRa_Tzx8**vEX z3Yczz4U3jb5pfT~TWw6YjK06phR-0ScM)KS(o-TC?Pj&uNrd7gOyyRMRBQNe={eUh z7$g5&BW`h*_3uV!8z3+UuzQHGJOS}*06)O7Fk#IES_rgLTnAxU0=)$KDQ!`2iA10?hEd76R=A zIw-D-uwDZF1O_N>kgz-fu@}G(a4bw%Gl3QY?G)ERSe8I9fqse`AZ&<0o`BegI6pul zNuZfP3&ph))kS8E|5a$O-BndPVXrZ`v z!nz1#3G`B2KVgFeh6v;-PW&yfFo7h2W`JWYgmn<;B9NuHUcv?l3=$ZkxIAJ0g8*Ry zNq}R`gtZgsAkal|S;G1W3=kNkxFN#CqX2#aVSr;v!deKl6X>A0F2Z^V^b;7MxIx15 z1jHc#KftjtVa)_u2((jN2Vq$Py#)FxZh){M0(k=BKOoKzkVq0}CeT80?Syp^$P(zK zxPHP02@Da)Q=I4p7ABA+&_g|H3+T?Dce*Gt#{fk6U86qhH=-v5T64pYXoj?c0brIG}pr611#SIdcCm{X~zz=XN zOjt9476R=Q*Fjj8KrexQiW?woh(MlzID$AoKq5(?nLrE0wG-AwAWNW^;`#|2BrrrE zPjTWXurPrnfo6bXErfLt=pvA%xL(2r2n-S!qPRR^{$l`P0!e^l&4jfR=pfKVaaqFp z2@DVzq_`o%#NPw>34{TTB?)UG&`zL(;<^ayCD2b`fZ_%T%M%cw$`XEnV`0LY3A7Ms z2Y?Va%(D6x8D(D^p$BE`3z_&@)}5A3AImwX-TylTwh9w(YH!a!R+O=d08JmU{3xoiClQoNt`pI=^$ibAE7K z(s4_tSVEb}nIxT3>6A-nvUDQSnIfI3(z!)C)1)(9Iy0nmt8`M*nJt~$q;tD;?v&0V z>D(oqrP4`DXN7d`kAhI`2tmSUQ)b^RaY3lg<~?`C2;P zO6Pm&xD3Z_IK_rD(QqaiPO0IP8_s0Ii5Sil!ZB{IQJQFfaE-2I1d_5#&8}o{$JkSKR&8r%NMO( zUA@!kbec}nX*x}aNepo(hPDYIComzCj)4Q5$O$nZGMLlB#FKC!#2CED6>q{vJjhjV z^J(R1H-Rn<;9(CB;r-2QxO zSJm#?^<&klRjXE2t!3Tru#&R zb6BGe>qUq4vcr1KVZGt7-f~#)IIQ;_)@g@z)?t0@us(BGUpTC<9oBaa>qm!W2+Jv~ zbYW!*D@$0}!UCH&OIQWMnk}pnVa*ZNTw%=@)&gNI5>`xDi-omJSXT&ZrLa~B>uOn34s7goQpb_(luVcjXLyM?t+SoaC*0bvaZ>!7e65!PeE zdR$mf3hNnRJtwSDVZA7tkVkCaf=n^|i3R6V{Ky zGMtvvX{9@@OsAFQw6dL6j?K9}zIi8cB z&a%#Aj%Os&$I?dZRh*J%fAxu8kNt>%`(NyJT%%;a2fXPHC@(2x`*|gM01^hQS)eO! z+MbMYSX7qy_yVnp1%Y_Y&+pK^RPsi(0IYp?$TXV-H|oZ15ZwsvI! zyB^NwZ8NZ|Ix1z`D@-=Fpn#o$+mB)kP*!rBY$aXXbJ6&$#LTgrkr~~=c(&ws zKSJ87tOHT@H3IpcVjT+Icp2~^w)4Ytx!gJMpeb+oPN)+#`o@(P2M=t%<6uwoeiBu& z9NhQultXgaXv%zR@zH`FZE(5pQ>9+!Iy0NPCgY z+K$J&aQTu)KkcrGqQFQk9((&53fO74Ty51>=I7vb6puSOrKqG7A56SF>*&Txw|13~ zp8O;^t1>`17h7q$klN%y{a7KX_budwIE@v?&6`53cRvVKhYNFa^K$bKQTuHC8mTK_ z{|IO6qn#4hIG7(RV1Ei{r%8^>y@Mt*A;$Pf0qI$Ve$oJR@=b%zRCjX*bn>~`AijMb zuK6?7kIC^I(lt6&FRO(2Fw#mLhtDDKDja~#UnJk?>jr4d+d1qX&Bh8HeMR!i@+lHI zna5Xl9;1h%%=jF*aFF9-)N%Pu(8Yp~GX~2iwA{u?=4m0BEI0Nj^qD%$>g4<5%l^)=#TF$w+5id~TG29w=ZR0JhUR0v+teGx06Klko zSR>BtnUTou4#=_}LTc+VJdVR*e+xZ6Ql6lGuN*`UkzqVMkFs6-ILw*mx=5v&wi7cQ zI?ephQ>}FBkK^<8_)m`6?+_7(SuxGYhVE?CLQ~#S9 z`>B-cM4sNx|H(5SMk{kz-8+#1Zut{nQ%Aq7%2Ds z3i3Wtlm9r8Q9O40stQ@Z>%_#1om?g{m*fvq5(B(KytOL^n@`Gu!x63LnCX8FeNS=RWp zMCMq=NP4#`o)$Hw9>cvYpmToh$VXKR9CcC1yM`P+ z(A~QPhKJZS4%~RF4b{2s%H5Gy6n>laxpwE*7S_4?!i9P3ijEX_f<@(#xYZqvmOmSP zMpQIbR#eqh99h^_QD0qAL!m4lEv(Jv(Y(6a=ymnSmb_cPKtMU0RhC!!h{OH5s}?(& zhy6DPihS>I202|l%emao%J03BmF{Y0v$w8d1s$ugr|}m|j)t-H5wa!kj0)L56kUuM1SwW%qKuQ{21{~pq`l9hM`;qrW2fv5!z)Fu5abes`qR$} zO5ayQ$s&|Y!}5jUzas&&WYd5E@`kNX%YYx1HE`;VIwQ5 zDOqs(Y{}?QUWAuv4`w;}3f$1FK|MZubYSdsef>3y#8t@9^-H^jz>-8M@M5tQ(fd}^Gd$DYHi-S94BuS z6=og(%2nyvH!Z1(zc+$R7JgEIir3_s>d#Zxc+MxOy#iNG2-C3hVcot)Rwc$aej z|BzDde=Cw7p#6k95t#cw=^hpVP0=l!tePNG3J=mJ>DC-h|5XxAdrS4DXO%-@f@8_V zSCW(&9!biKv~zRwbea;|6jmwZQah0S8QD^MgFZiGzf?pZt!lmy^&oYX;yU+3q8_3Y;)a8<5?6*(9>8XntI!ecK$aFXEh z00J+4i}B@Y1U!a--56%Lkv&0EBtUHK5NdB>RPQai)Sv?e1FFTq-4Vi$sx1ng1_z?m zpNi)7otN(ma^o}Od-bV=P|O8DQ!QYc4g(>Uam&P%@%lt)5vO1!%_E;p2KPzAH>w8Z zs7nr{SjLZnT2o21`!VN4uq2&2WkeS#y@`gY>zA=9O&PVDa`>Gz%s>_BmPJrr;rYmW zv;VF@v9BaeY<2Gn-WysNF3-&mKap3FUs!mesKi~iZArz_%CaMohO&y~g$=Jq9x5A* z#LI3^$Ky1wJyv(7c6WWec5m4MyvT9ju}t9cVP1Z5d0ss(#SL4loMqdfvY9g3Rkp37 zqLM=OWy6uWvL`{O%kC6a6$|NIOIbyAVa@B2nzH-o{oWOCH-6G|%i8>PXVX|02FXv^ z96j`%zQ6J~0^@LgIYzoG2u=z$PixAkJ%>7kb(%}!+G@X5=qvosxN$#Y(9GekSA9`` zq3ddvBowz+&xMU>AmO8Mkz12xtwzDHfMi2ftc3#aPRC;1HHayccB zbWLExF^MSRn~4`^IYXsmB6m6a*eNQ!g}yP*J?8VG!d2*g#k14NV-D=yzXnbQFp;`7 zfBHV*aa7?X(ps+}@DZHL-G>5d%O#cN8{&vyhm@?3;0z__pWqZJ9-s1WU0*{Tt~sgC zeyaVf+<(_+t!5)o4kz4{)krzz6nC{T=mgoqm91)Z4#SIc7@6QVJq$KcB)_>1pIPmA zY=q-#{Uf&HBn7QGvauJ{r1UcH!r!IThPx5Cm(t3qqE__qBLoK{=w`uYFV z>g)Ld-(=&F3&$mn#YGoR9^sdBNg4|p%h|d2$m)@_j`+?i5ZDgqOQPTB^PT1kL{CmT z{y0IQb77#c9!IRAVk2~`9A(f~Or$jm(poLP@#NHGu{pag!(Est?!wGPTf4wJwxzra zGlt?np}M?-z_K4nzXy@4QMJW7s_(t1n0-FTv55B(y&Aydtei$hp?`YfmA-K9SVC_i zlt|7fqpsH*=|$rum%>iMMC!VJCwA4(n0>Cp?kCgua=#U*$z!ld5 z5pi$?eRLV=A@=cE&C~d-3NN2!c(_l`(VrrDlMk@@8i60=w?5!=pIHhluXi2%oi2e~{jo`ZgftTPc315BUsz3p@z$v*hec=Z47IpZL`ftdQEtx*Dhaq39 z?e`(EQ}S6ucGM})?oLEy76m#d=PG%2w?J*=7dRKW^3fA=zF7;HKPn>TBTgK0z1rcz zQaSE9?ETK<8+`ZhhkapwC-j%$#QqoD4@+nd2g^c_J75tT=SgzApkH%U8b9v)lpQK8 zE6Q>d7I1z9pUe`)6;>sG*4M%s3q4|^e`(N`5fP!;2WQ)@NRCVS59ByOO@ZZOZg)v9o0hu)8)>9=kfad@F0yDe@qJg`i@Ai5sPWhTqoPfd0c!a zNS(-9!m&)~>8z70Hb?-~TDKnGOBrAj0=NH76iP@S<5{b6jUqezj3l{XsyuetdEA4* zK{%PmgDMXn>caQyd!Dng&dyDVpJPZZ=Yn?-NYJNlnttM9ncz?29IF94cUOPtVhwNl zSoQH~>=(UW=H3B28gU0s`JinVunSUT%u}+jxd_z4VGQsEH?Z0IW-ceV+}7s%tVoyRi>yrlCORe6jbMjnvCyve^n z?a7#z=Oz0b8lwJ?^N&KM!k6D`a=WjU%f9YFzKR z@7RP$y+JnLdNyBOzCFFra&j@?Ldl40bF?VWkJM>P*~GNJf@lm&LXkFo3c9b#1Qr%)`( z!LyCoEPZ@(#v;2c%z%s+wpzk(Ud&v_i`bZ>kgXJjfSamsa@@cLX~GKyC(iOOD`XXL zA%{wv9KVnpG>)`YoA9_1ZYP|nXtt7r-hvlEqG9U1ZLk4dsm`32LvB0*IU31tzk)5Z zUdYm5vw~!4zCa{o#262Q`3E^X*E%Kim> z^L>SEJKU%GyX1JzY>s>MIDHBn8bO`~r9M{rRhSijIFl6~$KB}OJZb0F-;8tiZ|1^& zP7zB)3z>6nAuDpKdL+klq?|pQ1y4@$a|DwCq^)`j23{UO;0PR@t3F6RP7nt##qC|s z9WWrWigX%?ae1^_pCw$0c{{b8^N;X(A%JUrfk3V~PuolE*C)`-nvo~L%Z%e8Pl@)Y zy)c4No%n_hFz4cibT>>)v+qTX84*s0>qp!R5TeMl%qd>QY346sZ*F!vWas{rcOctP z+z!CYBHj0!5XsHv{Q5L@KWyhdoaEl%JR)Au9LVMcdV+UIL8oPQ{7o;trY49Kf^!KX=R)%=Cvg63e|041bA5_@PReXF4;ls!8Urq;)(QCp zKHo!q{~QAE!nrTdH}?#n{XxSayJv{H=T1_SlIv~-YvNi!#3sw12D{6bLSJ_&Y|UCM zqg(MafppNbH;zQvECkHuuw&Jw^#hbZKY#`O0Qu+X2WUW2sb_Z;0@uT#UVlkT26~Lp zV;m1PzBo*hFd$}(izjfA>@z77lK1^#L!x6Q);M)o<5Z2YfcmQy7TxJTE!7%+QgY#1N^shFP;%kJO6WN(xo%ts23CKC%PahG z*labA!x;QBhjT=x z3~_!+nb}JKgT#q95SWoMj|Jsf>6lZRNKwa;W6rKP;3Ppa>U@0w;dTiN$fSsFOr#pY zKX*FD@vMCbm(K@anYI#gc@C4g;#RW?b#v9ZI~|@U*lt{4`^LY}hXd-Be(a(=!dV`a zqg06!N3ha7jH?k9Y+O`Bt|H~1f0DB9x1zeQ5I*0Dz+pHy?(tsC`X>}neO{_6ZJ75& zfk9yqv0CvuuD*+M*BWkcG3G|N3gNR3_5}YaT0D;IcZ052U(B4#zC#3-hl)_iYoMcp zL#^gwQqPKUA@{`EuqOr{Pw$C!%Q+Hr=1AMc>?1gzN6l%;akb~B?M^l+nL-@ttWG>O z!*Or?ucSH6Qm*(3z-B71EcuDO^vwf!JPIeIO?s%?9zO;q$;rh74*mzBc(Mw?#(hO> zQC1P_)8{~v<2gBG_ce>TkDA?dW@8-LHBtNf$^I20<{0(>?*YF(HC-q(DO~{~GTnf_ zBfJH7gnMyE_y*h&-gw>};b!`l0)MN)(k!k zf;WuET~P|v(xZ_c-FQg-=&{T;D!DbYn)IW`GNnfJxYUT=T|uwnmA+>#Wr0)t9`kPQ zItDUh`8EXZ3RZ`!bJ2%cp>*)L=ie*6(A6S6H*?RsGuyyaD!Dqcn92*HY>pQnBC5} z0IUednvr}5;n+0@bkeup!G-!B+qn2v9L4y`xilTRdp4xxm-gb58Sz`wwS6ie zQ4Ylhp9h}`t#pZD@Gj?!g(6?lSeS!|xs1a=(^)hF?KfGLF@wnyR=5!<+m9p%sQshu zIr|WCf6fka9w6dWPG$Yf{k2!^a^FJW zpWxK}9Eg4iD19WexmvJ3C@B!nkz#?zIri2)m{@=XKSiI5vNV03gTRk)%I>T!&~ny{ z{SIh70O&_X@Q~wt$lNV^!u&*ePs)jANU_^mjy3iu{Wn%l&jLjP3itsT({eQXrEI_u zcgnfCKuPrV7elIb1>&t_`I#*#v;UMC6qvHW0&~8s41ATJxo)w8jq?@ah^yRP>4n9; z$^aA$6!36QZcF%;&|&Fc&qI}YgZTr62Z~CZA%hp+#I60MFBsk>o4;DI|*%DJ9K@#RD#MiIC> zFpn*CQw2u#q@kw*b-Qm=6aO>`F?$X$CB*Cr#hzs(hQ!ndwzORTmzFKjC6-o4CB;mq zM7Wq%&1aV=A+P5rosX?CH)FO^z^YX?nb|JMbsd%2*%fG)x13_;j+Mg9Bn3b1PS*0ttz`QvcBvJr?0-S()UAjTlxCvOTKVL#8(%+t@2RSN#A^jeA(yA;R_pmgcGL6 z2OU4y9t-(Gd7i?kuZT_9_{09@N- z0jlf!r`)aU*A{R4oo8ha8mbn!BPTb=`|TXms8b3y`qN%iHCBI4MAh~$K9xE3>!@9- zf{?CnS~_@JcF@6}0msK-&k?6LcXC%XROR^YbB1ntzqE2=0yVy!Ym zRe8JMR)oq*TX`fJ#U5-$`H_k*Bhm7~%57C0m7rb=MD@0%>#IM|X&XaU?X3;b72$?~ zP-S%`j2DELF0C#LL0e>1XcyeJ(!sK>h3m>rg?eD4D_p%g6se8Wh3mUQkCui*E8q^* zMwWzYoA7yLX?S^a^&O#gkxJM;h%^_kj;slufv}zil zX~#LdCC+>hUW{g_B~oQRFz$YOV-IeXqn*c;jAIJ_?2I+nsZey(eNZCLsHO(?_?H+E zOW&fZt93Q&FLidR44a8fZ~6vm+>VN;%@dHmxKDVXRpgNGku=fe&kfwogVmvE_$<%u z%X>EeMBz$abW3r>0yPS3@# z(*qef_Arv|^xT20PEx-65co?trH@mu74+&w?RZci;Oe2kiOGrbViA z`b~ADz|aK5e!E3th$ae#ra<~n?VUrGa6tsx$ojchN(T@gcAqv`ohO}p_xdWl*aV6A zqk(iDyeD)^_=DVs^V(@XoaJO0;IpB3BTn*os{ga7@(zL*=^c3y5%Z6%2a2Qcie*WC z3e#~e(~onR(5tX#;uJ$Stq;CJa_hCfjj|ubmY904V6~pKh{rRI>jlMFJIjX#vI{!DS zyjYgXMR_s5iYYHPUB#3a3#gd#V%aLDyjW1hloy+!V#<(8JdmK`m(F1@Xu=M-X}#%N?* zyE;Tuos1e7H?cnQ8*l5}KGgC7}g1qf_{Cd&*P{ zyvw*ZpvUWQ#mBYO{hnu( z`<&pueXnu4_0)w3+e4htDt%@)2B#S6=JMS7zhk<;9FsCrC_F)=0|-Xwrb7&yOc7~djY};8ORVK zPtV>k|6Q|ARQN(sMHXyO^b*gB1XQE2lL_88z2 zAE7a=7UMe7jR%w>V(+}dgm~U-euKrR>vpI}G^1|2oS7-hsYTW=P&vyGI0Ba^;W{Ge zlc7djpM)+h#v~0?_0E71IQ3Ejx9=^hX_H_YfRbBCr|G?d|*TTIL6(v8a1rGRgLyz=b;3 zy<|4vpaa)`c{lMm^1Q;uEcv_w@i`A6J5F_c41tqy9&hwHop)j_X`5ChjIF0|T$Y0o z`wBEPZFH5Hb3Ksqp+imFFwpH-a6y{uE5h)gvT_h;hf_Ld3KY#%T&C zKA{E{sNNpy%16T^jd-XvYk^Sf&H@pA(KH)e*PG_|?zhb^J*$K}+w?a0t`}bH(Rsa( z2IjhObZY?*trh)rFcaE2z0lDKC5xI?EJ}%k$5G9bROioIyTK&q6g zH|pH2JXzUM=c?pktp{@AQA(nSf<44F!##xqvsXK+#WC&KhpeF{i?WHSqip)$QU0Pl z(H2vO)>2arP42b+rI>TR91k&P{8M%Wd+$+qjDu=C=?E0?U{9ze_)6fg^r01LJbXB} zI`4kS=bk9q!UKzV_}k)Zc=#a3&s8NrrE zJV2^Ypa}QCLV=~=uaz9^YRJLXKn~V4Wt~z{48EJ@xF3D0 zwBSQaBc_N!w7{ZYk=1@z?zvL2vm_OJ+xLWj77rW>uF9Z!L!Jk%#CcHYkMF3$Ug^!) zEA2_SSDHZeImd$+Sf`&x~_x% zSZAebZs)HV1ii@DNi=7mEjvqdG3T^LK~_r> z%*7$u2|9mWT@8<){P3-rvJBPEQ9HXAbLCr|o$lJSgQ^ho)461b19n1P>&#IuDlkKf zJkK-S+vIEK{zYcEc5Br(>*mNUR$pXCxbOLJIClly!tjb)Yhm6jvb*q(h_r(g9{6

YqtleQM2(>z-}d7Vl`eZe3)3 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к$j%q4;H?PjEb$U4-kMJ>BGf`WMjR3TA^YST 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

%ik;Om&oQ0} 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 gBX8nxRxFbD*590qR&Mi6 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%0D%dIXYIuayDS{PFx^OGpjTIuy(c*W&& z%e@w2lfdl71ueTpEre6Yz~ney$Z@vRQcp9g`wtMXq&9yIO)pyNX z5Wv3AS0>6=CJy|SiTW#}%vY|Kui(H8?H|v#_{yi)1gF0;kzZMguP|stkyZJod&y)d zmi~Iv!|x*}v;5^L?t*~Obh{UKjbrEc7MhGLsi%b3&=Ga)i-3b2r`kAE!2`gXjp>EI zo+dm{&foDKR>@8k1Y&KbNDN=%9J6Di)=*&CiBaot)I^;1Z>t&RFc30_bWf)*sxv}Xa2F!p-r!72-$ICJLg3~uNj z0m?KeylsPYwE7soJ5 zZyM^g;3t}NeC#f0hu*bs{khPQSAS#eb3#WgDh(g`@9F4q7%+B%jz*z2YIGs!2pyqh zlZpp(b*Ms6=i$6OVNIVF*vq~6t@BuXS4Rq5AE%;0{bEN`Yl3n(!6KAXV?%xhA}azzYD}zX@M2 z!cM08<8@t+#yTU#=ChBHKmXK*)L_A%IIDLru_1}|UaA%4**+&;{(dx&m5B5Cvm_$p zdme;hp2I-3-f|qRAc)FG{c99)*Pgo#TaRGu$lSXCUjuD=)yo~+jsye}qgCkt${)ZE zDtXe3=rhwGFxO(%gF*Ko?jv-D3&?y77nq`8&<$nh)N{Vg(EhJZ`oj`=(_CeuojaTTS+MV42ENw`XY ztF$ptL|j^>GUaMXi7P-{T?IYmY6C9S7-%8Ud(^4e|HV$IMjxtx{t>QI1>6=EU4s*> zv=pkm5o<k+qu*z_7e5O!`$_G|Oup7X*;{w;s6QY?IJ9u+dnD7l@m`9v z=3o8j-Wgi8sPCjGd;2Jf$qKFgHtxm}$QYjbiq4ma9X3bE$pX=i5lsfL=O|D_NzA1V9@?0R-BjkFhTo01#ez+PBCC5K0;SXDn zl_865VyAaKWLAa(c|rS2?CK5KpO_$YSc9@WJxhy;#ljKp#iv0M^l|p@H4Wo*9ZE&P zD(&mLkm^HoX)7F8pWo9r*itOQ7T!Cmk2Jj5&wE zqL0wkkWqDR1{9}2r>P|LQdY9O-l-&BLL^K;B~gNE z{MX>WR+psOs31t{sU5{J*u&YItamVxLtIiD+HzylBlsUc`RRiNIuZwOr$WQ#9E=JL zLxmz@$1^p;Y>WOM-UXu?3p0kHu02Z<7~)u);fdN{A%s(}zzWC2*J7&B*0&0&khP2ezl_Gthf}VY@n-&>})|sp6azzM3_3MXmu&E9Y$

wl%m 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

|vnPKC}rl zlxKfgmt`kl+HES9nm)Kej>GeMX&dxCFby7=>8sTvn{`}wE&a@bM@oE5w~VHvi0Bw5 zo7=na!AgGIbO0Ch8MruMrX9Pym;*WkFF?mjd*M!Zie=rjx5(A-DEKGRP*DCJ3d$#u zjQ9}`aWW;#Vso|&8b3wtYhgKNJZ3t_qd4t&+=*J%@={LrR{ifgbr|~JxBdS2Wus$R zr=U@kZZ1Z^EbP23M zE@*{&*=o{wj+Q=p42eQ2gg6M>T`~v=VS!P26F;am3t$*tLpqY5du}{G_dL{iTO~3` z%mbW&WEOtQFPN<*p$j(x> zb|x30JVF-v8P&~Mq&IDmPqE1O6u>>^y8A_8YW;A$sefJzbQuk-q&T%E^t9M9g^WI< za%5-DA27ILb<4-peW$>Y+A+fM;jRuiK8POzM-+K35X1?h%$Wv69qkYIU#WeQNdstRd_Q9pN@k3K9=`4Q(h}j_-YN_&+P=fm%dm2kIbFNUtt=2F_s}V+CVT7!Rpa2 zcDA51+e^sSQY9&`&~Th)|1B==BFA8FkhZ_u|v2zlKG46R={UkVMLIh43XXomf8>Nsd-Nsv4Vt z%V2bw?E!TwVBfK7u1TPH<|tV=+xR%lNE+$!@dPXu)amF#H8@(W1DQiLX>oZUnaMYQ zki7Ot+cjfA60&Felj~*Xeo5yJ9dNAo>k{jI%#j=WwjB=*_p_0;9k_oE+%Rze0?8D( zr-Ga^3Vm9BH*MPW*G(Z{y#RCIN61RLQJ8zS8HJ8weJwfZlHcoDl%z7KuQ($~Wo+1{ zAJr)=uNdY1j8WzGUX`o!9%Ni#i8uP1nqt5(T2X`PvKWp6OTc1lF=|5&hWV zM+jnqWSudZG!+|fCcQ6eL16Jl^`FtABHOI?U<)#&H}TPb3ta^BBO^;L%W1$~&_EXW zC%N7!*W2V;Dc4zYEtBgMxt7TFYFxDduI29pzkDWlCJhR6K8*n31Bid$Xjo>r6jg_; zCO9cA4k0cR;UyAzXo0MhyzsH7HV8WsNSw%akjz1n${fpe%lGhn4D$;x#%cHw3HQSf z#5T>sEnxk18$J_B9!JkTF;>>v5adJHb5A)QrRVXx=u&ZIt`7%T60)EGz5rF?ZeLrB zH^<^ZRu9c|IP?b`4*f8BQI0RA9ABEUJIU*C=+Dt&{P?68FT0aU^*YG}lw$+bqdUZ? zi`K8GMT6m^Ee(#%_uy^N+N3V}qj0VHY`KswvrAb%OGkfp!Pc!tUMF*8zEFR1awGq; zhO`vyd6w|aB+_&Z$|MXiP=qSshXd4+V)Vaw_*A4&?xIHA>(aeA@zu{ zVd~g-Nk9^~cHcSBBggKql@D<^oGQ9ioCtA9B~Pj>anG9wsSCmDc>Qa-Gz$V@j<3P5Nca?FkB5h`kf61U zg(Wd*&1k_S+O0Cwn>F|$`_P1pV3F1enXq1GPkru{yAak7gDBf}{0$wL;V0W+BfUR5 z!?{q$(f}t9V}8TAL__$MclNcQ^8J~A1#l_ z-osU#Ti9L3;nxQ~&qMZrwTk!w!d701ffL;LNhdy!2&X&oxmUeEf*Mc-4t(Yh)Pn}3 zp7)#&SpV2@&pIM^l{B*5L!Y0AcLt&f9_Bdoxtq_5Cu0d#ORYRkJ+bXDc;+}n2p9)h z2Br{Uzxn`$0artq;Fd!___2lsV+k%92^Yo1(bu1bDw=tM3jq$YQerM z>860qM6%M-M6AIvjtLFTUJ+uqr$jes6pLP^9U5y!NVk8Q|>R7W;+*;3&n71Fu z!nymBWT7|OZ@O4uUCSfdH>p`?@u<1-ntTKr^x~Yd#g2I&bKP>*kuXXwTa3Z0I!82| zV>8qVR{CVDRdS(U%^y?C=~)@7uC=u!ewRA8Fw=n&(a zZ>`*0Sw~Nqu?Wo1CSkytmqsD^9kSL1t^1astq>U&C@fMTb681U-4PN#nXBgNtAvD0 zTauhMF6~4e2_EjAy8(PxRzL!hv<6th)jpqPB&kBx;#aMtsC z1ughQ?SGrH3Oxq&Fzi$eu7hYN?b5K_1=iz&v6hGl4pLS=LFku}b$EIjPI`H@)rsLW zby+wueC}6!&57X$AyCk;$$8#PoiK;!y$)~s zJOqqX$JoV}_Yzcx7NiLQg@Ee7dnXCX&jk(o3wRdJt*sMX$z+^6UxX9iHmT45&G}A3 zg!Oci5Dgm6BgCiR2=OTgCqw?|6a+P$48u|zGPFs}e?gax^3Hs?vu z>W?F^J?fgbM1Ir*5}z!r@#o=R3)iZi30$8&>j9*2%fYR!V3r6lc(TR~eyrYkQ*a}+ zz>cX4QXyNo1spAf!-Z~eLLFizEoq2DU)p;93dSw1{ayz-2^XRgx1OlQND2ZcUD5L+ z(Ce?AyWkp4=?gaz3~JY=0jbu<37I zM;Jqw^@dsJ`p*a<`YiRr+u@$Jg`0Dp2wszEtbk(yfjd6MC|dnqgXFd!|J(=X)+^ES z{SJR$W7G@nSJ5{JCjb5yY0+uos<*1CmwVpZ_*K=^$vy9WCUDdaIAr-&l(ti^n4dzB z-zau6EOR}ERK))d_A~sqX&u|ksjoNuqjekC3|dyyw-os0cSqr1Y+9W8$z($;c7XEk;! zVcSxSwr^eQLr@+xpJ4Yxs|nwGQ}<)JYa3FqP_QHKqW!z1{W1U67Y{@0gpDWcM^647 z2Y9rB^IUy0(=M6%#%>HRr$m3+H9yZ*UC|e`X{TLh+`l!0*3L5mR*~CT*8X&54N|q2 zp)A={a0U_i?92J{!Q2Cc@0@jYxQY95r`5#cZ(rv1D_m{#GyW3^eaj8G5g_4AP7BMm zezT2)#UW#sfUgdPC&+0Z7?%o|5W|hE4UhA9DK(MUfttIT1U1)cN3>c9**KKU-#|F$ zM=ENQ*g00a7{)@is(G`}``at=k=hBf zubS|Kc5@~R+bx9|Z!@eC)0DLqq+iWLSrTW3G0zJn!VF^}7o+?ID1QmdM|yGGzW{eY z#jX_hh*?}WzQ?&k2rYBHjWp~^v(ToS!B_kXhz2`IZ zK_52z^-IVqt)eB)E-y&iWxf9!c^#oLUmyHtuj%2KT>n-&cxIf@XgRVi!O;6NH2!3FW~-Lc;PSWf`JDg=J#S-35jZ2 z4>|(u3|CJdtA|{Vn(^;RKWalUQPn#aVZ@tf|KA$$$>5*WfFPiI)?-Cj zrN0JebNBqUErmHmMm?E-IwoJmV!P;K&Ez#O*_IZQhcIvbh0-Mdcv-NYqF4T@XG25L zav(t5t~-E_2DoqEhfxf`Qef%4&?He-)gCpWT1UO@GOU}_#mpCkK{8u1o*1+a&E*pD z$9BM7z#VXhBV!O0#1q8QTl~g+@vhid4T0cM$hv@RF}c?5fCso0*-onXb#5&xR)Mt? zs?L%0aJil$*AwKr5=)tCl_TlH<=RiKz2%yTYl7J!(aOGXL+*O;yWyx9{BB#l&F`QW zct2z*8WgPUw8!TmoMtitDcICw$BTSB260Dg1He^x_+HNRs*3f{PDW+YTa^O#PGVv& zTF_EBxSF=h;g~J8oGo6=xXIL+M*WS(5z?>lvJnrmp=yA?VhZJj)&+)(VIN|ClkP5e zoq!~1@GYRh1Chp5yft!3?riEgN=d|-kWfZ6XMX}Y5i|lG1D5M!q>-^0h3r6*g%)+^u?}IbhjW@z5tzFLQ07gT`PGB@KP9z&FGsTmcs)h zzL-8EV7+(n^Hi6dZ;0hWl$=5=&q{xu>Sf4d6U*yZ5QrswUErGqKU?8)6tSU$tCu*n zThtwY%!Y91YHmIX-1ZdYsd=beXby&RX8Bp&o>zZpw9LB|% zk7tsxji>#1IQ3wWT%j=Nxl9k67z}qztoAwkvz*ZTLNcKlU5>NT&OJVDZrOWVt8;gl z4xPiQZ`PSZ*-6V`QDeez_%nDdR|D!;lnP0KDm&gqoS-NHYN-j2kyf09r+xU$VR3I4 zNO9{;aSbB<_-mo=+oZ0FcaL!IE+RaETp|FH zCYLjMH(TnB=Sg_BtRiW7Rnix)<~nYLq@S1Tv$%3U*ql#uh_{w&!7GM-%*%zq2~389 zQT=8TRd>Cvq(2tYZW9hA2)3*$?Fq`M0AB zHByJ`t+h4@#OiGi4XY%9*pzo>XOK0t61+Gzqa_4OGqyPQp+(}?kO;8wl;Ewh@PyQ! z+%*)#f-@Tw8dBhXj@X^Kj5K*E&V2qCma5oacn=|wS^&fg#L$h4e|u_4o5=}+)_~xM zt1`=O4X&b&7Jsu5+_xSopM1jUJS+}h#h`Z&3|$)-vBo|3Yjh3EQ8)=#K<;smK?)jy zs++0pl7J~B@0i+H?_NUp5dVIy5)N%ucMSr5$yyTrUdM?<3Cu6PK9 zv(SgF_)o0q?DK5`E%C~cr(~3~Loh6DRfnJpc9FADBxhO27Ja9vSArN-h6Bb3pGSPa zim#CanA~0Do8bGcto$B$i8$QpABGLe_+N%Sj9&Vifj{IR9}4(Jl;ceMYPtO7&*8#D zVp+pK!x#w$pTCBU2bAa%w`L$*fAppm>pYQ=E`n%;9m8#Rnj|YSnJ2O43P&yYod@*F zP=7$Flr2F^*LmThd&HS347?TpZtWkCRcG+m_74bg!5Z=odk1)*m+xM_vJRCLSdWM) z()y=p*sodn3?4>TQNI;k_$97TH*p1xa|klfC@dmZW#SIGI{<=KtXZpnyw)dlBSZEF zz(z8JANva;6V8V>XEn=d6Aw}6`OgQ)ql2a`cfElhuv6ZP?;{Jj$;D_ofr$YwwsQ)s z*Pzmt^0X4Tr7#<4lRUQ5s0rnZbSpp~v_5L?I3P`QVNGfiO+Zy3WU;U!L#G32InfuH zDDxyKbHaEVLUDfpSd-Pf9mr$#13zBa!0Mt48+EM;H=*TWKDWK}w12Di&y$Fd>OU_7 zfqg3m;u{!-pLt(zLeuX)e}wzc7cRj&-0Jj=oI)F6_}u7r^}AO47h>|%oQ!R6PIFE5 z!*|pLdzQS7>C(ZPvDVk=F543aUl+a2-fdK;T~8-c7dkAlZil_oe2m~cRcBB)oP^Kx zW;N`bk>GD?Og+xGljETZfm#j?bemlkKkwk~i8S;5)i2{L9Z3f0jY}KR?)e-88ES(; zGD7Jvs1Hl_>XI8-K)sx5=om{(loC9x#7i?*W?})4xYZ@%$>F~tqpHPSepuzpGV(Zb z&w8j4@0(ArYUxux2nZCwFN`RC$|sJ;^s6Wa?F^_zQ+a62wxIjD9nC#Kfp%R4a%62Y zCVYnE{~oc-F*S_Ky?YLRY2_1UQbhtap?nf@cL8cKULYpKVYr4Bcf{TPbQ{lT>V3tDgh|QMEw@nkgWv&rOMf?SEf2i$%Zo{|D{Wzem z*j2k_xV#s(9b*vfHCq5aoj?&-znfLF=OW-*G zhnZwgys0TmrFV{z-}dVg@D z5Lw@bN+4~JDFKF*$%xng>my6tChi{ZuK@B?YfV9JpGLWb1X%eB4o1uW$d3fs#9+xS0l5#RR;E+rEd z!7tHbh|_H?g3BLAW$GVteOj)M%XN`l|035v%QYs~+vPe(t~cYlNtH|bMyA`@9}PQT zBbSuYbC-Xqy&l7=W(`*t6mSp_-^@$qM1J(a?JQsEa^B9)&&tjGV%qDQ3cYu*?-jGUESJr0CBfYlK@(PW^a0>4;}BDpC`BVsHrT@I$$!}s-IF!1+;HMBxJ3Tb9uI?d*Gzv zdkHx+&W#<4kRMniVl%Cpg~y^E=T4s(fCpAws@{Cww&Xz7E~mQHh#)c3V>a!L&&Ek8 zpc|1Ctxc%|Tie%ZRFE)qMw@}}MeCi6c}d#57c*~s1azvg`)bh-HnmXoD58b|-cwL_ z@dDjcA;-xJg0bo&5)7E!^hRs=5yo&xb=03p>juVfLIe_4C9tD-qgDeV&a&%Lq(K&@ z!k#lNV?_=sQoT?qxJljNthL_1egN)JqK$ovCJ3k%J-yCDQuYhDmuHPbdQ!A7JMKN4 zwWDLd;T}vR!DPmu!{@{0~AAGkT;FALYGeUkFzvDJ31QQvU6oR zb4bKD?LZGrm4hw;%EYw-N_NFm6|Fgd_yPT1MP?^?YJb2VVikQ*1wmd2`Q;1uY-$g! zqQx@$Mh%aiCpy|LojXl!!crKYZB*A4iQ3B}>wk_6*8jyM7|`_KmQ;ViA;0^>q*tz| zslB@U8D77t;gel*ZIbJUxEdvSd-|a|&?6z7mTTz}n;zv+Ee;2EsE5KegagKOJTJw= zTF}w_U}_we@CNt1E&L47t2%&F9^Z#B`C~^Rah_u3wC=CKFdbN&ejDFsLEwTcm`~pY zp5QPOaI8#v{Y^aKM*qpNgR$v^#dTq8ajV+gjt&*3Owt0 za)nu$`4^k1U&}}}Cfbb-R}=Fuj$L_Zb2d~y5jzY{4Sp=Z{EEb`{7M^v;d>>dW1Az= z&AwNa#c9i!fpwUgr_1P6 zHd27cwSjH~dY`t05iDUeN?_NqM5_TgSfI5UiyOEwh=7_rf)seoopJwNhJb839TNba zY}j(5)l2?5LqlfaThI{Xs$?!74&?U5#~z01QjVP+HzMxkXGY6cFhaR+UjxK2u4*A` z6e(T_FEi1c%1~_LVYD=W7nQ&t&+Wdg5@Q^+{wubJ1e*(hEuFxF3sczA@o1s2rHQD) z$(EYWOwW*dA&+f^c>grc$OFxtp(|zcXj@0~CR8HWL^l|0u~8gnj&o~n?1ICtUN0GQhMGP{sVZq8=PSscBnQ(nIKz#5(t5`PZkPTN@O+c{ zgQO?Q^(whuF4v23HT=ld_nPo+4$=7dr)*Y)=+!ukmN8y%q*5iiPN5Zt2z``~nFmHx zNEN+%-aB~X45GVMGopTB{@;C zmdI>QRG8#Mg{hoq=7%Yqs89`f-sVIJA(Y3HJ7ciK{M9cWfsQpFK{A8gkD$K-fr*u@ zw)90R-ZVE_Vz^OVt1`%uyqY6*RD7Bb;HcAnjq!G{BrVpM8GtE~5Nq0JYnQQ%J$X__ zr?Rs(7@a(+Fl`ZsvxvW=h!hx*aA?NlehoB&Hu2@IOeAUUM%e1y>GFLcM_H`oOqfG{ zvUCof^3&VoxCA*a1%1A|5)c*GYAT}LoIvG@s?~c}3I(xame`ayeGjfA{rvP~Ap>Sf zVYB4YwA~-X%+DdSNSGk4OW3mUpu4w0L1&Bqh4A-ri2tpS1)VE3)c0tVB%sjL7r-&( zw+2>Aa%xYnze$SZ_Zg%#`Qng245kVDporH^}WkDL!EsHbX3ay^pnDc7!Y{o!7|Js{V; za{W}UALD9>Ep9fwEwTd;?t$=6i%P(9)jnoZT$plU9NsMyck&FOv=i?RSvPsm@|2Kr zq&|o!$7AC2BNHDe0C_~@J@xkKTCe?_0LMrf_d9^oKB@Seh#o&d0FVo55)ZoVOWRdRfjmd^5@li3+p`}^@hSN<-bB7mt%Cc7&==IYr=A@ zW0(74S9NN>G{9X*Nl{alJDuHgsk>&ZD7_g;js{Gaow*pnYc58XZa)HIa$KUa(^}lC z2f~lRB{@3bZdCaktHk{YY|7-K+x08RIaqW{mk$^5$G->*_&yYW{13a?uti7A#L&fSe~< zcYJn6WyS1_vf=hn;9hTs?&$r7hRbrGLQkZD3ajJ(HG~Gr-=ey8Ww48h%kf`t=l9hf zPw2+7hF}>21?+NF{D>%ECC8gxY-4xOxC35!Fk`n9KiDYrmthr`!`yAEza53a$h4o* zlm$p&E^~?{r6|tkfrn#Ws=z(Gj+Se~gPhr?BVDcXakOPR=vYn@4bU5uwDQua6|c#X2|6T zUZl51LfkP>AG^F$^F^)aEz}g>WAr41l5CD*3?=af1QSb<4maS;B>4GZ-rf(?*{O1JP$=CX6+8=tgTO5Kpa@8dZK{Dtd$`^>k_9Rk2g@M z2O3<0G|)g!K?XEX{$^E}A+r{-Q73LiKFRN^J(1{*{e+uj*4C@19+FurIevv4LF)o> zPC;;SI;UXXb?3b6OQg^{BxK$h9{S8LIN$yi<8_l=X^{l-*_Jj62xfkn$E7(=#mBXB&tGyU_8SNTK6j03qH(GUER# zKT^I=PrqGUiv9IujT7CS@W-1pVm41`P`AEOlc%r6&z1>7ERdo)}bgr|rpL_M|Qs z;{o2$K`8u(Xgm*jE6>raBQXv(>-aaseGQ7`t}P<^`vHruIVGjh8^7-d)=|C-|2&pK z^80FsX(T)!f-m~IOC1YRZRhw)yE%^5IWDnteDOds$92eY&<393Xy8fhH1PO#s~e-M z>t$Cr&r#ih@A{b-PHj6jQ0F_!&R5{bSBHFUbBxnD`r0`TcjUMWIjnZ#(WFiZj1d{; zE@7Ag^h=QsqrF*8K1ZbBlR1Mg#4ut8*WhbA0NderaF+Iy>m&22V#q|=o~yju^VRwk zK5&I#iy!{Qo~qbyj38_WV9e6fbQ^|ux0$9&3$oiZJ1qaNo{!s9uM;#1?{-ecZD~<> zBGK^sqe-C4+pDJRrqYRV|9?4sfJG<|{_;bAR!u^;|7>bPZOZPHueQG)sKe_8XSb<8 zg3#Hu{qGwGN~E+<)2r{}q*vQOul6Gadi7sWj?a;d_}`P`HB74)Cdz?aEM)jPBQ~{% z1t}F7EZ8PkARs72VQsMo1pNTfVe~+tL)E%M8y7zCkcMaC44zG@Gq3X3cKq-EN#n0w zUmki@cYB#@0a6kFe?gnywQ-@-@jq*X0>pdZM-9>t>)%v4|>&q;;-BsZac z=WV>+#%towmQT(4@|oOP9p8z2C@>p~?lYqyfeB<6#sRa@aCpF4x&%l8wPZ22$>(D$ zMIQIb(`Zwyx+45LD8%iR=m32EfyYqmimHYo4Iv-gxSU<0X}9Uu+y%_Dd{^;n*~3=? zcaWJhPTzSdUuL~=J-)`zRs7akk0(2~9045@exjD78^llcsTu_Wq7L~Lz=XKt%j~9H ziSi0yR2&|hQ@0px3B$80w<8Q?l$S3n_jbU1mkF>Qz&AJ&s9A!A1*m58(rX_DY)l9KcVLY} z!O1CL5|Tq>+y2U<#Y2V_WJ;6qlbH+vgzqx%z3qL zH3`~YOry0-aqAMM87Ysoo%(RENIp%}`xfeH30EV^#83>6&QNddCGDS=Ta70;aS#s& z3ll=j7V2{YaG+Y-Od7<9UO4>#wDg7CN_@<~{a5Luc%+5x`4=pKl0tiWxr(Z7ZtO*H zKbU1$d>*`=Bq%O_6w~_%28J4Uj1)_DaewrZ4py_sRAV!- zzS@b#k2|0n+B_<~J^NJTv>mMausAqa)lwj_t=e8~Yrw9G@y5OCl(Vukcs4Cgz}-Tg zR*e02>L@&PI9Jt>1AEnsyNoTHBPT8r;L98~hj*2i-c@!;R!w7&)iDj*R}tS%67eV& z@dkWoACT3{jeNGRBe6utTc{4St&ww~n64ywYW1f=+d3YOm1lsd6HzM&Q%3{Az7LS8 zJy|+0HtZ(6F+z=Ld;2u=E;V_#NnYblROiUsF2TA$Rp@;7=4KoctM@mX&CPU*{2@=4 zTV4{U4+vD4eXG$|5GhXBB$0x?@}XNuqaM7CtFGfByxxf?kpJX)rCew6Ny=XudC-4n zsyx_awxnS)4VQgA8>o)MzMg;95%a9MwQ`evJ(g_ifgj{ST%x%bAriWQTM_yUzl)rq z%xmvN@X>Molt45lv_HCZ35$)2q=M}TOY8VECNEXb(e|c<_r%Nnih&TBQ#K`(>=oJ6 zY)Y6_2sMaaVFn<4j|V*}CdI{4g48#UD^1(WU3gkFES&29t4#?c>0o+Nm5~VoYN7?1 zKu^|L*J`y*0O$c<x!X{O6gbY{`=s#Ixo6-e9FY2RdlOAs~VClzu zIP?AzdBLmywlc9iz@EAT#JH680G!!nq9vCFc*3b1mxX{aOh>Syhs?}D9Ks^%!;QF| zjDH9?M?7O2r;nCYz(cX;Sfs(uy*ch>z4$y57##Nw;Z$CaY#7oMRMOr8|ND$9Zf@w? zffRHb*x+(LzFjI)Bq=bW{skyR!xy6ne7c?`nMv61<5pt$Po7ABBd?l+1$sLO4LVT6N*rrO zXAt{3W-vF9+1^esE$uzH#>jb%8Cf5t)dY)YUavdetGjaVf z{&_?00tnNxjlyzehHYWG&}<&agOtxLrLup35yc=Hi5DT<6m2)wN=kM!^CR?JgtP|D z2yOQ3)t?HS-f^}>mVVjyC(?mFy#N3Ri{N;6$RUu0GhP-E-ebE3W@E}CFbyUwT;XDV zEMd35n?+e;eyz;xh1hHdL$)u7LKMtIOnDK z{Mg9jDWL}t8OU}zg?((JJ1}DV^j~v(M2djE`Vc^a0{Yxm0=hJ{`JD9fIsGl0U!c37 zTm6xxSqF4p<8-RqMu-<<{EUQN4VRP^;w{l-i};B(={7~Z83J&tCrclFe4tj;O6EKZxZnN;HQ8mhJX5XfLHJc{0|8GsXkK!xNa}@@)Q1zkbJmdxBqemZ6ntAsYV-9h z8Z>uFy5bfJ>K`J#Nxdsiw#xMlKH(oxi08rk67eFQ$*ukdEB!g2mI9Rmmg|v9TSPAg zE0m}?|B=~Nz%%!-urrRBg@HM1$7s#Qe;F_74AgQYT#eXWJ63v1!8-Se>B2@JF> z_YymPLV<-7oq#32%9nQ|Gve%^x(xif0lbF~%>|ph`eEXkCfes#gZw^BC;V?hoTrINS`Z`BLUk9jW4b zbPWN4rM9Y7tVRL?%kLizSrO(ZUiUIa(9K{A-uh@S0~vps>F7%z_ND3-1h7D(!qebX zkG}A0{v8xl$K3A(Re$`_po)hHDkrS|(I`f``E0jfv{B5lZE2@UCc3VgyK!riXzgKN z5WlVYUJRK&*qQz55sW=VX@~=i7X^SyY<>+=^dVgG43Nq{Y=h3o^8@(wn=qd0N5$sD z`zptYF0qRN(e>aSy>l&U2o}JtR~Ll2wec$l;=8 zLsg56#UXI~e@LNVvtM1dtE%%bQu>fM9cuSms06D8gLBYY^fQmQ`Y^?5jdXlYSoEfQ zGdC1L`ITeEBEWp3EX0*GDj5tlM-DZ}3`fuQs8cH>9Q~KQeRDQtGGV@V0l*3E z*!JmgCvY&|W~jox{e@<)?$I!=oYyHZ=j#klMur@iHi-JT+oEU-jVizF3NkAD6s2*c zgMw8bHwL3)4~Sl>03v-!^N}R#{nY1OAg0nE5*^epy2uJ&H!HeICb@1j7A1v$I}!uf zryEF55tEUz9t2|UBaHeD^~rJB8DrvI&yg`k^J9|P($mUzFYh~b3@jHo;4Ca}V;VZz za-q`|Pu#x!! z>{{T=>mxJIetJ1iVhvhUD@rQ^*7!`|s~5FFRV0Q@NHf5TRcvno=7QX$6O}h3qWG*y zlM?Z&O-8Kt*aIkh8NwX?tLNpw>c^1dU?4dm3qc4khQ4xv9l|^ddz$e*{{q%;FcPS+ z**wHF#KTv}$;St*BUq(rMA`zP31xNn9T)N0PBYThqfz$ zkD|!>2@nV%Oc25$DkDY(!)g>25RVB-WCk)C(IC2@Q53;dmxV-e6%0%Q8Qal#pt!4U zbXURkLRTT6NH|R5f&@>%i?|+CHn@TZhX?uo|5w#BJ(CIH@Z(2%x~sdYURAxTUcGwt zuDaN+t>_3TfAGf*avZVaI0XchEE#kR8X3H)Ovl|Q&kS9LQ08x|<8QS?nZvF$pXGab zro#A-ze6bVSqNo5%Mr?4`q6o&LQZg2Z!$#&zARTtdS&NmRz4j$7RNnHAs=Uhv)19kI^W(8RD`K8FS5jrfs6xN!`nRhgBx^Dv6 zLKHl~$5L2aL@}w>BA6pR?KGcsR&+E+KcYGM(jCzpp=hAB8`O%XUX%~gl@JrUSeqoO z1%I&fzcWW4=T<)f9-zlnm0>7aKv)MF?H^}varG-k$pnDIabWoBdgwR7*Wm|-uTRW3 zwc#9W(nG^v32zLxeuntra%578TmqTH(aj7d9U-wqhDuu|Hhxer+>U)3{my zWVUft?gJ}kAW3kQ&%o8G_))8iVhcD399q#w-h8NR)-@p;pZVDqa=K?w~vnCoIV;EN&W{H;9_$(fGohj&b;#9MJ&&w)FuUUs4>1 z3I5h-p2^yBE$pQgu12K=brk+pW)PXhcY?Q_;}4B=W4|bQ8_qRw8ycXJflqmo%m%-8 zQ3g+J_>)~*Q3tTLzr;b7mwJ=q6cJ$-!SuWspJ-){%xAjHMM;1F#=JpT2Lts8% za3l_m83`6QQV#6&2Z#8BwZY=Z3#vyBHA&5jK3-m0$w7%92_$e)BM#63B1- zKMTJR_SX^{%dF&@F;HdgLxL*&SoKEjJb=tYXd`p0ciL&QbZ-GC;-w-Lw8meP0hD^} zrvrhAPS=3w$j2fO&Ba&|BF+&U5S@QG5Z%!e5Dh#ah>|r#+MMlL`k! z&$m5{KH8Crf*;;{Abmt5Hu|WO1EOmTM4ZDoAnJQK5M4`%k^oV*RhTw8GqBI)Doy6_ zhm!vKcXURuv;a@=&6q5S@`S_%ObmtOU8uA`qY<%*gmLm_OuwKe^CN2GSm(h?=6rq} zwz81_&oIXZxk`?g7A1AWF$VjuQPWo_bufcehC=lyQuV!eXH&WOKOjXa!TiKc=m3vC z5W|LS>IOn)@&%GP5z<-I*h_YU9$`2{7j$)%eg%X8PpJn*yVl z>dXV1sh%9OyD2lUlA#hYYHb0s-&#r*2xH7f{J=ER0OwGgD@-eo&$_1yKb%mNyo=<^nq%>s~1-w zYwF-}#)@#S0E0MK=%fA8%q|Xj z!_B|ar!VQPgU-J6U1mQO*)y#Ta(Kv_s8kLQnTxTLo8T`^O*lowRoVle0cf@+jNdX@ z!4pj=fHhCvB@KNt+zwk3YMjTiK#1R9VIVX^mlM@Wn@+8ejB7nUQPZshrqkpa2LXKC z4g}C}37{7gWXvcOhX!zd6={G0`KCzU9U91+?~Z_6b=LudoL}t#c>qDSSSqH!n1CB_!>G0h2&9fZiSE3q=?>xi+6J%;9508j0#!Q$dlGNG9D=bz=q>eZ4P6yp zs{Vuyyyd6)fEZ`e7`}FU*-p4S@G*g3{c;p%&6-t~x7Bb-_5dEj-3JQuTR19<3JzBGndyQYJ zcl}_9HrQWbZ%V@-Vb=y5-e?9M5fDO2YabUF3IHUS@W!}IIKoxQGYsD)v$(fT*T>xI z8r0Wt1Wo6m)c^fWjKv<}N!bQX8H5Rg-;by+{qsv45l>O6pn>;c3gKvETI zQ$MfQ+4-P5Gy!+!ICsRuq|R+VO+fD4P=J^KAnQ>JEBN!n08#{3>L2gY<>HNMI}gK+ zocv5xCo*T!Yv=I2o1gb zazn-2h#z#4JV}IX)?}6+QsiCg^9uyq1X1_CsVU_pt^F~Z`bwvj@&geX+S!Wlh-C6( z6$2ub4oeuvOR|0TlkNd2_Z>Xg%;$vOHZQ7Y@gF`!UStcA`4ub=3oNIWi*(UqSgIzv z)9*`NIt3k#aeV(_04}&J6`p%13$kU4n`QrHmPT)R?{@;^F%PUx4aS3XWhzR21A3Yq zPAetUj?=1uIOB(;nSm7v$ke9j61JY&&)Ug=Co`}L17Gg8*G?qQ zO?%Pdc-Kze{cOLJDlRtf+Q_?K?RQlK?@aS9u`m^7?z7)X)B50@^vrP>p?VHYDD@jX zNiJZ|U2d9|(s+f_E>OtN-NctrYEO?)lIV#io6p^iz3}EzT~GxJDqh2i)_ZhY1!tbG z#UvRkL>TJWZQbzZhYmm~`E=SI_Z?9uR@0o{0l&Sa#qEWmVxv`3)>9ZWDx%@`9@l z3YLFj1AQ2lnY)mefT0O0FH>_>_OqI3-f#faSo7c}{66zg&xdo&gNF~N+HaVrznzB< zsrCcwNj47&q|%>pE-@h};Aj6c4+;G2bMsKaH}9JV4k@;=TbZQ*y|G8uHZ zxKIY9p5X0SDNRaMnl{~R%$FwZ7o8>z+^Ex{tUN4$_=7wcbACqrS@Lf^W|Hl#A9RoL z8}+(*kcwY44+R{IIp@o0!ntWO1&0+XKzGv}>zS`$fyKs&TKY@PUQ4&Bh+7uCvYyF@ z1xkHCme+6OddX<|Y58%*`7ZJ{Q&NV@^-M`WRjvc&dc0hZk!vrxcEhz?b(X77O31<$ z{#>o>xA@=++nI~*ABd|*Z_&J5>%Y0y=h$yifR+DDYgaZnMuul;VkTm3+D=_O>+jBA zK)HH9D|906GRz&m+EsEdIwE5KODKgegi+>=?V?S4P4-yyF2L8%&n9yI%{hef#1&zJ8LgZ z8iNOHE7jiG^d2F`!r?^QD1aMfk|Y~*eWAP4it(u4gxdj(c=IdpAZx?M3@G2Wwss+O z*z~!W0V7WN2kgLILp-cP_VBqE1uCgZlfbLDlPsuXxBYRSP$te_8;?^TOIDKgTf>W2 zO6R*u=?3n@j=o~FK!+KaY_|>vtp+y09+~?6{nWBp+N(dHw3hZvkK0X#?bs4}z)fkx zruyXWO9^h0QU;+TT$mwZFhX4>O~;efV--CP^>~_1H8rIbD1kmCWs)8_l6J(< zc5QH=vf0|3KWI8N|HK29g}L>N)JKv-reb~~Z;B=dHYAflh-aGa?St6K zd?ww|c#6m3{qAJuaVq7g4`?U78Q#tOEIBAPQgqM(2jlFcknPO1l6Rdt;w5r=2ksv5 z-k32UAT{hWO~q9#j=LrdACO*cjSuu>3A;bl%K-!MAkJiZ`HEB;UcQ37#^zDA;}ja2 ztjOMJ<6x=V(#qPyizrath026K`>~OHG__x^FTKhc&YW9r&1$f08^oz}@II*uAC8yF zV?DD_3`SQ1nL~3dL@Drtd5p=qBG-wyu2&P}{xZ2< zEZ5OYkN!t5Cb%2ih@(hRubYm>Ddsq{9XQ2|8|cu`giLD@hrp-9DyWC%G&S)R`Z&Rw z%QsE6);(k%;54@;@wD@S^ra8weE$qA|4l_nfnU28_2i`h>Eo@rT=r_J#n-o7B%#Et z%X&MajvuYV2#idTut-1y97E7S2M=iM$6bAH)(kJZ+fK5*>=GG=?z{=?GK8ukVPo5L zftTx|`s6d+ZaH7D7@56R($Gtca7L_7x;0|q(VJ6JYK=v)UW(LD%oy*-<;npTG+t>>u+Dk)Jge+5k3aBX`Ywi4JDd#k{l zVglQCE{_Rpd%<`(MZDz=cJ>D04jmlbTO!o9)pLBN!2Vz3kppAPl6CzN;$k%Z2x-OL z+ZH>G;c_N9DLt(lNLz%SpqhC*V^LJ{@O1 z%`>9pe1L@}c<}LA0^taJoQ01I@bL`uF&&#IcSfK%d|ZH!he^rT;Nyw5q|^KEbQTc; zCRhDrkygblV@cBccq%KMgNN+0rvmsv_6qzM31_k|MvBS)BLXQy5#%?>-hijF(kJnN z?0?4(vRC0}lIxF2H80>x*PU{39o{lI2Uy<@+Dm0n3{y-}?mUPhWUI#mvz41{TFC>A6}@tq{3voz+_vjvoYDO?f7L<8P@!I&*?7Np|dgB1~Sx7dXh=%G?Oi%jUIp}Og5STFDAHX_%3x;7@Me3Px%WP8(OE7#eWY`5(eT^p0su_jxE z$###)wpeFlvJK=(*GW$@No~v3T~cMTU1qXv)Y+KKY#jmQm&ZspCaJ|HTfNEVHraOQ zY)oc0BGl432|P-aXK5JSmeP`w|o3|LhG-C=Q=;+t$_3 zgAdnzU6F{uK-68IS=U>~}^ymx5w=6(tlE_=nvLU+gvDCqC;us%Qfk8$Dy0 zhaBd7)ab=_1!w^o^uor0iR!)QAt{6Bd4sb6!YqJrL2vRreXMJHCNnj$Gn{A8e%7o&C1V=m>=tqI=Zp`ayMrhd; zY=d|xWw@+EQVQq$7`IzszRM1I+N;oyZ26k%toBgX*Sdc%Uh&D7L9C-#yh(cB=hU%e zBb(Q2y`Dxn;lq(OKI`HbH47GwIiJegDqmm*wJe_n$Nk%Q=eIgiL(SkGmH|`_+;DAm zC|RexC`#5QZ@`3??Uidmi3D2YsWHA?hoU3t_#X$LBb})3ct<)TtQ;i>S|Gv)yJGg* zV*KC$-s+)Lk}fqP;JIWhdrLmClAiXO-YQ8e!`D7;fssA~O1+-85lOO-3sZ35Yg682 zoZ||F0bOM769YLnn=a3S-Hhm^Lu2P!?Q;=A8><NnVR1<2Ty3FV7ea-_MDrfx2 zGi%W>HE<)kR3HU0c&KA&qczGakn-%|0aAr0Y;jfCS?bd|T^2UKbIXb@i(6$MOe@Ai zRB@AAEADu84~wHJe7B4hwP6<#VD?%LCL+kMQ6Hbhnb`+&t-}>6anrv8KXtryhIis> zEHl-exDy^<4;EK$>6+kcyRqp%q`OQ*cbL$u!cz)FA)m!N&3#%gO-kw$3 z@3$-)0Jzi%8+vge4YT8uy+H&E4t4pMhUOr6Vjll`V_M=C)iH=Eo+-;4gwLtDx8qAj z#{-^~W9TI3q;QbYcoR14giApGaI)3XgsmIE#DwjLsb<2K&)~Wp)R#CY9@90P32x>0 zb4=Eb(=*c?tX<_utXyn)$&slkXKFbe8r{z6={0j46E&3j_=Vp!iJ7QqE9^XsdAnPv z53!f^$yP{;5DxZ%c|-YIxf1%+)3O&7pm5%1?15Mm3*&rz8rsb<_-Z}mLQvO;xxsFB zcV=Y|Tq*DWKnd*Ms@8xZ*|iNpZA}tT6mxS%8FiKXi=XS$$eTqPwF|}Xx5@mja;E#b z8>e6Az8yX#TdQ-np$6TI&z_1DtOH-#QQw;tN{F2WYcj~$D&b3|Pwqou7@?C$dGp^E z%Bw)_cD&LnaqP}|HR$zTxPE<}E$<9IWnRVz)9--uDrs2Kpe!4sdifc)7K|6Wt^N15 zfK>x1r(4IWB{$hvH4mM}Ih4l%F_H{5dw zFL;jAwSU4m0TGV=UoY%A?1`kD-3HhA1u%F7zR(*EdrDoW=MvZ8%rSEl{!fxHqSR~8#IYf&cmi{`~q!TjW2ZDpu+hdR%1ug zO9jV71ZURZuTBHC)BuH~D4-BH%|x2;Sv~!_VN2DBOg8NN+~A!l_|x*MgD&ABq(qf~ zCLQFV3SBsZ`NLbJyqV!65vp^RVi3_g4kCWIRU)oMA1JpjD(cJ#6!opMs7x z)CyGFNUkCUb2bqwmlS29ChT?;6<3_5se4e2*xJA&L4n=>Efh#{qN1r!Q2FRo(%|Ib zP|?)}+?T6bxvplq{EJyXyD?3HCVQjvpgS%&-=@iA(4=37TFIaS2=)1Mu?_h{Q&N0^ znOObmusE^d3!sY{^-K?mSTLasru_wIWCa^pHlfV97IAa})*|SA;V)Bfoe%KL(XOGS ztQY%=>jz%cAO9;fobfQ$;W7iI6$_p*+=&UYhs1GV5)$-}IzbV;cd&g26y9bUeEKqB zD}=*2?RhXshR;#V4z^3K&Q5Lvw8sl`f)#~2@cw1k95mizmW%z-YJ!)u3dDWkWgIUB z1}3i!6H;SfG6%5Ps+Uu@i7z&4V2)BRRAWG;;W+n6@C4uyQ7W7`SLQ&J_=Od-u&br8 z$Z+s%I+=H+K0K3?X}?lWE))@0w8vYz%T>~zVtbiBsIciyR+0{lc2BZv&RHlA;T@G1 z!_H0ZxC4}tG0F|iO4h+D5kO`#_ORb_i(~&f&M9>4U#Cty=S{Se+tRDD`a|(yCpr~^SU9CwCu))^BfA_)&CZ=`UhB?1-t-!Kt->|$ZIOC)>VdUv zX$*A4a(KCDEC*y*3khSncR2}RQm}`{^k^i18)gLul6%#R9D;W(qbk9PrdVPkClub& ztj2RaK$2NS^YDf7|S=$8N!6B_%Avc`K5TP8jL9Lx3h?5A(D z>6kf7&pglaVRL3P7>4hW;TYCJ?N|wh^x<$!WVP-3CGd>XJLs;zK}H1HCTl8XO;$-- zF`$x&8#PdwY9kBC1?8ZTT6NFayThMl(%%>M3(Sk~ZCT{oaqx>nke|TJdZH1+6tL#GXVXI#^==8^vDXYH|*o-CCo0FNq!CF9Jwa z)NF8v`75vkrWHQp9&Khz#;H%TcQ?6~YzCXDaY_HIsCr#gEsN6AL{pS%wWudp)U~>(Jt!(c7o||tLC;_ZsJ#gaeu+c6~J z;l^tru-8?DgYV}p#!GwqmhoJ`B3{Y8plYAhL3}a9D+Ft*@WjBRPCVzl*8Bx5)mFkI zvCG946DpNDHEWf7E z?w3|c3PPLk1r=dCtP!7ED}6NvRrS!NvoHA1u>e(FS|KS`{tPGgC}_3ZsVw*P6@)rx zsuW=s(W-L_0F_1+0PC9b7ZO6#YG6?@zKay>nsYnf1XiEqwR{kpnAlYz`tY89u6aM> zMZ*NXwR-#;6%?2XnpNb`P>auLlTfq^T(dw8JQGwK7n4J&PuxuHiGwzABi&?TXK>JO zI)Sh-^a5>Q#RAkVel~m#`+U@@FW==?siildJY-5`X^goPmVP5t^B%7t%_Z}=y!(hb2q2Gvy82fYbpO5h4onwGVJtOTxy|#zOC90*Af`h zs>I6PzS9!3HPE zRAG%k1fF%!WwGXfD-IPKkxX4`0B&Gc#)67#=?LuWxHQep;F3et$Ktp}>mV94+InzR z-thDUX^f#BZxCmAm`0Yh^)*!)&ok&?TTg?HODv1XJE{EbZ@MP%?`Cu<|Lps{ChZ3E z`-I~gewTqid&J-x_c@l|y<8^A1mu9;S{=5ABHkbN17C06uXd$mCcC-PWvsqT%1$ zO8*Yr-}puB?OxEBdUXlNJ=En5>5^nuN*3_VgI{1nA z{c-kqw9x+hTIrwr?C}o6AB~R#$H&4S{l1}D|3tq(u9f#w?Dn+)|DSAp55pJT|5I%E zTFBqftpB6)2krg|mmdxPmS*px^ABqUzxFnxx9IXuv-7tA|7`nx7`_<%vBy9BJ{rEu z?e@njzXYcQE$GqEr#1^9IrPAj?&Yp!Vt z>Nw^Sv15k6L6&#RXVVJ>~>^A;-X=`-94d-C{a&0&cW?$4C+qs$ijR=pX&m zrvsh+aFH$;%0Re9-oUElhLO;IO$xLzFBE#+apA6F$J|_WBST%MIXauoVZW(ecL~Ja zHSC|++bcK{R#NQ%GkMnM{-DFyZ$1m_qK-pBu~fO|IG8!1@4iy_TqIy>VQlQ5TI9g}D+Jg=6_JG>-0$S8GBV-Y%+=C1WMP~wW zLaAjJ0#Aq{8gYm*K$dK^n9)5LUs#ByKfpFBwB^%j8tr7rC991VaFtI}-<8?l+pzFg z@M~UO1ixUr)(+P&%pt#~TH-K_gn(_3pExXg2?d8o9egI}-(8C;|X&$ylg6=oF% z?KLi_!4@!|hV-eqA)CG~!7$PFr^A1^*<&L)iu(OLgM9>3j0AdJ#Gq6w2zb4E_<7l1 zaA??j1u_$RrL%y&pS>X1TLn;nz0dXFZ1HRypi-_Xa8G>MAAegkI)=X;rG8Cwj`APp zHbcSvmFEF3VfTjlrCU88RbIb?D{ttCnDSE8gsAfBN}Ita^l^Oz-}VQuS5Vyn??CnI z@low>q5Ka23*)oYSFOW#z4T8YCMpbrFf;U>Kqu4usoe{T$uaNn6w{x zn%cTNMI=4Sx=XX77_%(-<=Cv!QTubOepnjuZ_QJ z`Z@9U%-Ih79r{cde>=Kj@E7tB2w5rUm$dEJFhW*H3bC5HW0D`cE_}hPMZVzZ#l8@K zv+9w&Z>;7ZZfa1_&7jxeO@%)+dQmPP)UP@iBXun7n>tGNvO$9n?_?v5jzd)j#BgK~s3oFkm!wZ^2VUYlew1`Zz1QO<}AA4YjHK$1~j#9zlKPmO%$&@4)xmQiLy zB9j}?Z&dq+9Nj|up2p;?)%N)~gQNIswS7ZA{LS0G3gK79pWF$~4AMX+Tg?H-B;h)Xn%1w$d&i4-!_ zL1^DL+@pP`M7NJBgzRW=qm`#7s7p{OGOlG&cDXM~xucV9*8Gev>E!5=xWzGCQaa*+ zXz=wc+9{tm_X(p{EAqLQYtDJC%y)T`Gg!d*^P}YRxp(eQKDU_$RhAAZap$|s`ww*Z zq&VljSPW!c+t0JT4#oRws@mHBaOCvoe?AO3?S2CI4*Is`^go^y{I39{K$~gFl+y`4 zVvq;;Bm8Y4Ldys?+4zLD3hG<-iiwp1E=uYUat@C+_s2xmPk^{?^;qvH{*M+#X=kRs zTO<5b>R;L+Tt9uauQTJLgi&8)IvH?Yg>yg20WhJAiG?ZSTGoT`Wz0_jrZz|@dakb2u zb&zBooovnKJNU65(Nr6hdl7>IZhrkFIElbH$ZiKtM8?NBgJVVy806$|WZkZ=@j&%C z>w6tp^u(M2d)c`YqWHJ;=k*BdX~xsc$2EN=P3jq@xH14BL!7k{cbtbSGau*XI_xNb zNXcMwtx1;YI=M?9keJXn7-=f*ff#w<6kTyk#&9WEOgr3z#f$|jxhw(N%0_=EYcVCW zFEqMbEkHP1d%C^-RzZ5(+2vGOI_JEgl_|*8>XgULM7tQ^%0%6szf5i|^Ra5@W13u~ z7ohYM{Y}V)-2`&UO5#NOTweF5|BM?>ECdS|WdeG{@#?Wu8?9(Zb)j*w_#aB@c>M7Z znF}Rv7>p$0F~swfLDA2bpA`M4fLzwbG#gsoK=KDS|^~Lu8Z87jS#N>bE zG4S0M1J5%jMt|QYrawBmqu(!!>EGD)Umi2w!PxvU@2AAT+YEnV+Pf?UU!IBS z&qpwGbN06{=KZpm_DzX_=kloj(EPoS@g!iubnN$kF0CT6;UBDJc{jtWO7mdVz~Oe- z=Z|f>bfUly{Gq{56me>27ukPx=wN`)&1>m9b}!gFBj zL^M44Ah3c`lY^t5tydNESs}p%Yd&|n8FxK6L7%Cepv`dyD~KItDMR14-D|r-*QssG z>3e&g_}&&qT%kkEq&oEx6>>f+X9=!3|77=wi`Bqsh>m$C$V$W-k%`eV!3B76-8)XkwVA&!swac9%=0s%zF zJT5|+^uxmOFv$&9k>;&KgYb8R@T3EQ@WlN>IOB&H2;ZCEE8+By8|YjLZbGvOct{0) zTqQrE;mvu-*sa1t&c_dU$VK=O9&)NY9}W-60|;aTzdjh@AtRU;hlgyzH*tALa%Ef| zk{6GMJjjX;gom^R$B5=3iGTbpc*wQrU^NC%#OEPC>#}6Tz}qYcMsK^%mU+t?J7Ore56TSlmXXoC#Wm-BIDKly9nAq< zb6(|}c)q#Mg6bO{#@kFInF`bFE~a$wTgAQc1FXb?Wu3b4EyQSDvbnL%zp(#V3na4L z3|%QRIM{C773`sE?0v?GKSaHU7TL}0s5pTed{HqQ?%9L+kSdew+%}l$t2^ZW7F^e> zsd9gV+)tLbS4zq_Ng2bd{PWeUqK`)Sd_-TRIo+|t__|ms~SN)pg9sYsWHR8Vrbx`_E;iW$7Qy=z%rTDF1{OP|UI0ue?)K2f+ zeW4?;rTWffae?oci|qo#vr>xk)vItTD6J~W^)_MG86tB8YG8B!aT>N>zzRaUn=gI6 zch%k``V$ZErN0S(VpLk|y1%NVs&EkWNHNOe=r5RA9!=Yf)-?|DuKGG@RH(-(sPhc< ze&=0Ht5m+a)RM9eAB^|i~1K}TPrT<<@tCC;oTOAWZPK4{5 zYh}58RxdA{m6u|(RY_G5+)?|LjZAL5##@OKG5N2(ci08Vg_E?dNo^NJCFq^{x8DQw z@>wp7s@ofcv2rr9PnOUrkc+Tj=eY)Eb3Ci4SbA7Z#ScGXGf{`?k;$M2Y!h2MBjWu$ z0n==ELL7UPV}6jEmK-?;JFtB!q6}i=&v%IXg{eTM^$Vj=yK_!&$}W37jms6eR)bzA zu@ZA9dfWM|+>UYxICfJfHsvLkzYL{%gSsnicT*WOQtknH1wES^oP_SKk9 zSYP<8_Ffb+%E~_s%Y&~0rR zFUcIfzQ~igG|>jHS&1m75aV%ip4FzbYE~B*j_4#j)Z3KM$dw#yMrl0KYmLR>UmXXa@oZui+&uvhMlK5tOq|uL39UmSTr8SaAtHloNymm%LA6>7xR3X> zj4Cl2Utp&Wp-6NsY17!zYthM^F-`Y06?L#`8|uX)TbHEQC0IeiEGcn~ywo|+j}8CA zbFTGDS_K*j3zr)$um|_Xv;i3RoRX%Zwt>1frZ;_UH*~%&MO;X{f!n-@f}gXtb4{SW z7h+c&pV^}byYg}p%s>uwU_%OUxjGlyBd10};e;dLT(xFVyFx@eI;QLJz6p&z7QwuG zOkdo>I5UVpuI$a>O-w`86!_Z^?ZG!-1NEwb@UemwvC|t+1|^{q#wBBpYaS1H042}t z?VF*?V$%C&8++1QCCcXxa7z>C4m*PUi*v2#J@^v)_OpQt9_%&}Aps_bd(bQAh91Uy zrs$|Cos1tU?6@t!Em5fQ`ajaDE%~y`R*XS1W089~TPxtVe8Ti{W;x82i*&-w3P(kl zGn$I9AemFn8r>@Y4-$+y>4bB+Fw`EWh8Igw!*heTgTLR74fD76_6OgnK&qoG04-8Z zojE-bI9<=eW-unyt5`r|#J8yc55Z1xB@e7AEitXADJ{cYvedDn9JgrUBK&B0S5)8@ zjpK_NIgwH4eg)4a507m`o{jin9^BUARyydatE7YY1AT&CF7RWPO2&8%S-uHZ>sJ!r8GpCQU>4_weSVr57qCf^_x<>xHYBlp6I|x?i;j~t@Yo4A4#ZFLsR=YG7;`IfOz!nksbon57 zA)p|Zd{}eEoK$c&r_6_7MdpB;i+}tDa&w0l(IG+DquUwGy%22gLv;pTmit0)Q1;UP zGMS)s@CHXF6ONl(fJ3$q$#-JHz6eDD0_LJ%$|Dc9_Ml+yW%cU0GOaAaC8m81UDksh z5Wg685vvF#-Dtpqa(OXx`q5Hm#Qt!fwO*ZTXYyG`q^Z8hgE?7J7ai zrV+M6g3Aoa#Zjo4p|RlJb;|mgLK)~1OTi^g&#$O|>E5OGrU zrIe&^dm>HoT`c?=NWKnuwpK-WcFH0kBDyddqi+6-i}-lI$Tc!@)c?)QnzT{L2W6! zJXsXOGoTov2OpBe&^`Q7bL+XYY~At!=s6trt5%ovO5n$Z?|CixLf)unk&N+7N#uA+ zm|v7bCYo!_<&QUX4}XZS>VYp18>`kg!z^ADYrNDh>)TcAR!qt%RH0AQqo6~B5w?_J=o_)ei|BGtSWI3 zv)BG0j}-dZ=_I(4qoT6rwL@@0m5pSbGfADsuc*5z{~biqfZi_TotXKHH@&t2V}bX; zzsss=X!<9de=4-A>-Rz>8!R^V$vz8niJ$0PpBoyrZ!q>ylV#gVkPpK%=T-84YYou1 zx2;=aKP0dUH7AU4Eo~=`5Z4W^I-T_sry*Q5 z^<$73PINI^dRw^Dr*uk)4p;pj^m|xeU#ISE!-2Ud%KhKOneHdBp{GnBLx`q$ai&Xg zf*^Ldhj##YRk|=^Owpp^D@bq!4rK10AGJ$pfp99@_V0DrE#lk$=b%s2Uy3=1@QAlA z=^frVf6O$li5w&Cr!@o!(^tYf9mAmyrS7DXj(A~3ap)q=!s?9XzdvL{g1GJr0^Q^FMhnZ3wImDV7$0Jm}7cp zuc9)7Ss0>pdqephn(}5K1`vfC;_^Lvx<3BN-$8xy@h>J~8=^`TA(B=RLbdS>t{StE zA4$;>+bsVkuf=d@X46Gy#IO%#A~JUlG?NJ!Q61f@23>^Xb8#+1Y6hxf+dc5<$S#|X zq?{TP|BAjg=%lXrLU$5g`fJqKgzw~B&u%%}3>dqeU|@!eHf@{ab;k>5Er=!1M1V09rc%&A@ejO*>bonVmXSXS>?jU_iU(&|eh>0~@95 z)Odnng5FiI;o4W%4!AYtOALvcDAx(Nn)&EhM!S0};yHcZ4>9zBIjB#fu_7X)jksN; z3%mFbK$pBuKt(84-GyCr7k+iB?!r<`fvdB+*s$|0V6VYj-GyBUd&RGWy;+EYI<*vp zj1yMF6p7Hd`P)d5xgq~HhQ+0Lt^;K=6&5psECmYVfxSf3eiwEH-KkwRaS1?--BTvqKj!!t&}< zbeD~J9ESF?=|~Dwdq>@E75GAT8(xCiC;zfDmfD?Q*whY^hVC9q?LJr5#xS*C_}w8< zI~PRN<9~KiyNMI$r1rS_?F=;u`J^-BQMxI{N$GKm>8JX!7=!o=F_tliKlO9Ug&S}! zSJ%q*N~W}g|2q!=|GNtQca4w#UC|{N%%^^5@c&Wbe^(p-`4;#;4{!BA!mJ4V|7j;y z#6^$RNL^!)o~RBS2b-F?RibUwAle3`NS%6YhaRwlWU=Q#gHhkiV1#H#b=w@(#ZcB$ zZyyq6eL~7AMLmN*MtHn1WtB|;VU6wz!kUj`gA8Ha|2_!|0x&oMgf*c#VMU_Wm4OMx z&{a6L7^P^AEk$!`mfsFrHv@~6jZcOdFHA~Q;V=RpylE?3cnMNEW^Wu)id1|Mq}2A? zLn0-a4qbBVp^(xn)ff4s`wowk-oGV6O5-tjF{E_DXC$S5a_xg_x#}+0E=-}m-P^h7 z1HrNpf+Yi(01f=BZ*0OE0BinE{6X9L2!{JyON53KYaH8~L>+vMLkC|tMhqfx0_6P;l3&6= z?ms}Dn6sjz=%L z!84_KeedC|qrT_hdjbUx2D0fC)ODG2`eteXh6g)Z-c+?w>ZGFP60N*6GeffPeY|9NsP)#$=146Zb zHyjeGU4i~nM@@608iH{V1L&zG=Gayy3&*mA&3}R~Me}jb5In=yoOpPaq4BJbna4f? z=auTL3>(k*7Lw*?xOVGt&mf+?@}1zBTkvdrGdxR{fUwEU>RaBi|4mmHPVV2yt7By* z+qD>8^LDrvn7uZr3sH-wWLF$S?ko-J+^hm29L_31IOX(42O`(Pzoa^=vt5;$b509a z)tOa&u@lNmU`1~>$Tc?;o`B67C5DhpoU;+#iHs`{YY5qLoXyQ-&2}yex5V4iYxU*< z7$sZV!{oWr-5<3r!Ah8G3EU$wztXGR;xFK(zre6WSLsf`L@J6b(rOl-=$hk2zr{pR zh$1GCAqVfsn3gd&b9jC3*sttxi3DlCy^Q0PoH?ZVx1ax7?8iPhPOZGbLF zislhN4so;&78_Odt<589jYQfU3jl(e9*8)4`YX*N>Yd^U_KH?0d<1Yt?Yc=TSH+IJ zv?sNexid2_LuTntOcIO5E`er)NDf}Ot%eyv-C&9v7dAY?xyXz1bX--}oCRDmAOrKa zE^KdMiM>%`!!^j2i}r-_!3Ew{m9x3H3Po!)RHONvMdw6o2-d_io;R{3 z;TOj4X8M-FZku#5EYaBA3)b~8?NS2%XS)rTGH~sQfeYQO4g|Yv|D&-x!GWQE)hdF{ z!Kka=e{f2`uDT(f)U^l(r7+QC(y}nGr*2 z2ODv?goU+{!me9@vMRJSv5Z9KmPQ#nQF5z|!Wk5hUXxr24Wl;Rm!6g!?PhP*54 zQSKc+E~N<8tj%65ddb^w@X&aYq$C&LhL8Gk-(2K;W^B{MLTs&kyVE!PF)qNlO3&C! z57roMx2*{6wiKWOIpQUqEMOvgmY%?}`P{P=(# z4G9e!aEY%P94WON87ro>PJJW`L>y3Kl78M|MMv7I0pFsQ>%->gBdHqHHaK*hYn!#o zCA%%BPC~=$ zYgb~G^a`BOvtFr>xLRRo*`%sKJ=ErY-X6DDGZotZ8tj77R z9Xu2q6#N}$x9}$55lq&K3Ve_=_?v8cQDXg%Oq{M)A$?q}cwm9}fFdxD&aaZU@X8v% zG;LiffNn?2QclR91XIj4#~7YppgOD}&wsuGneaoC1b*mY7dNJGF5CbkQ_2BeOGg?u z5qxcHaocH`(2p=hE@gS%&|?++(OQze=XysD{YQRTgLOsdoq0j7cl-fKrTo~$R5qBr z2_I?xi}xYER|VS)2QDqfqh`Vq%h?GbW+HHpuEGac$CvLAa4Z8w(9K3o$fTse!Ss0W zLYu`8)i`;E8#0{g02$UCKNSu=pYMed%`wE1tu;mB93ZQjdY$mbNSItx0wHRZ5z(VT zonlJhxCjgf6DN5sW{GP1wdD3PzVMWg@kLqHr4_gWh=Yxhd<)B5AZ6Y(6`XbkiPFSJ z-pmp?J3p9E(djI3BnoV{MAA=KRKNJEH~m;wD0L2W7-CT;IK@H}q6JKM1VYgCFkjkY^kUUVy);JRIB~ znw4k{mnbUmR-T0K@UJ*@2^@!izU6wyK@UnNwj0gts-% zk)YR668uC)RJS|Jjmvqcrg`LM_!p6V9sIE0M=Q+}fPkklc>SRlMV*A#B~F)z`$itm zaGqt>!itKT4P}pM!_lT5@rTkJLbd5wJ(TB{awvPCrfbuNHavo!71_qGFr+WxD?Ox$ z`d+8Tz~MwbY@F`5-ZVT=66iSf%74X|CN{n~@{QV}Y5R~+_AX40)q_{ZLD>UYaO_~( zd07eD8N1-v00ynwCku|#{zEx;QA*U>p-Tt@PTKL7HA#;kjAu{|31eq~wLqL|!r)u< zq7|+M2T;|iBT$PR#3CYuJ@@bYmU=E_^I`PdSXy7MD1dS$sKax@ug?suB&8)5O=#B8 z#A*G3HgKwlZYXUD1JFym8t5-A*Z~&JcKzJLmKWmocE;yBxo+RE0H1|@c?;C<&Xbt} z+;(WznySuy6wl%`_bPci{K`ZG)RdC*v&XW_Y;iot z!~}ek+jdoBS4bc&=I2Wda7XWA3$C5#Kol%LlomW^p+M(T0wrQtZyBp`$=8+1jF{ zjyOv|QiE!X(U+}Fnuw?me4vqU0ls&NWae*Gpl;>H)lVnr>B%4(d7nUD z_GygR3+o3)>>ZGPa3u@OLxEvRaLxT6aLe#eSLx?OZBTx$brE(Q;p8K(NAwWNxA~|q zuvZ*yj6;LrqxbgFl)w8<%|{L88~*txymj!;BR?bmToFekVs(uo@pTwPS`>*96!V8} zjflkD;otMPrO&*9buRDlEw?m3ZmIitBM+yb_$YaJwm0x|Pkr8*wN zI1c#$j=%d!3pfs4IR!`w?&Rq$DiYgyzotZ+rM?d1ctEm2!r8paB%ji8WMYi7BjSL@kt z5&g?NV~4Fv@6yjH5bdiGdWOcah%z^Pi`O+0Ap|4JRAj4uTeOYaY#+LuD5JOPbEj|A zHruXxtNt{6)7XaY;5h}3jrxCw2PAYa(YvsCUJ%haC^VCx7l5J1Q8zx`7%enibDrjm zP_~y>v9+yDC;Wg@9S5KqZem7G_R;$kdGB|#3AznAWadY3FekEVF)?CDw5S_1p9`gW zrYLgconOKtxk<&TMx<2XS$*`%FWUR0v>1<$S=Zs=`I@@J!1MFb1FFk7 zJ;kyWIoF(FM87ya>zZ>E-^APh8N`c*U(m2qeF&wlrsT=KyUx+|D`jQ zY&eY07>XvSgv+8k!`_oxg{C=BEUt6SEo${xNTW)k74*lME=rL)bsT^SCtms#=j_lI z2`Tgx>TTlc+7ljcUP~J#LZNyjs|66%uoAf0=P=Uj1!yqN&;k-M&d`UQ=k1iM&b-%$%#)mTZ%lavdk zmTXBmPp(6m?)ca2{3|aU6=1)qWMgpt)!VlHrh*+{?S=Km7-=%Rp_jDwh6A@(8;*~; znZpFLwX-3tVs_K)m#C{n=9b#8v_MmsAL?6-*(FAPC5fjQJRGU3O(-zB8g9hSl7xXg z0{np!0R^`a*jbPimT8a^bM%Fhpa^_Z*12_T@Uk=zIj2 zhE>2g6nGq%7~jj-q5wPN(nAtp`OLfL5-MuV>=R+F(I{#hfL4L&!~z$hK^OgIkVXe1Auwemr71C{2ukyo!^7SZ1%Zc+}fB96hE^7YoQi$xQgDg3$C(D z?1T?`-~(g`%SVsupCR&5Hg)EyGZ;9Zbz!qOw8*?SWHOBnQDqZ6bVRxcpkeYi7}Gz@ zi%4^pzt+tEII~+|=6{&kVT+@l09J7VSj7oo1}A`6M&P7RCV z&Sb9z>ka09*maARri0yit)g*WYeF6cyGIRsl7I^a?z0ha4M%q>`5kg=nmb_pJC(w; zDz8^$p6pRcr=kvqC_;@mrZi+a2OX4$DbP4kYjZq|>YhPa+^lDIt!h)4v}={S@c*fA zI!WKSq`}fDX-@#e%w@1uQG@w#u{p%oqxwE)Bz8_*&Z=2j!GW-}ZV(>qUOj&_EUlnb zF7hEjQdeK3S(+XijW9Ni_)8LPN!?2=usyBF)H+V$~{(3{xPjq!_gC8G`H5`@V3tpb$tI3qP zRAyP9hR1<$zKP_0bq}LdtH){(EL}@oK+Rr6&9Vti#v{L6;#VHs243GGf0O#`O&LNz zOkepR!SJyd_Dm4w*Bo&!r)x)(Ha0QISUb>3WUA$DY- zG~rvoE8fCv!q)I)c58GK-b!>fVXI1#Cg7ytD=`FD>ci06>&h=gN=)Ubm{Q$vn60gn z0JU#*WiBv{t*gn|t@+1R3|{^aXHorHE$RbOQ+Hj|sVHiQE(#m@IHH8g5Eqa<>@5

XP5Cm{^=9$$JbX1IG`BI$Q4aJg2^l~S(4 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%0Du14k)R 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


Kl;hz~dO1d?LO;MK|jYaOXu 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
  • W~%NaGMs;OJ{G6V{e>~o7PJclpJ1i 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

    CI+-aaK#H9Nen{AW7yhcVzre2<8~q;N zPO66p30|WTr)_D;s;{N{r5XfwUfEe);)=J!pUt(S=~lCLq|4f2ofU^+z+O|s&fc}^ z`K}@Y(T8i%rhQwT)e}H~Dw>p*&z%saH4)P)J0a90RvpIMv)WBvCa|&*+JISAdzo3~ zD3q_rWqi(Z^+F-$a&G?4cc>h1jaV&)h`F00zfRFJ|K=OdNa7Ws}A- zhN=$+EEOnW!!SI>FFOX=B>>;GYICW*a6OhP0)k7PQ?>Uy1}1zcJ(D1+YNYYuROVY# zSs*M7DnQe8WjSFw2Rl5>M8Z6aFlA7C7GkbtQ1#zOJO9Rn43@t!zhoy=!K+~*uP`ogvhOUBH2B)C)J+ z9limvSk)x$@h;Lvbz6>vC+#hax4A4~Pj&cVg4++^Fty@s#P1qw%X=7dHZhrAbs*tj zJXT_1U6hc7Cumv^)%hNV07XJZbnKHU=$JD|g?8MQ+yYmSig@k-zSaW2bdm*-$TFE7!6WD@f(-&o?=OR2rO=8LE-P9)gKMic3haLIOHk z0Ig(9O4IRLuZfmWCNjcj0}g?;a_#(`sFXtpb%sD~Ma_=w;Yy(y6Geidi9j-|89;NA z#-Mo z?NI(rLxiCn$dL=Qp-I>w7;OY{Z2urMkfR0^&;3CI+qgp7Xth6}m|a{FQy|AoGzdky zT9xSUH>2Mi>O{R+Xf~S#yb2BE0L83P9~Nuo3=QOHR($|Z!)QB@!!Tx*0MV}7p?x%G z`W*stH(a+nFt;irPVYDpoz&PIks6ory9xL%yAFCu6eUE5TSZCOQwi#|mUx1y0jPNz zR6CIzFW%BtBu9l~1a>FteVm{`PZ2c+{=9I}`QOw2y z{J45zn+0YKV%?ktsIqOurjm=H1}+ z)7Lq99Z_MgGPAlJVs!vM23}tEc~LZ+ElLPk^9(_&m8<}(R|!BUb{LZ~{8R{^f>I2# zWBpRKK&6JceQ43nWxkD(Y;G_0*x$wZXwXyG|)IF*+tK`XA)GJ2IV65SX9oR zp-`zGe~+hTD|(&8O+jY_ZPR<+Wh{un@=01QzGVGbx%0D#{>n+LEzyYO*9%{nh@s+Z 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

    c{xyq<_cX%x-B$h{xv5I&G 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

    HOw(|K3)o{O;({LwFt0u4Np`imyUFe8{w$L; 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%0D!hZZPvK*4TIEZ5dmm4>-yZVY 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�am+E&M_(Nn<{8z8 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

  • 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/MABOaOqDg!WQIX8@a)wnD{Mk& zg^W;fEus1d`|lNGo}u}7N7}0``3M)vX^*l~C#!MCj%ERC#2)T-ki{@#PjIdyXM>}& z2Y!!;Op)1_E(mV=`>DKHq5OS5qZaOx%keNwG~w}Pxl4KtF}M`#%)SU-@ov#Dj)oXM z9+NdHKB@RfmA1=`@I43fR&N3^KFf$t@=U9v1}g$OIjs;@E1(Rag8b!zC?(nl^@+4v zEOsz+z=E1Hhi7+a=AdV@&uD3ZlZRxFgNO|MB|hagY>NU?QcIjk)8tw0X~s z0=&$|@g&iDa?^RjT=l?MNDQ}PM!GfQxePv1%|`MW=k3x0rU zA1N=P7l5%j(>)e4;=APVV=s;--E$M)XNf8y8xaTM_EW9*0oMC+iU6#HKMbTi8W#F9&!PP z?@wSpzC0gBcT|fcn{nyjf5;V=56}s}7Ta2+cALkE85;^LN1v;u9Nek293?dI*q*6O zJXYZvT3{S`ca7X#D9Mzn@d!sj5wj1k8#AL3- z1(VsqD;BxnvM>lPz2#MgL*{b%U#J1ofeSsz0sqWXQ@V>&x+~-hz@C^#VifdXX#>6n zR51+ECsJ# ziNC<^>~j1C&WolA0Z!oUQo`xIFbhj~36F|kA9us#09GG}P(TbL);wA!QxWccIcFa` z5#$b{*)UsO2%z4Qivx~Eng_QrGcG&9!DYQfG@=-=bexC*B=9J$v)kVsulWx`-$R3k z{^W&sgLi!@yZJ72&atu^>{_>p<7R~&I}cVtog2z)Uflmsj_3VWLpc&1G4Iul6$hHQhn_4R}_OzKJtX zYcu|U^c@^8oK{P+9}>3{B_#bFrz_G=!L{Z0gS#XRisLRRS#NRXw z!QP8bw?7)jv4tO7Pxs@~#4jNgP$W*xFCmCw7F~R<$3Nl|S(8e(L#!rYJ01o3e z_Tr(>@w>WO8&rZOVnDOepfd}tgp%Fo9Hz#;s_0-f?#y5}5{@_{-!tACQ5m?Oq+lT> z&ft1N-yR|*>bH;*1%i|)!F?L&;(mJgz7uD>pP}x%)O|gCpXJ0%{7GU9;rWYG&a%Jo z5{n|NtHYb?E=)H>WqdlLc&Ak_pF~-Ey+kw8rHAh4z!Er{;!%*Fir6^~_PA|&xi7EXUKX7x z6sUq;zH{R~Hbu?Kui~P>-BJUK3y8+QYKxh&5rztoNpCQYj`#pXjs zRs5UVT|CR9xF|dw6vkaCM$5@vg}wT6NhTVasdr;!7_2Wi5g@}{ZB8V|pk@)uvRX4I zZfA=zDJ3u=MGsB}onoiiH%0Lcmzg>fHZKO7P{Bn3{w>rQeRe1UA~nO5{dEXf7!yQc zn4h6y&Qc?gL3E6=V=rWM{tBB6v?tI@nqy3W6wcU2W0TOddTniXLjiQt z`1=w5p5SQ#Hxn)9=}=kYkp=icua=D#%mbf8zz8abww=vUGuX9@lek4Zdt^vo41K#3 z&s7K=wOqjo`E@Ah*U1Xx@yrAVA1{VZ*;k>;R-jB!6@WC4o*{S(PHtY1pzt}L%%_Kx zw-)B$U>7no2Yk}%1(zpmzurA(g*3AzQ z!=VZeikJ_&-Xdmx{g>-_A;}bJzH#vPBrsAa5&^+u2`vLvZNo#Y?Kg5LQss9l7f_Bl z4%5Gyye+!VZ+z%GehJWn!wR7HngzXbOdG2(M4UcWbN<5gQ9c6AP@C6$1-i8m`u-onx9eEc&O#_^nAIXkrl-GwQMI!Ont2Lg2*xRkAOr-8S_EaAAjv&o ztdaxSE_kmH+_A5K9)?jH+69fdklZNDKnKN-JM ztzRboy73#2pAWxKvpDMDi6MKN->ek0R2?HU|4y{c3VEU}c@q~((^iYK&T86J6s@ex zeo;}hdQ;OTJK(x;ffF`WXtXHVh8G<|{R%=`+4YSGr4__C0pV&-TqU$NakWf^NX1+o zMB#o#$Anyp2U35Dyf(`#E$tbh0%nv9?PJX1PANHu7ah-5Q9pOIC^?mewBH(RXo`9> z{1v%oT8?nZrcG*mLaJIx)1=)83JupC&Nz%sR+*LQ zEV^2OTRoxls8-Y?JW+>X7B#90AGcnjDi)6*Y5+l~f*mc`fw*%~*x}Ah*6s+6Hxs~n^=2{ zvls2oo*?>Tj0`NZwwP7w0~VrW5G}CTzA=SKGA~WbP>5ocgdt9NJ9SuABuiMqi`;B> zhSzvHt(-Iwzb~Gy8y7(ghM_C^crbafl@I<%7%w)H3Devz$WsbI*_gwi);CWY zf!$IxGSon{4(ePiBztI1AN)5bIw8m6E<|U1J*(_$EO*DHdxCQ^+=1~qjP6x{xYOYe zYaM==x(I&wnc@6!Gyt4E#FSzpzDrYzs8)G`3-Gy}#aDt|sm~45jb66TAo9eM-|WT=QTSbY z`DGi-VXNBCPZ9i)odIG;k{y$fPS%ZBl*ZRsPEgH}B5VI{-oVWOwc7&q=&ZoaDZn)- zR}q?OK@xsWy5?f!VEywN?fMWj`IcmD4up9ysWD))b>?})Kf*5lWhtH)LiU*AIQB4K zGLD9IZ}Dxq0ffx_pm>0Yg_Zd>vG9Z0OiF~G=gpc`M0{4yjoXON}1d`6Yp3C}Q#PoS8_B`I%E79Yj4QCwNe!#FVN zBk(7O8%23kgX;)>DQoA==3Q8`moqmdSXm)kJ5L9XD&biBH|Ad+oC7M*K43X-c3k;tVIzav3HcZ+ZOlh*2KH>BBaY+5KdZ#=|5Bz5=SV247%Gva_+4 zxhHYdx19(esNzkED6^L{aoZ$%r`|h2KtPz zeYCjv96%+GETF*@pmsA5Wv7MB-%Pb(GmO-U%@tuv0A5oRak0Iv&5m1Rb~2HLNMpn7 zxzGv-R_`5#_5xyj$4ApIMZq(_e*K(JkDKu_h@gMDt4D)8P|yzj!_ z33y+JMcP={kI>9#!YG>g@Z(d$RSDWId9%3Zx(tj><4LG$!zSJ6M;vJU7?v3Vf9v{b z7*EP|FyU^Ph=(gd`(KT^4h5!FLXtHli-?q24b)oqFhYgpDJ?ynLtWOq10$L=s!3z4q_U&H<9>LL{S_h8B`JusYj z0W84wM&xuj)|n!Zf7y91Z&L%L>JK)jZIpGO4KMrRAtyc zj(FqTbTxQrsJx#;`mYPqKg{;w>`!_$wtJzM%l16?hSev;t9{J_NbPOVt3Hp@o?Tzr z&>erK&WWMmJZ?V!m=PD5~Q@=~n>8XirWQ z2Fip;h6c`$BrGyXUO=u1&bM6;LUUmbff2bFL_#d&4hUyHbkhOWiPeYy)$ZoE{d+h{ zD`g3z>Cgvm9Cdlqd@gpjmP5^Jt$bqqM@zHu_H7DU(b80sCx+4#2cU3lZU(>A& zOqM?H%qgf(^B@w*g~K5rj)7_NFObx_>Dr`bBWrl_v6Xnh-|Q+bDt&MEHHe?O;5r>_ z3psbuV(;)gz;d{b!FOeY68y-=aTG4{Mkg;A&;oq$xO8lRGk{E>TUJ?5?1UTL+(unX zPI4ADI&qw|8!THj-mvPiEkAK)Ci3$H>719Z8ZRaQviLdw{e?$T@0>#v+l^& zvcJpf^{w0g>0w!co19sxH}#)A#@yX6fuUCpqH*DtV=x7JAZ%bj&NaNFZTR5?eqi#w zFKsox3=Av`i-qnVs^g0f(t}5NzDsg69g55DxVR7(;GI|VkCs($g*|}6+C0I-B*c|s zJ&MgIvnTBCpxY=iK(8P%mpKHgtuV_Wek*;$WLTKEfIgheMcN40=`wpfOcjCyBt zMpp0X;q1+00=SZU?3Ul#dpgh)YCT?6FX_$xWa!gi$_fTyexJhGjxxx!^Pm{u2^O@G zgv}^0hd6eE1}tZi8Rv-_hwUETkLA_0$W-l|0uzrSOs=~k;)%@nDY^C#?oXtNXVaoD zR*`s&gr1u$#wFHjUdjMsb(sUc0RL%GOlp0*L3*}i4tFw3?blquRCjZ{gbE#y(oW$$ z=(V7m?3OXF+T9(W>CSXeh}D58-wgVMkkW9j+6u!?umo+%Q+U%CJkwcFj>pak13KTl z|3M4Tg#@3G)u${B=KwAUSh?f(_9+uE%T;w&pW2LdYynhu`DXbb2+G6&>tW?-69*|g zC&}I7*X~&$|y?8J; zAiM@Lj#ollGO|}950^JHyTPlC!C~n7rr|$S#m_zlch-=}f(>Gtfyx$Y0Hh}OPIJKU zjE}(;K%!q<2uT&mDzUkV?Y#OlVz9IT!G}xG5dWvU{hNEU+4<%P&Ydm(&D{m=j8f$P zMRr*V#k%lyvlm{*ce)VvQ+y()r@}{~rP|Z7#g{odNn3m=7X8|@GKv$>c1W+7u7=8< z(X7E(1Y;i>8xokMxL(HUDURXGQ_`!muua)C$Q}S`{lJi?EJU@}&9P&5w79gFFc#?X zxEs;O%_*Ti*}^I1qF<#10pB?}wX1zwgc{7-k0J53>PEL&M~V$mjBX4G^?-Pe5KhJ4 zC(%R84KGTzX3-exurWVN@CeS(F9UewVY21CXd?+OV$K4WjR}9WaUR8jWZke|dcCCf zf0$mseBj?euMJ0ZieCS*=YN!5(+BU5UT^8WUwWOA(p8)mdaVGj`_Is8zeA(w_0Drh zug@xa{nK@wqSu9ky4p9P*Y}V9ZS=bF>nM8NdUk7i)nqnqpI+|`c7b01wy}MBBRv|uLHh{BG+Tkf#~TqAF$is^!i1h4Y_tg9{!02{3ADF8@im+ ze3U%=|D9fgEB_7jTGGE$^m-lw?RHik{;$$&?ZExf>){FerPrU6yNc98uX*5gZRXd1 z3%&mH;3#?>ISTZ;R?+L}(>g`3DP8WG(ChreejB}B{dp9<&N{s{y{-Z5_D8R0F6|1v zp8Mi|hhB{{9qr7nG-ToGmHR2J)~_Gj^>3ipI%lWo^)H|NkJ4-Mq5GrP>$>fiUMCFb zD!pF9`E@mTU2A&9KE-dJUgLU2k?WFEcC=8DfW>Rz@=j6fto~i?m{9AMLw*~zuKhHM zS~retO|9Jr?4MeHk38yXKWYE^rN2EFqEEHsPSpmTvta8A4by?msBTd)WkD|xTLw0c z1cR|@ms&)-^n}o7T8KW+OtUGN&ivzVB~bAiHiz};6pjA+VVFkqnHgh#q5DOpV7g%* zv`hJJsF$RBlz(0SA^noBHb$Xef_5AFv3dPSpEu0Y4KxR;B{ag)Ep7gFM+>gt+(C#3 zbMrm^Uq!o=FWRNe=97H|iF4B2kRLHrn-w+`wQUw@%kCg)_UTK~L;@phl0li~ z&75cHm$*qTHWzJFOW5y&R@hQ4^=MbMbWNg-HaD9HOp1W+%V~bY{g(=E#_Zh{z5jB; z_L2=5?y|#;cd_^KF85weLEu}yf-M+<(noo_THK2^)5kCj4%jr$3&A71kj{DcIlBZ9 zA?aTL(sE~7QOd9{ztvOG@_iR+IbjXk5EzZK2 zfd|C=GJi)I$FjC;Rr_T;Q%a*fs%6 zqx_%k_HVI>yz$2!E&eUt1>n&OT<9`4o3Hih>O6HgZCj5AW3*4eup$6fwnFmo+O{o{ z$J8A!jf*1i#1r9)MWj(0@#zMcZ2D%U*8f{WnB^icz|20^b(83R!nPS8KwGyvF+3o! zlm8E^^s#dV86g2c)z$mZj zB|D<{%O8h^_zMZ1`tB{g6@Q^il9q09hD966D5CV<7u*6qWBPdPJb$_JAO98p^34JA zm!Hf24gBS+_)hVcml253$IT+vN+*ZFw8J-K40Ja9+gVA_ zw0@!SKUOgHc+Oqj{luozyZC;r6;Q*3&a8m$iR%)`7g0j_srzr^ARoOQ0<3V5-N%GD zNN5FgBF1!oE1>6Y0?)Aj>zIGMw)%gWe_UGf@8KWbU*bDsLvz&D|3Ut-vRixnBmiwRKAIp9Sp}Fvnq?8!^!-|*CS$+|V-uH~}488xY<-@M9SfTfx zE%6}7R*S&{(0F{aH3SHu_m-nu)B9N%gZznG|fMAA9^Eko3I?J8Ji+zabsbSC}!g3RDLTKKdIxAc+nRUt-(mR<)IKiNdXqo ziWkbZ&%MTnAw3F>s9a17gs{hM+qXqOLQ&&bkPsZ# z1DU*e5r3u3Z;W)17h+zVg-eY7(kr!O$f!@T5Fndfm!t5dK1eiU}7GU;poBTkmZWCYjc+@Q@<1yaG zpp>BR=D)OEE#*E8SGva!zYc9qf{!jH9@Q~r;%2A>DN0S7**y1DJs3aQ+BnyPqG%#a z0Tp!~w;gI@51d*a2!Nl>bId+UwaEcgGiS!r z0=_=1A8b0@!>|`2JX%vk@~=1ciMG16{Y1A}^SuZT<`u)fZ)L1upEwdm!wGdsK+Lm# z-2zh0te$fOdU3E9-RbAa+&eb`HmXerdyO9uI2C@qvH_t7CxYL+WA3g@M7%k~mqxga z&E|)=Iycz+G!-hyH?-OloZQV5_l{YM8?bH%*`}ix{L~%zlmzxduobZ&JP-A~ZVnnG z9nhR{2shJ!N8xA!H#$jk7sKbrza^f^Bd>}*L`<&60<@|?E2>W_@MsHaJpLBVtBnVK zw;eA&u-TirXYOepba%glCS8<4+xK#!!(APJw4>=*`eAa^6djkKv1Z9Y%tMBX`eZ!A z_Ok(VMi35EL|eX1)|S8=q^N){KNMx)IOx?0#l6k(j&j!zHQkG+_&@u#tCYEes>df# z6#$Yj?@L*cm)4<0)uojaeSe5|&?{Z#AA;)iuDzT^?n^5J${+wPWq~M_Y0A~~jyznB{pEPD z9FurltsEjop?yvLSJNFLn@tTST*NGekyVjk1cn2Zgz<0-Fc#!&qMr2~K zeyFy1@L`l-D#Nas7~iNMM@%FNOYc9UE-SzhG4s*F9W9{oEcCxyI56D0V--oyGgp51 zp~}4k`AmhcM>sTZARjJSg~`#clIKdhr2?e2L}f<9H(G8 zop(NvI{**RV!#gT&P3kXfIDqq*;iZK3ys+yED_L*u)HVD2FpBi%FG=t#DMrHfGlUU zGIS}gF$Z7Mjq?i?xdv(q3RE4_2$d+fGaiao|v+-SsX>N(Hf-gR9eewBk@WqT+U&N41?BI*mkR+zs zzBtdUy&;U=DPi<}@0bvJKlgRVkj;;RY|XRnLH5gS0$JkjHHhQW25JXui_3wX`-2+& zLIJhM?PxX6j7J}cRwZmmxD$tlJMrC~{dXcvn!Va>`|wEHAD2kPL{i^8v+)&%du#9o z$49dpV8Ck#*t);ISQxN3G9JY58NfL!k!EnfTev5vI3m)6d5X*U%JdqSEO0DF<1;qV zdlX6RRcyAE=9kw>T>uQpdcrQw63CkL>FyZN0NV~Rt*o+?FhG8K+9FLe|9&9`ynm58 zBX68w6;_yT>ug@*?Ue0;12Wij5Q+ZGj+Vyxs_Yc2>=c$U>y%r94B_b$tUK?bZH<%E z(5By>BdubneYg?R)y!;fEuI~xXEsH2KIJL$zH+!;18 zTg)W(*g&j8J9EaJ4w&;U427Bg6_|5`tH9+t%vHYrzYkj|o^D6GB#P^FF6c3FX0IU! z(w1IASpcznWr#N5=|){j1kYBQi#CM2e71$xdFC*uz022qsJh&v!!D;pcX`0Sy42+# zFs+-Xe%Wr9_r0aM{3+UH>vE$A6ly3d%*WP;`?X-OAp1NsSF?BP&IZ-3lfMj)WP1~> zE8H)cXwO3Iv93(CsqEOLU&urY5-+$1nBVvhQc9n`hkP(t^Q!AYW2-u zblB>W=vFWLN7q_i1m0*q(iCd-n!6RfR+x|A%;R5}@6eX86JS+2QIb(NZSh%ncYmyk zECg)#I}C+wvI<^{O8wlkiuhL}o<@PmlqnAu!>zAYjTrF|{5rae-^SwzR{(3U-b7zb1g zrlQHvH6i>@y@cWMnGC~Ion7x}ibwvOJ;<&l%Vg#d^3`|9SaeitZfWF#0bz5()?Mde zpy>=uu^j1Ha@<;a(HF#16u?S;5vx*lJ7Pgy`gv98JFF2z<50&rqw@HjJLO?BkvY;jw~u!#IR~VlmyB zel9#Js-G*(IaiS^=s28(5yoOEcTL!DcG#@b;cz+(3(M6A$-I)24CnW@Cq8?6OxjrHD5zp8#n4;|b-9I!vaE?-JoY;DnXg>}1V34@x9P>kqF$ z@P0C3ey$Clfy@ylcWit<6+j`(FZfKsye~pzF9fWU6|6G^k4IW?PL9C29V<{oYj>E5 zs0-_800bS^mJUJO9pMKEc^jT!wZ(l{9BZ7$ppM4f%m-l~r#n#E34GjkgngVSy}WTH z2g=2Pf<;4}(QaFRwZ)liI)}vDM?I#i) zW2&=;9*3cV0M;~E#)^c5v08;E)L0#-RyE^$V6Y}v(j*Y6L0`qphy|mhKWk?Nsjd4e zk!^%#EeU))MHD)dlaM0}$_cJm27HP+hBaodR2BMGOMSR>>c9ryY8y77HnkFJjhcyq znqZW%P?Izb9`gF(3N?2?wsbK2s!SssgSoT#>OE$`at zW)@02K{pR1x2Burmt#!Vebv+Aa3CCr%OUgafwRs4hZ|@k9AR-JA@aC^3X%SaO3CBy zd5nmJT)j5J;UgfNKj0CCNdpz(92^%yCCGom zu{u725&IRNRwI_G7}KTQIAVx`$YrTwMP*UckE|q=5$}40BJTmOxi(-;Xg=K_5-<7S zi@(Q0@ofo29TEjGjXx+W#}46EF(4Xl^US|rDsVfPaC29rC@{FuM}>|LH0)op53ix0 zMf{iuGw8g&Zx7ag=G!}?aA_|?Qd1bk{1rh)ZSlJ-kA+KvQAy(q63E&HlY3=p*&$3G z>fahB_e>F(h;ZYsI6}cB7obxxF?MzmCVzdXYcOG^0JCZbV1ku%xmr2zlHl1yC93Mo zWv^iEyhX}vJ$?o+c7oac^N`j(UVVx5xSzs;!K%l807iZ7?j4=%@frlTiD1FW)*#wB zO3dAZapqeeL}9@9-^Rv(dX~4vfVo2&U&0;p4KKG8YH-|SR>|>sIX)xDr{wsU9ItsF z3pVq9oR^zZaE|0CI;!w{55M)tr8>6b_bq;Xj!$(QkKc0qPD%$~ z!fzFR>+oAJB-L@o38{{Yho(Aiz;6+L_u}^yet#X7>bT{^R7b{1sg5^JPIY{ok?Qyv zzkb709YgTzJ0jKb+{jeN*QcSrQK^pl(W#Cv&Pa9a$V_!SiRT>My2thY5C4l#=#iLo zP|seW9U7HS)0Tvu+gmUuSuMz&aN^?7o=iE=)MtF?GfcHJ<29af$}`V!3v}drj92L~ z4u$cc3daP*+2>x90*Nih{49@(14h4-2$qa(gb0>o)4$IBoOg1ki*C#kk#ZtzsGT|S z8cP0s-h-LOv&`VN#eDc5XfK2{(HU0CaQ#8-b0ZYhd{kdIhC-xE?=GE_VrH#0)qbDYN zv@sKtTeXN=p-5$|ExsR5V`s@zQ^}nx z+aip?wn)X*>OJq+g;?zRYhBnaokxQPj(ZCAvGrJyJ-IosY4AvstA9HmPR_s`KWR}F z*w!jru&ojmY^$PGu&oSo;B*Gt>WMxVn%Aqnp7xw@wwOIit>lm zhx?8Irc?8u<4!0N5lmKLjfJAPi2;=i(L{kwF@!bYfVarjUE)Hcm^xjvRCO24Hn?z&o3$ z^4ww`cas<;klM|4Plian0(Z?`xP>Jw48)e06hVSx<2(T*tKaN1HYz+UG`B(iFSlX% zvRv|`X%~Tlh~jIu9yp4VyR@QX@95GJz#dp6e?gsvQI1#wqa)YG<}pGOyJvNYCgwwo zH(TD0-~|?reKx!%G~vq+;l+hu(~2BG2|rX3A*wos5LV#11Ez%>^YV9OcP0 zqvVO(Dg#yYjE%{TgT6k*Wao66SM8;=eGT}hh18XmG7W|)AIUi|CW>8mO#M%>wt=Xv z@$Y!chRx5NABD{yZSD#-N600|T#b$R@^;v^x3Ehn$_RGmrEf)}Xi9A>6zvbD{a;4W z7qFw$&YXY6%r15H5O(#ZH^Za;+DpR9dZDvqWm9HESlRB?Ay)Qf4Op2Ax1fE^q_>B8{^FUNquSctM-#8_ww0tZ z96yy~gB*9%QMmp;oR^!MrKDEQ*UR|}a$JXJHkoUr{BLr6NXq}r(K_? zNO*B>NZza^E5#1WC|WRM?+0N;zlO}|!gC{E%`$$(ty5ehT2w^PKyVcv7osm+Eo>oJ zfj<>$ZY-_Dd0CJ*vWyS)(dQ;j=2*|cQ446#t> zV<+gBFtO#E-bq5kmciEn`BO>IRyc#ZUsnWL=tcNq@~uKsz73j{^w&p!0THCEprhD+U@`BXM8`7-N-k0K2P8T z2fUX+#m;7P=C#1}*d~sM!pR=Ve){!-%n?gC%V3+Gv!S$Q_8FC~NL%(3xndj?S@`T~ z+TP)_&C`X%;K&bg!FV_va1_YoiSs$I*LUP#+mPPu>++DU!`Ja;hWZy46Y zK<4JKH(0Z9)N@+1J~N%3OsGm2Z!c{C(P?_b*krtN=` z{KetY?y3Y zG;_{Hg1mBbk{mrahL-a3H^g6=n;|$OZ9A6oip~_I-`N2EEoa$vk?&U1a; zVoXi}9`7_~V0{&9&e?39530hQ+`aat`c7N7ViRa13G_-~dC;9PSaT72WJ?+;rj$q+ zS&awxr%ofOK_mQn6-?i`zn;rA=1z0Uc%fe3ZfROb1Kmx69Wq<(ZfNm$TKebgoecRh z1QeUS)7t(-TUcu&*4|3b+)Zlz{__v4{V)9ChMG@P`(IE#%l?-Jt5#%$ajE1Xk|4;GS(ues9oiJ!GMh6X0;AXR*>^7jHMeA2ZKft@+?Io#9%Fu^S!l$HWc%D}M z+=CZY<~e#?JsuV88Tz8nV|=a@ zpKChRYs}5ijmy(L$X=6Ppbg53YBv=^_~a#Q*`f`s1kcUh!Lp0k48u2wba?{C1$0TO z61qgHA&N{dpH7kKIXTX)p_ud}&dceqh1{R;b;zCUzED!8fGl4HSvp7tM#AeihRE_{ zDAtg8h-M|DER*L`kUJ>ZSBgvpuj6TNFn3ra6@+TP_~&&x9|U|ovWKaFL@Uhmobb?r z#^97I&=vIVQ6Se-x}u=qsnV zZa-uNnwx+W3Qc`<<7a*7zNQ3mwLy*`XaU|b9luW`=`t2Q_UXO}a{sHpncL+?_6oHVBrY!kK%1{i(6_=I@r6aAaF?=ZbeXj?r2d^D5VlmPM~KNi=;7oX?f z1@|2c60IgxJGjK}sFFXil5aMu&b{=U>fADHce~KLZpEjg%BQ4CYt^*ER%6VGIm3Ji zwMpVB-^pYEL#maX6bTr1QZ6J-&^^X3iy43wJUx;V^xx&UT8@8}<9#?rP1d+TW|d?h zw*RM|+Ok59=Ct+RV8XMHz2D+C?kcIzqa|8h%SW;lkQmR<0b&iHGLabxKmO3u5$L9^ zP52Hc1p%xljH;|MPY<|^CNr~*m3RT#HQP(yJ(M!%1gf zT7Bz53V;vdr1eXB#hk0B70;Y?+9?rGk~%~1M_v~N0;Ii(f;WVy$U{cL-0!VXnuQa7 z1hBsrr)6$TcO0+8R_{lT*Yv+x<24N@?T%NgZ}v*DI@SXx);E70bWn_Mq6rq7fX{@R z4ga>8SItD*;-ziBOip!7z9`jkJARe;{fOU5D4T}gO8m|QrWWG&2F~p`9>(u}+Ol`z zP`%*yJC7**PMMn88o#l#6K(_1?yYYvw0kz84yR>Iv_y~{)Cy#+-+Mgr-s%H+&mVcO zBkzqguy8BW?C!DtR~oOk}j|^TchY%4#%Z=80PqkXWrap=8&>rtbfOW2^5o`D*5CMT0B>_A@MQw^6{s{&n`Y zvLlm_I;R`lI+3u9+1e!8428-E-^Kn$ON}>kLGrA78mHiUNK@KU>u>I>Eju0)feyEk z0VnZMK47aoywxeql#uNN72ftqRUxS8dc5%L6$R#S#L0tX`wg z86HPje9@`?MCDYUjnSMM8cm$UZ3k?v00{pq3Hj0wi1MY!*q)BDB|3`ytu4)?TqzCT z8$m~H@tG`+Wfbr`%+rlW z8`|7>HSXFP{_|ft+3<6N@x!4n+7HBC?Kk|D`lyC~N=DHZ;;*qdR>RZS@F#HB*6=$( zC@@Lu7*#rM__77$-T}Lopu6R3rCt#*cI~4X|_$kjD^c z24DT?9orBis!!|TofUKSc&b_OEThR}Z&ThSpV7O7YEHv<7#EZ81BNlQNjDwKCFJ#T zyc)+%=H+s{SdJI)SWx~(eyU^X6_`7(Om&=aIb?DCa_~FLI*-TS!|>a28Enq*3*dYX zeox_dAAalc>yJ93{hp5Y)%#1kl+n<~wgQO2Qvl&B!m8R2m=XTJ}!!!gn~EWf^aH zwXD~fv)9#>F!D=WGZlP}9-QRW1C#Rf;CSH7_+)Qzyt8`zZP3MxheZ!Q5S*M*J^m(M z>$rvkT9r32K1B~qc6kDL;)K8uC>Wu8;~zAKe{ygPJjG_{MxVh=5D)@0r!zY~*fIN>0RSl_A z|N3|lr(g}H6mi_rR7PxwmtHxh1T)R-AJlfzk#~WLtfyVHQ#oR_sAypHBRU#nA$OHQ zTgu+K=zN?nYS}F<<*U&GOlow0rA8=Z?&^w6X|XAAn)&fRxfzc);c|mFPZH9_eq~2* zrka1ln*!3?(@OAp670~Y!vqV(?*_AGFe$Z)N751L0`xP(QuQzSWH**plMgbwjn)U9w=HWA-3la2!7Kj>p(!PQ2u!79?Zs?F*dl zE*qcJNDiP^{7wDq?irnxmZUAYi`5~1M+zb#$@ZE%I5FSs^$&u!nYMZ9!eaFl^W+m? z7)_$|#RmR++{PPj z7>HCg$3Z>sEV@mYv-!eP3Y^9SOp9aF8K8tufJjHcZuAw@fNAC@$-f=jH}68Uk6tTl zSyA9tF!^OAd?_$C1;2Fq!5qhUK7rG9e+|;QH_!eKbELm2QLk#mcU~<{LgY82`dj^R z53)pKet3~R_6AP&V%VO`M^$FBRE;XwU6-=}yJy|7MVAOjy0yNF1^GZ1WKN!%C21i$ z2Y0o)=itp%xXHg{2cF>VX>0fwv9!KLv|rdBFi~!xl%FQQ$uYlpl;Z_7D-|giW%*{_ zBP`ovJ?9BNomPiRIO(}q0s0Hv@`8pj5;M}$pL5}^Ipy!Ru?jWb1E)u9*Q5aF$aWFk zjB^z*+7p-rS;eXg=m!x(BFLFfJY)h)_3{beNFUEZ_;3#d1jB6kmic?!MJHa$qx^&& zH9Z7BX+r&zF`B^dqQz(jzh>aG*sD&*gouWqMcipIA4RR)!cOrS06mF?z)3NmdgOza zb*x${F<)T)!Gx+$h_^ks%kX!;=`#}f9*ilObNSZLJLtRlJG@a20~$si(t)9nWJn;9 z{c32#A3>HiVU0p*sJ{`uv7n2_t(WaU>JIR} z!zx{E#d5g?!x`Uhb8`^0i5CH+JdDdD{0%H_p$gA~J>`Rd2R@_L3eV$1=3H>Q3>31T zKi0Ax0xSRn8_M7#zLU+KLx4zL)Q-KfldaM%=6A=bZRVX=R$;GLJ7P-8v&=KCHb5JWHdqq&?vCC&#*D{% zkf$ecdcOS$p5K?Yhhw~GBM}NXc+BCPq#GXNw(OyD?v!Is9HS=yg^$tst{dn)yyy#N zZo!7_;pbV%S?VO0k<{Lp1hT*?5P_<@ZoEc$$%zkBUOEKwl9RGh&#Y0yoLcE%M5AFs z`bAX=*J0ZNv|C;X1ZgQ>gO@OXZSK<1qNTiocg3p#$nJT8lR5q^B>92c`AUpv7nm#Y0ps51(QI*)MwXQrAYE7BrhA6tH_?q_A z1Es75+85YxD~Ea*bis8|cEy4Nrlx^!gSDPGldg+G>V+1m^9cYV6Hh38oAL{Iur>q< z4!qUU2A&Eeq)PKTrSQw{uj9&E|B0gAd#XV!Pm|F)fOa5_pn}JmO<`Ps!vFv z`UDGGf5MPQVOI@xA^H~1$_@E}S-DI34h*AMivt-RN^@n6#q~mg;DFFhh0P<5X*SZ0XQ;Rx@FUBgn=a2skMAJp#^J}3~Y79gPs%S{V#p?d3h z-BG=#u--JQ-aYrIdK>U&wM3(2y&`k7y%y6h?6A^L7}jOW!`A-4RcQ$;h3^b%ti`Fo z(1O4kUU$^eKe5tVtV+jOl~%G+p>k9J=3;ARPKPy~%No;BqhgVJWF!wZ@41PH->gr= z%(hJ*y0sz+A1TP}UZiPj&rK?TB-%q;d*tY*IJfaZ*vd1JOcAn?PXL(q;kga`^(>i28s`h_&Y6 zhl$c6#V#$UOd>Nyjs=FXf5dFyey%TGhQYw{hMq8GrioNjnW@-eS2!*VtShB8$_kN@ zD-dF}IbqgVPjFlUn1I|3-Y*!T!dJ*S0$7Z6S0wP&;D8@N@n-+)B!C4h9>5j&xWyIt z47kGEVXlx6;^T`qgt$TmL9Q5;3#Y9Z6~fgLJlk!kGtVJXDq z=I&zN118pL8Y>9M_6Ru_<}f9xS#0b5*&#^{Yzvd*$LmAvyBs~Rck zW?B9_`^+NWJ3HLmHIe34wrws3gb#FTX6gACHM7*>1^djx3OeLrw?pDGuUe&MmM+Zz z3|(p-gBm!qe05i>8Nh7SG7dwBE!zjSX}&812rsU(z z>QcT>0$d%c_dukhecYj5g?iazhpO>rLV z7fgd4)>eIJT|rjn8JhnpOfuTqG4XgxTQV6JC1)lbtd;t37Fs@ehkoes|AH0MiKu&j zVd|_E)3MvbE2bdP#QZo}X5mr8)yV}RMcEzIV&3hRKw z$cF)LSlfz}pzV;PJ|g@-U!e%%+1uL?1e#gLkGz-7 zW?Hzi85cg`&a1Xs+_~3Ec!X8pNsjIL*I4}d`xSr{XeAvt!nESV1#03S^TGum!k6mF z6c*LUV_3<87RK6|RNF7|1c3JO1 z&0dc`p*iN6a(cP=*iVkV<=8`x4mtjmz}mi(<5zMt<@k{t-^X#2 zdCziwt4>N@ljBA?zQnsqpDm^X@b|dr|1tL^;87J>+X*2M)^3ytDkBjy0-_kj1&m7? z(r{Zl62&MkXdDG`B?Dn`K?5O}_Sza88JYPUCo_&Cj;QDe1P};|Nm!KN8u#cd6heQ)Ir_MQb%8D*YU#bm9Vv?|vKRnmb9 n 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

    (iX9Ee=F%5wJ$6 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%0Aw9FV4o#UI=}p(Mq)Ot>zXPhBX9Hx3K$S1y&u6 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

    diff --git a/include/GatewayConnectionManager.h b/include/GatewayConnectionManager.h index f26913dc..4205592a 100644 --- a/include/GatewayConnectionManager.h +++ b/include/GatewayConnectionManager.h @@ -10,9 +10,9 @@ namespace OpenShock::GatewayConnectionManager { bool IsConnected(); - bool IsPaired(); - AccountLinkResultCode Pair(const char* pairCode); - void UnPair(); + bool IsLinked(); + AccountLinkResultCode Link(const char* linkCode); + void UnLink(); void Update(); } // namespace OpenShock::GatewayConnectionManager diff --git a/include/serialization/WSLocal.h b/include/serialization/WSLocal.h index 384b0d42..79e76a0f 100644 --- a/include/serialization/WSLocal.h +++ b/include/serialization/WSLocal.h @@ -13,7 +13,7 @@ namespace OpenShock { namespace OpenShock::Serialization::Local { bool SerializeErrorMessage(const char* message, Common::SerializationCallbackFn callback); - bool SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool gatewayPaired, Common::SerializationCallbackFn callback); + bool SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool accountLinked, Common::SerializationCallbackFn callback); bool SerializeWiFiScanStatusChangedEvent(OpenShock::WiFiScanStatus status, Common::SerializationCallbackFn callback); bool SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, const WiFiNetwork& network, Common::SerializationCallbackFn callback); } // namespace OpenShock::Serialization::Local diff --git a/include/serialization/_fbs/DeviceToLocalMessage_generated.h b/include/serialization/_fbs/DeviceToLocalMessage_generated.h index daccbffc..e7e213f0 100644 --- a/include/serialization/_fbs/DeviceToLocalMessage_generated.h +++ b/include/serialization/_fbs/DeviceToLocalMessage_generated.h @@ -301,7 +301,7 @@ struct ReadyMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_POGGIES = 4, VT_CONNECTED_WIFI = 6, - VT_GATEWAY_PAIRED = 8, + VT_ACCOUNT_LINKED = 8, VT_CONFIG = 10 }; bool poggies() const { @@ -310,8 +310,8 @@ struct ReadyMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const OpenShock::Serialization::Types::WifiNetwork *connected_wifi() const { return GetPointer(VT_CONNECTED_WIFI); } - bool gateway_paired() const { - return GetField(VT_GATEWAY_PAIRED, 0) != 0; + bool account_linked() const { + return GetField(VT_ACCOUNT_LINKED, 0) != 0; } const OpenShock::Serialization::Configuration::Config *config() const { return GetPointer(VT_CONFIG); @@ -321,7 +321,7 @@ struct ReadyMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VerifyField(verifier, VT_POGGIES, 1) && VerifyOffset(verifier, VT_CONNECTED_WIFI) && verifier.VerifyTable(connected_wifi()) && - VerifyField(verifier, VT_GATEWAY_PAIRED, 1) && + VerifyField(verifier, VT_ACCOUNT_LINKED, 1) && VerifyOffset(verifier, VT_CONFIG) && verifier.VerifyTable(config()) && verifier.EndTable(); @@ -338,8 +338,8 @@ struct ReadyMessageBuilder { void add_connected_wifi(::flatbuffers::Offset connected_wifi) { fbb_.AddOffset(ReadyMessage::VT_CONNECTED_WIFI, connected_wifi); } - void add_gateway_paired(bool gateway_paired) { - fbb_.AddElement(ReadyMessage::VT_GATEWAY_PAIRED, static_cast(gateway_paired), 0); + void add_account_linked(bool account_linked) { + fbb_.AddElement(ReadyMessage::VT_ACCOUNT_LINKED, static_cast(account_linked), 0); } void add_config(::flatbuffers::Offset config) { fbb_.AddOffset(ReadyMessage::VT_CONFIG, config); @@ -359,12 +359,12 @@ inline ::flatbuffers::Offset CreateReadyMessage( ::flatbuffers::FlatBufferBuilder &_fbb, bool poggies = false, ::flatbuffers::Offset connected_wifi = 0, - bool gateway_paired = false, + bool account_linked = false, ::flatbuffers::Offset config = 0) { ReadyMessageBuilder builder_(_fbb); builder_.add_config(config); builder_.add_connected_wifi(connected_wifi); - builder_.add_gateway_paired(gateway_paired); + builder_.add_account_linked(account_linked); builder_.add_poggies(poggies); return builder_.Finish(); } diff --git a/schemas/DeviceToLocalMessage.fbs b/schemas/DeviceToLocalMessage.fbs index 62da3b9a..47b40217 100644 --- a/schemas/DeviceToLocalMessage.fbs +++ b/schemas/DeviceToLocalMessage.fbs @@ -10,7 +10,7 @@ namespace OpenShock.Serialization.Local; table ReadyMessage { poggies:bool; connected_wifi:Types.WifiNetwork; - gateway_paired:bool; + account_linked:bool; config:Configuration.Config; } diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 967e131e..440540e0 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -164,7 +164,7 @@ void CaptivePortalInstance::handleWebSocketClientConnected(std::uint8_t socketId connectedNetworkPtr = &connectedNetwork; } - Serialization::Local::SerializeReadyMessage(connectedNetworkPtr, GatewayConnectionManager::IsPaired(), std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); + Serialization::Local::SerializeReadyMessage(connectedNetworkPtr, GatewayConnectionManager::IsLinked(), std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); } void CaptivePortalInstance::handleWebSocketClientDisconnected(std::uint8_t socketId) { diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index e033c278..1330cdd0 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -27,9 +27,9 @@ static const char* const TAG = "GatewayConnectionManager"; static const char* const AUTH_TOKEN_FILE = "/authToken"; -constexpr std::uint8_t FLAG_NONE = 0; -constexpr std::uint8_t FLAG_HAS_IP = 1 << 0; -constexpr std::uint8_t FLAG_AUTHENTICATED = 1 << 1; +constexpr std::uint8_t FLAG_NONE = 0; +constexpr std::uint8_t FLAG_HAS_IP = 1 << 0; +constexpr std::uint8_t FLAG_LINKED = 1 << 1; static std::uint8_t s_flags = 0; static std::unique_ptr s_wsClient = nullptr; @@ -69,19 +69,19 @@ bool GatewayConnectionManager::IsConnected() { return s_wsClient->state() == GatewayClient::State::Connected; } -bool GatewayConnectionManager::IsPaired() { - return (s_flags & FLAG_AUTHENTICATED) != 0; +bool GatewayConnectionManager::IsLinked() { + return (s_flags & FLAG_LINKED) != 0; } -AccountLinkResultCode GatewayConnectionManager::Pair(const char* pairCode) { +AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { if ((s_flags & FLAG_HAS_IP) == 0) { return AccountLinkResultCode::NoInternetConnection; } s_wsClient = nullptr; - ESP_LOGD(TAG, "Attempting to pair with pair code %s", pairCode); + ESP_LOGD(TAG, "Attempting to link to account using code %s", linkCode); - auto response = HTTP::JsonAPI::LinkAccount(pairCode); + auto response = HTTP::JsonAPI::LinkAccount(linkCode); if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); @@ -109,12 +109,12 @@ AccountLinkResultCode GatewayConnectionManager::Pair(const char* pairCode) { return AccountLinkResultCode::InternalError; } - s_flags |= FLAG_AUTHENTICATED; - ESP_LOGD(TAG, "Successfully paired with pair code %u", pairCode); + s_flags |= FLAG_LINKED; + ESP_LOGD(TAG, "Successfully linked to account"); return AccountLinkResultCode::Success; } -void GatewayConnectionManager::UnPair() { +void GatewayConnectionManager::UnLink() { s_flags &= FLAG_HAS_IP; s_wsClient = nullptr; Config::ClearBackendAuthToken(); @@ -151,7 +151,7 @@ bool FetchDeviceInfo(const String& authToken) { ESP_LOGI(TAG, " [%s] rf=%u model=%u", shocker.id.c_str(), shocker.rfId, shocker.model); } - s_flags |= FLAG_AUTHENTICATED; + s_flags |= FLAG_LINKED; return true; } @@ -230,7 +230,7 @@ void GatewayConnectionManager::Update() { return; } - s_flags |= FLAG_AUTHENTICATED; + s_flags |= FLAG_LINKED; ESP_LOGD(TAG, "Successfully verified auth token"); s_wsClient = std::make_unique(authToken); diff --git a/src/event_handlers/websocket/local/AccountLinkCommand.cpp b/src/event_handlers/websocket/local/AccountLinkCommand.cpp index 90f9605d..c052beee 100644 --- a/src/event_handlers/websocket/local/AccountLinkCommand.cpp +++ b/src/event_handlers/websocket/local/AccountLinkCommand.cpp @@ -44,7 +44,7 @@ void _Private::HandleAccountLinkCommand(std::uint8_t socketId, const OpenShock:: return; } - auto result = GatewayConnectionManager::Pair(code->data()); + auto result = GatewayConnectionManager::Link(code->data()); serializeSetRfTxPinResult(socketId, result); } diff --git a/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp b/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp index a25b6778..aacba07a 100644 --- a/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp +++ b/src/event_handlers/websocket/local/AccountUnlinkCommand.cpp @@ -11,12 +11,12 @@ using namespace OpenShock::MessageHandlers::Local; void _Private::HandleAccountUnlinkCommand(std::uint8_t socketId, const OpenShock::Serialization::Local::LocalToDeviceMessage* root) { (void)socketId; - + auto msg = root->payload_as_AccountUnlinkCommand(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as AccountUnlinkCommand"); return; } - GatewayConnectionManager::UnPair(); + GatewayConnectionManager::UnLink(); } diff --git a/src/serialization/WSLocal.cpp b/src/serialization/WSLocal.cpp index 622f4263..92823319 100644 --- a/src/serialization/WSLocal.cpp +++ b/src/serialization/WSLocal.cpp @@ -61,7 +61,7 @@ bool Local::SerializeErrorMessage(const char* message, Common::SerializationCall return true; } -bool Local::SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool gatewayPaired, Common::SerializationCallbackFn callback) { +bool Local::SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool accountLinked, Common::SerializationCallbackFn callback) { flatbuffers::FlatBufferBuilder builder(256); flatbuffers::Offset fbsNetwork = 0; @@ -78,7 +78,7 @@ bool Local::SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool gate return false; } - auto readyMessageOffset = Serialization::Local::CreateReadyMessage(builder, true, fbsNetwork, gatewayPaired, configOffset); + auto readyMessageOffset = Serialization::Local::CreateReadyMessage(builder, true, fbsNetwork, accountLinked, configOffset); auto msg = Serialization::Local::CreateDeviceToLocalMessage(builder, Serialization::Local::DeviceToLocalMessagePayload::ReadyMessage, readyMessageOffset.Union()); From b5cbe0e17bfb62655835c936c0ffb92dfde56bb7 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 3 Jan 2024 23:05:50 +0100 Subject: [PATCH 085/147] Add json config export serial command --- src/serial/SerialInputHandler.cpp | 42 +++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index ceec3e70..27716545 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -298,6 +298,25 @@ void _handleValidGpiosCommand(char* arg, std::size_t argLength) { SERPR_RESPONSE("ValidGPIOs|%s", buffer.c_str()); } +void _handleJsonConfigCommand(char* arg, std::size_t argLength) { + if (arg == nullptr || argLength == 0) { + // Get raw config + std::string json = Config::GetAsJSON(true); + + SERPR_RESPONSE("JsonConfig|%s", json.c_str()); + return; + } + + if (!Config::SaveFromJSON(std::string(arg, argLength))) { + SERPR_ERROR("Failed to save config"); + return; + } + + SERPR_SUCCESS("Saved config, restarting..."); + + ESP.restart(); +} + void _handleRawConfigCommand(char* arg, std::size_t argLength) { if (arg == nullptr || argLength == 0) { std::vector buffer; @@ -431,8 +450,10 @@ networks get all saved networks networks set all saved networks keepalive get shocker keep-alive enabled keepalive set shocker keep-alive enabled -rawconfig get raw binary config -rawconfig set raw binary config +jsonconfig get configuration as JSON +jsonconfig set configuration from JSON +rawconfig get raw configuration as base64 +rawconfig set raw configuration from base64 rftransmit transmit a RF command factoryreset reset device to factory defaults and restart )"); @@ -548,6 +569,22 @@ keepalive [] )", _handleKeepAliveCommand, }; +static const SerialCmdHandler kJsonConfigCmdHandler = { + "jsonconfig", + R"(jsonconfig + Get the configuration as JSON + Example: + jsonconfig + +jsonconfig + Set the configuration from JSON, and restart + Arguments: + must be a valid JSON object + Example: + jsonconfig { ... } +)", + _handleJsonConfigCommand, +}; static const SerialCmdHandler kRawConfigCmdHandler = { "rawconfig", R"(rawconfig @@ -694,6 +731,7 @@ bool SerialInputHandler::Init() { RegisterCommandHandler(kAuthTokenCmdHandler); RegisterCommandHandler(kNetworksCmdHandler); RegisterCommandHandler(kKeepAliveCmdHandler); + RegisterCommandHandler(kJsonConfigCmdHandler); RegisterCommandHandler(kRawConfigCmdHandler); RegisterCommandHandler(kRfTransmitCmdHandler); RegisterCommandHandler(kFactoryResetCmdHandler); From 87d1dee06087c8fac451ed2a4e86871afad2a2eb Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 4 Jan 2024 17:57:31 +0100 Subject: [PATCH 086/147] Improve StringView constexpr and compare operators --- include/StringView.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/include/StringView.h b/include/StringView.h index 048af223..02848f2d 100644 --- a/include/StringView.h +++ b/include/StringView.h @@ -20,6 +20,7 @@ namespace OpenShock { static constexpr StringView Null() { return StringView(nullptr); } static constexpr StringView Empty() { return StringView(""); } + constexpr StringView() : _ptrBeg(nullptr), _ptrEnd(nullptr) { } constexpr StringView(const char* const ptr) : _ptrBeg(ptr), _ptrEnd(_getStringEnd(ptr)) { } constexpr StringView(const char* const ptr, std::size_t len) : _ptrBeg(ptr), _ptrEnd(ptr + len) { } constexpr StringView(const char* const ptrBeg, const char* const ptrEnd) : _ptrBeg(ptrBeg), _ptrEnd(ptrEnd) { } @@ -37,6 +38,9 @@ namespace OpenShock { constexpr const_iterator end() const { return _ptrEnd; } const_reverse_iterator rend() const { return std::make_reverse_iterator(begin()); } + constexpr char front() const { return *_ptrBeg; } + constexpr char back() const { return *(_ptrEnd - 1); } + constexpr std::size_t size() const { if (isNull()) return 0; @@ -46,7 +50,7 @@ namespace OpenShock { constexpr bool isNullOrEmpty() const { return size() == 0; } - StringView substr(std::size_t pos, std::size_t count = StringView::npos) const { + constexpr StringView substr(std::size_t pos, std::size_t count = StringView::npos) const { if (isNullOrEmpty()) { return *this; } @@ -64,7 +68,7 @@ namespace OpenShock { return StringView(_ptrBeg + pos, _ptrBeg + pos + count); } - std::size_t find(char needle, std::size_t pos = 0) const { + constexpr std::size_t find(char needle, std::size_t pos = 0) const { std::size_t _size = this->size(); for (std::size_t i = pos; i < _size; ++i) { @@ -305,10 +309,6 @@ namespace OpenShock { explicit operator std::string() const { return toString(); } constexpr char operator[](std::size_t index) const { - if (isNull()) { - return '\0'; - } - return _ptrBeg[index]; } @@ -321,6 +321,15 @@ namespace OpenShock { constexpr bool operator==(const char* const other) { return *this == StringView(other); } constexpr bool operator!=(const char* const other) { return !(*this == other); } + constexpr bool operator<(const StringView& other) const { + if (this == &other) return false; + + return std::lexicographical_compare(_ptrBeg, _ptrEnd, other._ptrBeg, other._ptrEnd); + } + constexpr bool operator<=(const StringView& other) const { return *this < other || *this == other; } + constexpr bool operator>(const StringView& other) const { return !(*this <= other); } + constexpr bool operator>=(const StringView& other) const { return !(*this < other); } + constexpr StringView& operator=(const char* const ptr) { _ptrBeg = ptr; _ptrEnd = _getStringEnd(ptr); From 3190844cd988b0ce8bfb9cbfad15c9b4d6c98ea7 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 4 Jan 2024 18:15:47 +0100 Subject: [PATCH 087/147] Fix bug --- include/StringView.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/StringView.h b/include/StringView.h index 02848f2d..05b17b23 100644 --- a/include/StringView.h +++ b/include/StringView.h @@ -321,14 +321,14 @@ namespace OpenShock { constexpr bool operator==(const char* const other) { return *this == StringView(other); } constexpr bool operator!=(const char* const other) { return !(*this == other); } - constexpr bool operator<(const StringView& other) const { + bool operator<(const StringView& other) const { if (this == &other) return false; return std::lexicographical_compare(_ptrBeg, _ptrEnd, other._ptrBeg, other._ptrEnd); } - constexpr bool operator<=(const StringView& other) const { return *this < other || *this == other; } - constexpr bool operator>(const StringView& other) const { return !(*this <= other); } - constexpr bool operator>=(const StringView& other) const { return !(*this < other); } + bool operator<=(const StringView& other) const { return *this < other || *this == other; } + bool operator>(const StringView& other) const { return !(*this <= other); } + bool operator>=(const StringView& other) const { return !(*this < other); } constexpr StringView& operator=(const char* const ptr) { _ptrBeg = ptr; From add8c3a785578d867adb1bf70372e7e965647f7f Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 4 Jan 2024 18:35:17 +0100 Subject: [PATCH 088/147] Fix index operator integer type --- include/StringView.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/include/StringView.h b/include/StringView.h index 05b17b23..a0be9732 100644 --- a/include/StringView.h +++ b/include/StringView.h @@ -308,7 +308,12 @@ namespace OpenShock { explicit operator std::string() const { return toString(); } - constexpr char operator[](std::size_t index) const { + /// Returns a reference to the character at the specified index, Going out of bounds is undefined behavior + constexpr char const& operator[](int index) const { + return _ptrBeg[index]; + } + /// Returns a const reference to the character at the specified index, Going out of bounds is undefined behavior + constexpr char const& operator[](std::size_t index) const { return _ptrBeg[index]; } From b65beacdb8f873c72eb5302a97251674f18a1c78 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 4 Jan 2024 18:35:36 +0100 Subject: [PATCH 089/147] Add SemVer type --- include/SemVer.h | 76 ++++++++++++ src/SemVer.cpp | 300 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 376 insertions(+) create mode 100644 include/SemVer.h create mode 100644 src/SemVer.cpp diff --git a/include/SemVer.h b/include/SemVer.h new file mode 100644 index 00000000..12632e83 --- /dev/null +++ b/include/SemVer.h @@ -0,0 +1,76 @@ +#pragma once + +#include "StringView.h" + +#include + +namespace OpenShock { + struct SemVer { + std::uint16_t major; + std::uint16_t minor; + std::uint16_t patch; + std::string prerelease; + std::string build; + + SemVer() : major(0), minor(0), patch(0), prerelease(), build() {} + SemVer(std::uint16_t major, std::uint16_t minor, std::uint16_t patch) + : major(major), minor(minor), patch(patch), prerelease(), build() + {} + SemVer(std::uint16_t major, std::uint16_t minor, std::uint16_t patch, StringView prerelease, StringView build) + : major(major), minor(minor), patch(patch), prerelease(prerelease.data(), prerelease.length()), build(build.data(), build.length()) + {} + + bool operator==(const SemVer& other) const { + return major == other.major && minor == other.minor && patch == other.patch && prerelease == other.prerelease && build == other.build; + } + bool operator!=(const SemVer& other) const { + return !(*this == other); + } + bool operator<(const SemVer& other) const { + if (major < other.major) { + return true; + } + if (major > other.major) { + return false; + } + + if (minor < other.minor) { + return true; + } + if (minor > other.minor) { + return false; + } + + if (patch < other.patch) { + return true; + } + if (patch > other.patch) { + return false; + } + + if (prerelease < other.prerelease) { + return true; + } + if (prerelease > other.prerelease) { + return false; + } + + return build < other.build; + } + bool operator<=(const SemVer& other) const { + return *this < other || *this == other; + } + bool operator>(const SemVer& other) const { + return !(*this <= other); + } + bool operator>=(const SemVer& other) const { + return !(*this < other); + } + + bool isValid() const; + + std::string toString() const; + }; + + static bool TryParseSemVer(StringView str, SemVer& out); +} // namespace OpenShock diff --git a/src/SemVer.cpp b/src/SemVer.cpp new file mode 100644 index 00000000..4bffcd95 --- /dev/null +++ b/src/SemVer.cpp @@ -0,0 +1,300 @@ +#include "SemVer.h" + +const char* const TAG = "SemVer"; + +using namespace OpenShock; + +constexpr bool _semverIsLetter(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} +constexpr bool _semverIsPositiveDigit(char c) { + return c >= '1' && c <= '9'; +} +constexpr bool _semverIsDigit(char c) { + return c == '0' || _semverIsPositiveDigit(c); +} +constexpr bool _semverIsDigits(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + for (auto c : str) { + if (!_semverIsDigit(c)) { + return false; + } + } + + return true; +} +constexpr bool _semverIsNonDigit(char c) { + return _semverIsLetter(c) || c == '-'; +} +constexpr bool _semverIsIdentifierChararacter(char c) { + return _semverIsDigit(c) || _semverIsNonDigit(c); +} +constexpr bool _semverIsIdentifierChararacters(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + for (auto c : str) { + if (!_semverIsIdentifierChararacter(c)) { + return false; + } + } + + return true; +} +constexpr bool _semverIsNumericIdentifier(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + if (str.length() == 1) { + return _semverIsDigit(str[0]); + } + + return _semverIsPositiveDigit(str[0]) && _semverIsDigits(str.substr(1)); +} +constexpr bool _semverIsAlphanumericIdentifier(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + if (str.length() == 1) { + return _semverIsNonDigit(str[0]); + } + + std::size_t nonDigitPos = StringView::npos; + for (std::size_t i = 0; i < str.length(); ++i) { + if (_semverIsNonDigit(str[i])) { + nonDigitPos = i; + break; + } + } + + if (nonDigitPos == StringView::npos) { + return false; + } + + auto after = str.substr(nonDigitPos + 1); + + if (nonDigitPos == 0) { + return _semverIsIdentifierChararacters(after); + } + + auto before = str.substr(0, nonDigitPos); + + if (nonDigitPos == str.length() - 1) { + return _semverIsIdentifierChararacters(before); + } + + return _semverIsIdentifierChararacters(before) && _semverIsIdentifierChararacters(after); +} +constexpr bool _semverIsBuildIdentifier(StringView str) { + return _semverIsAlphanumericIdentifier(str) || _semverIsDigits(str); +} +constexpr bool _semverIsPrereleaseIdentifier(StringView str) { + return _semverIsAlphanumericIdentifier(str) || _semverIsNumericIdentifier(str); +} +constexpr bool _semverIsDotSeperatedBuildIdentifiers(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + auto dotIdx = str.find('.'); + while (dotIdx != StringView::npos) { + auto part = str.substr(0, dotIdx); + if (!_semverIsBuildIdentifier(part)) { + return false; + } + + str = str.substr(dotIdx + 1); + dotIdx = str.find('.'); + } + + return _semverIsBuildIdentifier(str); +} +constexpr bool _semverIsDotSeperatedPreleaseIdentifiers(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + auto dotIdx = str.find('.'); + while (dotIdx != StringView::npos) { + auto part = str.substr(0, dotIdx); + if (!_semverIsPrereleaseIdentifier(part)) { + return false; + } + + str = str.substr(dotIdx + 1); + dotIdx = str.find('.'); + } + + return _semverIsPrereleaseIdentifier(str); +} +const auto _semverIsPatch = _semverIsNumericIdentifier; +const auto _semverIsMinor = _semverIsNumericIdentifier; +const auto _semverIsMajor = _semverIsNumericIdentifier; +const auto _semverIsPrerelease = _semverIsDotSeperatedPreleaseIdentifiers; +const auto _semverIsBuild = _semverIsDotSeperatedBuildIdentifiers; +bool _semverIsVersionCore(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + auto parts = str.split('.'); + if (parts.size() != 3) { + return false; + } + + return _semverIsMajor(parts[0]) && _semverIsMinor(parts[1]) && _semverIsPatch(parts[2]); +} +bool _semverIsSemver(StringView str) { + if (str.isNullOrEmpty()) { + return false; + } + + auto dashPos = str.find('-'); + auto plusPos = str.find('+'); + + if (dashPos == StringView::npos && plusPos == StringView::npos) { + return _semverIsVersionCore(str); + } + + if (dashPos != StringView::npos && plusPos != StringView::npos) { + if (dashPos > plusPos) { + return false; + } + + auto core = str.substr(0, dashPos); + auto prerelease = str.substr(dashPos + 1, plusPos - dashPos - 1); + auto build = str.substr(plusPos + 1); + + return _semverIsVersionCore(core) && _semverIsPrerelease(prerelease) && _semverIsBuild(build); + } + + if (dashPos != StringView::npos) { + auto core = str.substr(0, dashPos); + auto prerelease = str.substr(dashPos + 1); + + return _semverIsVersionCore(core) && _semverIsPrerelease(prerelease); + } + + if (plusPos != StringView::npos) { + auto core = str.substr(0, plusPos); + auto build = str.substr(plusPos + 1); + + return _semverIsVersionCore(core) && _semverIsBuild(build); + } + + return false; +} + +bool _tryParseU16(OpenShock::StringView str, std::uint16_t& out) { + if (str.isNullOrEmpty()) { + return false; + } + + std::uint32_t u32 = 0; + for (auto c : str) { + if (c < '0' || c > '9') { + return false; + } + + u32 *= 10; + u32 += c - '0'; + + if (u32 > std::numeric_limits::max()) { + return false; + } + } + + out = static_cast(u32); + + return true; +} + +bool SemVer::isValid() const { + if (!this->prerelease.empty() && !_semverIsPrereleaseIdentifier(this->prerelease)) { + return false; + } + + if (!this->build.empty() && !_semverIsBuildIdentifier(this->build)) { + return false; + } + + return true; +} + +std::string SemVer::toString() const { + std::string str; + str.reserve(32); + + str += std::to_string(major); + str += '.'; + str += std::to_string(minor); + str += '.'; + str += std::to_string(patch); + + if (!prerelease.empty()) { + str += '-'; + str.append(prerelease.data(), prerelease.length()); + } + + if (!build.empty()) { + str += '+'; + str.append(build.data(), build.length()); + } + + return str; +} + +bool OpenShock::TryParseSemVer(StringView semverStr, SemVer& semver) { + auto parts = semverStr.split('.'); + if (parts.size() != 3) { + ESP_LOGE(TAG, "Must have 3 dot-separated parts: %s", semverStr.data()); + return false; + } + + StringView majorStr = parts[0], minorStr = parts[1], patchStr = parts[2]; + + auto dashIdx = patchStr.find('-'); + if (dashIdx != StringView::npos) { + semver.prerelease = patchStr.substr(dashIdx + 1); + patchStr = patchStr.substr(0, dashIdx); + } + + auto plusIdx = semver.prerelease.find('+'); + if (plusIdx != StringView::npos) { + semver.build = semver.prerelease.substr(plusIdx + 1); + semver.prerelease = semver.prerelease.substr(0, plusIdx); + } + + if (!_tryParseU16(majorStr, semver.major)) { + ESP_LOGE(TAG, "Invalid major version: %s", majorStr.data()); + return false; + } + + if (!_tryParseU16(minorStr, semver.minor)) { + ESP_LOGE(TAG, "Invalid minor version: %s", minorStr.data()); + return false; + } + + if (!_tryParseU16(patchStr, semver.patch)) { + ESP_LOGE(TAG, "Invalid patch version: %s", patchStr.data()); + return false; + } + + if (!_semverIsPrerelease(semver.prerelease)) { + ESP_LOGE(TAG, "Invalid prerelease: %s", semver.prerelease.data()); + return false; + } + + if (!_semverIsBuild(semver.build)) { + ESP_LOGE(TAG, "Invalid build: %s", semver.build.data()); + return false; + } + + return true; +} From 46435b9c95222cfa3b47777d52ff67f4867af203 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 06:55:45 +0000 Subject: [PATCH 090/147] build(deps): Bump the npm-dependencies group in /frontend with 8 updates Bumps the npm-dependencies group in /frontend with 8 updates: | Package | From | To | | --- | --- | --- | | [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) | `1.5.3` | `1.5.4` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.10.6` | `20.10.7` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `6.17.0` | `6.18.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `6.17.0` | `6.18.0` | | [postcss](https://github.com/postcss/postcss) | `8.4.32` | `8.4.33` | | [tailwindcss](https://github.com/tailwindlabs/tailwindcss) | `3.4.0` | `3.4.1` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `5.0.10` | `5.0.11` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `1.1.1` | `1.1.3` | Updates `@floating-ui/dom` from 1.5.3 to 1.5.4 - [Release notes](https://github.com/floating-ui/floating-ui/releases) - [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md) - [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.5.4/packages/dom) Updates `@types/node` from 20.10.6 to 20.10.7 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@typescript-eslint/eslint-plugin` from 6.17.0 to 6.18.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.18.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 6.17.0 to 6.18.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.18.0/packages/parser) Updates `postcss` from 8.4.32 to 8.4.33 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.32...8.4.33) Updates `tailwindcss` from 3.4.0 to 3.4.1 - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/v3.4.1/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v3.4.0...v3.4.1) Updates `vite` from 5.0.10 to 5.0.11 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.11/packages/vite) Updates `vitest` from 1.1.1 to 1.1.3 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.1.3/packages/vitest) --- updated-dependencies: - dependency-name: "@floating-ui/dom" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: tailwindcss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 217 +++++++++++++++++++------------------ frontend/package.json | 16 +-- 2 files changed, 117 insertions(+), 116 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index dcb95af1..4b8724ba 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,7 +8,7 @@ "name": "frontend", "version": "0.0.1", "dependencies": { - "@floating-ui/dom": "1.5.3" + "@floating-ui/dom": "1.5.4" }, "devDependencies": { "@playwright/test": "1.40.1", @@ -19,25 +19,25 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.6", - "@typescript-eslint/eslint-plugin": "6.17.0", - "@typescript-eslint/parser": "6.17.0", + "@types/node": "20.10.7", + "@typescript-eslint/eslint-plugin": "6.18.0", + "@typescript-eslint/parser": "6.18.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", - "postcss": "8.4.32", + "postcss": "8.4.33", "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.4.0", + "tailwindcss": "3.4.1", "tslib": "2.6.2", "typescript": "5.3.3", - "vite": "^5.0.10", + "vite": "^5.0.11", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.1" + "vitest": "1.1.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -483,26 +483,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.5.3", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", @@ -974,9 +974,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", - "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "version": "20.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.7.tgz", + "integrity": "sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -995,16 +995,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", - "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", + "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/type-utils": "6.17.0", - "@typescript-eslint/utils": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1030,15 +1030,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", - "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", + "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4" }, "engines": { @@ -1058,13 +1058,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", - "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", + "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0" + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1075,13 +1075,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", - "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", + "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/utils": "6.17.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/utils": "6.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1102,9 +1102,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", - "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", + "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1115,13 +1115,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", - "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", + "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1167,17 +1167,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", - "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", + "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", "semver": "^7.5.4" }, "engines": { @@ -1192,12 +1192,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", - "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", + "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/types": "6.18.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1215,13 +1215,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.1.tgz", - "integrity": "sha512-Qpw01C2Hyb3085jBkOJLQ7HRX0Ncnh2qV4p+xWmmhcIUlMykUF69zsnZ1vPmAjZpomw9+5tWEGOQ0GTfR8U+kA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.3.tgz", + "integrity": "sha512-MnJqsKc1Ko04lksF9XoRJza0bGGwTtqfbyrsYv5on4rcEkdo+QgUdITenBQBUltKzdxW7K3rWh+nXRULwsdaVg==", "dev": true, "dependencies": { - "@vitest/spy": "1.1.1", - "@vitest/utils": "1.1.1", + "@vitest/spy": "1.1.3", + "@vitest/utils": "1.1.3", "chai": "^4.3.10" }, "funding": { @@ -1229,12 +1229,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.1.tgz", - "integrity": "sha512-8HokyJo1SnSi3uPFKfWm/Oq1qDwLC4QDcVsqpXIXwsRPAg3gIDh8EbZ1ri8cmQkBxdOu62aOF9B4xcqJhvt4xQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.3.tgz", + "integrity": "sha512-Va2XbWMnhSdDEh/OFxyUltgQuuDRxnarK1hW5QNN4URpQrqq6jtt8cfww/pQQ4i0LjoYxh/3bYWvDFlR9tU73g==", "dev": true, "dependencies": { - "@vitest/utils": "1.1.1", + "@vitest/utils": "1.1.3", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1270,9 +1270,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.1.tgz", - "integrity": "sha512-WnMHjv4VdHLbFGgCdVVvyRkRPnOKN75JJg+LLTdr6ah7YnL75W+7CTIMdzPEPzaDxA8r5yvSVlc1d8lH3yE28w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.3.tgz", + "integrity": "sha512-U0r8pRXsLAdxSVAyGNcqOU2H3Z4Y2dAAGGelL50O0QRMdi1WWeYHdrH/QWpN1e8juWfVKsb8B+pyJwTC+4Gy9w==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1284,9 +1284,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.1.tgz", - "integrity": "sha512-hDU2KkOTfFp4WFFPWwHFauddwcKuGQ7gF6Un/ZZkCogoAiTMN7/7YKvUDbywPZZ754iCQGjdUmXN3t4k0jm1IQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.3.tgz", + "integrity": "sha512-Ec0qWyGS5LhATFQtldvChPTAHv08yHIOZfiNcjwRQbFPHpkih0md9KAbs7TfeIfL7OFKoe7B/6ukBTqByubXkQ==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1296,12 +1296,13 @@ } }, "node_modules/@vitest/utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.1.tgz", - "integrity": "sha512-E9LedH093vST/JuBSyHLFMpxJKW3dLhe/flUSPFedoyj4wKiFX7Jm8gYLtOIiin59dgrssfmFv0BJ1u8P/LC/A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.3.tgz", + "integrity": "sha512-Dyt3UMcdElTll2H75vhxfpZu03uFpXRCHxWnzcrFjZxT1kTbq8ALUYIeBgGolo1gldVdI0YSlQRacsqxTwNqwg==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", "loupe": "^2.3.7", "pretty-format": "^29.7.0" }, @@ -1609,9 +1610,9 @@ ] }, "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.0.tgz", + "integrity": "sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", @@ -3318,9 +3319,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -4227,9 +4228,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -4539,9 +4540,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", - "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", + "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -4594,9 +4595,9 @@ } }, "node_modules/vite-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.1.tgz", - "integrity": "sha512-2bGE5w4jvym5v8llF6Gu1oBrmImoNSs4WmRVcavnG2me6+8UQntTqLiAMFyiAobp+ZXhj5ZFhI7SmLiFr/jrow==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.3.tgz", + "integrity": "sha512-BLSO72YAkIUuNrOx+8uznYICJfTEbvBAmWClY3hpath5+h1mbPS5OMn42lrTxXuyCazVyZoDkSRnju78GiVCqA==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -4657,17 +4658,17 @@ } }, "node_modules/vitest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.1.tgz", - "integrity": "sha512-Ry2qs4UOu/KjpXVfOCfQkTnwSXYGrqTbBZxw6reIYEFjSy1QUARRg5pxiI5BEXy+kBVntxUYNMlq4Co+2vD3fQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.3.tgz", + "integrity": "sha512-2l8om1NOkiA90/Y207PsEvJLYygddsOyr81wLQ20Ra8IlLKbyQncWsGZjnbkyG2KwwuTXLQjEPOJuxGMG8qJBQ==", "dev": true, "dependencies": { - "@vitest/expect": "1.1.1", - "@vitest/runner": "1.1.1", - "@vitest/snapshot": "1.1.1", - "@vitest/spy": "1.1.1", - "@vitest/utils": "1.1.1", - "acorn-walk": "^8.3.0", + "@vitest/expect": "1.1.3", + "@vitest/runner": "1.1.3", + "@vitest/snapshot": "1.1.3", + "@vitest/spy": "1.1.3", + "@vitest/utils": "1.1.3", + "acorn-walk": "^8.3.1", "cac": "^6.7.14", "chai": "^4.3.10", "debug": "^4.3.4", @@ -4681,7 +4682,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.1", "vite": "^5.0.0", - "vite-node": "1.1.1", + "vite-node": "1.1.3", "why-is-node-running": "^2.2.2" }, "bin": { diff --git a/frontend/package.json b/frontend/package.json index c3fca349..2b072949 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,28 +23,28 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.6", - "@typescript-eslint/eslint-plugin": "6.17.0", - "@typescript-eslint/parser": "6.17.0", + "@types/node": "20.10.7", + "@typescript-eslint/eslint-plugin": "6.18.0", + "@typescript-eslint/parser": "6.18.0", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", - "postcss": "8.4.32", + "postcss": "8.4.33", "prettier": "3.1.1", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", "svelte-check": "3.6.2", - "tailwindcss": "3.4.0", + "tailwindcss": "3.4.1", "tslib": "2.6.2", "typescript": "5.3.3", - "vite": "^5.0.10", + "vite": "^5.0.11", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.1" + "vitest": "1.1.3" }, "type": "module", "dependencies": { - "@floating-ui/dom": "1.5.3" + "@floating-ui/dom": "1.5.4" } } From 983dc642abb4f8319835cbb8a251925992a7755c Mon Sep 17 00:00:00 2001 From: hhvrc Date: Tue, 9 Jan 2024 04:53:32 +0100 Subject: [PATCH 091/147] SHAKE THE TREE --- frontend/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 2b072949..f6f23dc3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,13 +19,13 @@ "@skeletonlabs/skeleton": "2.7.0", "@skeletonlabs/tw-plugin": "0.3.1", "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/kit": "2.0.6", + "@sveltejs/kit": "2.1.0", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.7", - "@typescript-eslint/eslint-plugin": "6.18.0", - "@typescript-eslint/parser": "6.18.0", + "@typescript-eslint/eslint-plugin": "6.18.1", + "@typescript-eslint/parser": "6.18.1", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", From d1095c6f9cc111359224371736257b0f3c92d1be Mon Sep 17 00:00:00 2001 From: hhvrc Date: Tue, 9 Jan 2024 04:57:56 +0100 Subject: [PATCH 092/147] Update package-lock.json --- frontend/package-lock.json | 107 ++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4b8724ba..c14331fa 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,13 +15,13 @@ "@skeletonlabs/skeleton": "2.7.0", "@skeletonlabs/tw-plugin": "0.3.1", "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/kit": "2.0.6", + "@sveltejs/kit": "2.1.0", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", "@types/node": "20.10.7", - "@typescript-eslint/eslint-plugin": "6.18.0", - "@typescript-eslint/parser": "6.18.0", + "@typescript-eslint/eslint-plugin": "6.18.1", + "@typescript-eslint/parser": "6.18.1", "autoprefixer": "10.4.16", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -859,9 +859,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.6.tgz", - "integrity": "sha512-dnHtyjBLGXx+hrZQ9GuqLlSfTBixewJaByUVWai7LmB4dgV3FwkK155OltEgONDQW6KW64hLNS/uojdx3uC2/g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.1.0.tgz", + "integrity": "sha512-XSIjk9uY705VRpLapfScvOI3bKTfPXntLCdWVsQHhLvkTD7TPNHWh45/6nTT1vQ8rJwWzzA5sLide2YLT4FMsg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -869,6 +869,7 @@ "cookie": "^0.6.0", "devalue": "^4.3.2", "esm-env": "^1.0.0", + "import-meta-resolve": "^4.0.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", @@ -995,16 +996,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", - "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", + "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/type-utils": "6.18.0", - "@typescript-eslint/utils": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/type-utils": "6.18.1", + "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1030,15 +1031,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", - "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz", + "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/typescript-estree": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4" }, "engines": { @@ -1058,13 +1059,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", - "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", + "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0" + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1075,13 +1076,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", - "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", + "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.18.0", - "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/utils": "6.18.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1102,9 +1103,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", - "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", + "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1115,13 +1116,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", - "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/visitor-keys": "6.18.0", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1167,17 +1168,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", - "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", + "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.0", - "@typescript-eslint/types": "6.18.0", - "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", "semver": "^7.5.4" }, "engines": { @@ -1192,12 +1193,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", - "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", + "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/types": "6.18.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2553,6 +2554,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", From a549796c293520da4b1305f326a1e047c25c3c42 Mon Sep 17 00:00:00 2001 From: Red Mushie <82113471+redmushie@users.noreply.github.com> Date: Tue, 9 Jan 2024 07:00:25 +0100 Subject: [PATCH 093/147] Support OTA updating (#92) * build: Optimize 4MiB partition tables for OTA updating * ci: Add cdn init action * ci: Fix accidental break of ci * ci: stuff * ci: Fix rclone config * ci: yes * ci: Add CDN upload * ci: Fix dependency chain * build: Fix per board image merge scripts still expecting old fs image name * ci: Add separate version bump step * ci: Fix cdn-bump-version * ci: Fix typo: cnd => cdn * ci: Fix rclone copy command * ci: Fix stable/beta inversion * ci: Add develop OTA push channel * feature: Add OTA flatbuffer messages * Set the world on fire * yeet * i forgor * cpp compiler error messages are mid * Pushing local changes -- no quality guarantees * Add missing fbs generated file * Fix compilation issues * Better startup sequence * More main behavior cleanup * Redo config and other stuff * Fix build * Fix CI build error * Remove JsonRoot helper * Misc cleanup * Fix compilation errors * Regenerate flatbuffers * Start restructure for OTA implementation * Squashed commit of the following: commit a830784bfe1c1aa92365bb106046df2322092ab4 Author: HentaiHeavenVR Date: Thu Dec 14 19:40:14 2023 +0100 Fix release artifiacts upload commit fa111e439b2da451b06edd4a6272687bd6f67200 Author: HentaiHeavenVR Date: Thu Dec 14 19:27:00 2023 +0100 Fix merge script for ESP32-S3 commit a57ed7d0b22ae16b4250d474da0a61fa5bd361e0 Author: HentaiHeavenVR Date: Thu Dec 14 19:22:26 2023 +0100 fix merged name commit 5a15fe731ba3e8426769dbcaf8de48fce073e52c Author: HentaiHeavenVR Date: Thu Dec 14 19:13:13 2023 +0100 Push testing changes * Make Wemos-D1-Mini-ESP32 default intellisense board * Firmware Board definition should always remain fixed * Shorten CDN url * Add OTA stuff to flatbuffers * Add missing comments * Add OtaUpdateConfig to C++ config * Temp fix stuff * initialization and event handling * Implement metadata fetching * Update and minimize config * Update flatc.exe * Update ConfigMapper.ts * Fix generate_schemas.py * Implement http streaming * Fix chunked http streaming * Fix appending to http buffer * Parse additional chunks in same read * Clean up logging, and uint32 for timeout arg * Implement string view and get more ota stuff done * Implement OTA and new hashes index files * fix typo * Fix hash checks * Simplify, merge and abstract logic * Shut down captive when doing filesystem update * Add version checking, more options, and more * Dont rename to staticfs on build * logging rework * yes * change otainstallfailed message * Uncomment dns server code * formatting n stuff * Update generated code * Implement ota command handling and more ota logic * Fix compilation issues * Check for empty semver parts eh? * Relocate check * Things and stuff * Change schema names and namespaces * Status reporting * Switch to enum for task tracking * Add Firmware boot type detection and reporting * Send BootStatus on Gateway connect * Only send bootstatus once * Implement boot type marking * Remove spammy logs * Move methods into isolated source files * Add missing include * Add updateId stuffz --------- Co-authored-by: hhvrc --- .env | 3 +- chips/ESP32-S2/4MB/merge-image.py | 2 +- frontend/src/lib/MessageHandlers/index.ts | 6 +- .../src/lib/_fbs/open-shock/serialization.ts | 10 - .../open-shock/serialization/configuration.ts | 24 +- .../configuration/backend-config.ts | 136 ++-- .../configuration/captive-portal-config.ts | 104 +-- .../serialization/configuration/config.ts | 215 +++--- .../configuration/ota-update-channel.ts | 9 + .../configuration/ota-update-config.ts | 174 +++++ .../serialization/configuration/rfconfig.ts | 128 ++-- .../configuration/serial-input-config.ts | 102 +-- .../configuration/wi-fi-config.ts | 202 +++--- .../configuration/wi-fi-credentials.ts | 162 ++--- .../device-to-server-message-payload.ts | 34 - .../serialization/device-to-server-message.ts | 69 -- .../_fbs/open-shock/serialization/gateway.ts | 10 + .../serialization/gateway/boot-status.ts | 65 ++ .../{ => gateway}/captive-portal-config.ts | 60 +- .../device-to-gateway-message-payload.ts | 50 ++ .../gateway/device-to-gateway-message.ts | 69 ++ .../gateway-to-device-message-payload.ts | 42 ++ .../gateway/gateway-to-device-message.ts | 69 ++ .../serialization/{ => gateway}/keep-alive.ts | 60 +- .../gateway/ota-install-failed.ts | 70 ++ .../gateway/ota-install-progress-task.ts | 13 + .../gateway/ota-install-progress.ts | 71 ++ .../gateway/ota-install-started.ts | 55 ++ .../serialization/gateway/ota-install.ts | 51 ++ .../{ => gateway}/shocker-command-list.ts | 122 ++-- .../{ => gateway}/shocker-command.ts | 110 +-- .../_fbs/open-shock/serialization/local.ts | 37 +- .../local/account-link-command-result.ts | 66 +- .../local/account-link-command.ts | 100 +-- .../local/account-link-result-code.ts | 24 +- .../local/account-unlink-command.ts | 60 +- .../local/device-to-local-message-payload.ts | 124 ++-- .../local/device-to-local-message.ts | 138 ++-- .../serialization/local/error-message.ts | 100 +-- .../local/local-to-device-message-payload.ts | 160 +++-- .../local/local-to-device-message.ts | 138 ++-- .../ota-update-check-for-updates-command.ts | 50 ++ ...ta-update-handle-update-request-command.ts | 30 + ...te-set-allow-backend-management-command.ts | 30 + .../ota-update-set-check-interval-command.ts | 30 + .../local/ota-update-set-domain-command.ts | 50 ++ .../ota-update-set-is-enabled-command.ts | 30 + ...ate-set-require-manual-approval-command.ts | 30 + .../ota-update-set-update-channel-command.ts | 50 ++ .../local/ota-update-start-update-command.ts | 62 ++ .../serialization/local/ready-message.ts | 148 ++-- .../local/set-rf-pin-result-code.ts | 18 +- .../local/set-rf-tx-pin-command-result.ts | 76 +- .../local/set-rf-tx-pin-command.ts | 60 +- .../serialization/local/wifi-got-ip-event.ts | 100 +-- .../serialization/local/wifi-lost-ip-event.ts | 100 +-- .../local/wifi-network-connect-command.ts | 100 +-- .../local/wifi-network-disconnect-command.ts | 60 +- .../serialization/local/wifi-network-event.ts | 112 +-- .../local/wifi-network-forget-command.ts | 100 +-- .../local/wifi-network-save-command.ts | 144 ++-- .../serialization/local/wifi-scan-command.ts | 60 +- .../local/wifi-scan-status-message.ts | 66 +- .../server-to-device-message-payload.ts | 38 - .../serialization/server-to-device-message.ts | 69 -- .../_fbs/open-shock/serialization/types.ts | 10 +- .../serialization/types/firmware-boot-type.ts | 9 + .../open-shock/serialization/types/sem-ver.ts | 92 +++ .../types/shocker-command-type.ts | 20 +- .../serialization/types/shocker-model-type.ts | 16 +- .../serialization/types/wifi-auth-mode.ts | 32 +- .../types/wifi-network-event-type.ts | 26 +- .../serialization/types/wifi-network.ts | 210 +++--- .../serialization/types/wifi-scan-status.ts | 24 +- frontend/src/lib/mappers/ConfigMapper.ts | 180 +++++ frontend/src/lib/stores/DeviceStateStore.ts | 8 +- frontend/src/lib/types/DeviceState.ts | 3 +- frontend/src/routes/+page.svelte | 4 +- include/CaptivePortal.h | 4 + include/CaptivePortalInstance.h | 2 + include/Constants.h | 8 + include/FirmwareBootType.h | 29 + include/GatewayClient.h | 8 +- include/GatewayConnectionManager.h | 4 + include/Hashing.h | 40 ++ include/Logging.h | 24 +- include/OtaUpdateChannel.h | 29 + include/OtaUpdateManager.h | 31 + include/SemVer.h | 2 +- include/config/Config.h | 7 + include/config/OtaUpdateConfig.h | 44 ++ include/config/RootConfig.h | 2 + include/config/internal/utils.h | 1 + include/event_handlers/impl/WSGateway.h | 5 +- include/serialization/WSGateway.h | 13 +- .../serialization/_fbs/ConfigFile_generated.h | 232 ++++++- .../_fbs/DeviceToGatewayMessage_generated.h | 636 +++++++++++++++++ .../_fbs/DeviceToServerMessage_generated.h | 216 ------ .../_fbs/FirmwareBootType_generated.h | 57 ++ .../_fbs/GatewayToDeviceMessage_generated.h | 432 ++++++++++++ .../_fbs/LocalToDeviceMessage_generated.h | 568 ++++++++++++++- include/serialization/_fbs/SemVer_generated.h | 137 ++++ .../_fbs/ServerToDeviceMessage_generated.h | 357 ---------- include/util/HexUtils.h | 38 +- include/util/PartitionUtils.h | 13 + include/util/StringUtils.h | 8 + schemas/ConfigFile.fbs | 44 ++ schemas/DeviceToGatewayMessage.fbs | 57 ++ schemas/DeviceToServerMessage.fbs | 17 - ...Message.fbs => GatewayToDeviceMessage.fbs} | 19 +- schemas/LocalToDeviceMessage.fbs | 40 ++ schemas/Types/FirmwareBootType.fbs | 7 + schemas/Types/SemVer.fbs | 9 + src/CaptivePortal.cpp | 25 +- src/CaptivePortalInstance.cpp | 67 +- src/GatewayClient.cpp | 53 +- src/GatewayConnectionManager.cpp | 16 + src/OtaUpdateManager.cpp | 655 ++++++++++++++++++ src/config/Config.cpp | 62 ++ src/config/OtaUpdateConfig.cpp | 115 +++ src/config/RootConfig.cpp | 14 +- src/config/internal/utils.cpp | 4 + src/event_handlers/websocket/Gateway.cpp | 9 +- .../websocket/gateway/CaptivePortalConfig.cpp | 2 +- .../websocket/gateway/OtaInstall.cpp | 42 ++ .../websocket/gateway/ShockerCommandList.cpp | 2 +- .../websocket/gateway/_InvalidMessage.cpp | 2 +- src/main.cpp | 83 ++- src/serialization/WSGateway.cpp | 91 +++ src/util/ParitionUtils.cpp | 110 +++ src/util/StringUtils.cpp | 59 ++ 131 files changed, 7228 insertions(+), 2814 deletions(-) delete mode 100644 frontend/src/lib/_fbs/open-shock/serialization.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-channel.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts delete mode 100644 frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message-payload.ts delete mode 100644 frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/boot-status.ts rename frontend/src/lib/_fbs/open-shock/serialization/{ => gateway}/captive-portal-config.ts (96%) create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message-payload.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message-payload.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message.ts rename frontend/src/lib/_fbs/open-shock/serialization/{ => gateway}/keep-alive.ts (96%) create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-failed.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress-task.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-started.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install.ts rename frontend/src/lib/_fbs/open-shock/serialization/{ => gateway}/shocker-command-list.ts (93%) rename frontend/src/lib/_fbs/open-shock/serialization/{ => gateway}/shocker-command.ts (83%) create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-check-for-updates-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-handle-update-request-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-allow-backend-management-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-check-interval-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-domain-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-is-enabled-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-require-manual-approval-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-update-channel-command.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-start-update-command.ts delete mode 100644 frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message-payload.ts delete mode 100644 frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/types/firmware-boot-type.ts create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/types/sem-ver.ts create mode 100644 frontend/src/lib/mappers/ConfigMapper.ts create mode 100644 include/FirmwareBootType.h create mode 100644 include/Hashing.h create mode 100644 include/OtaUpdateChannel.h create mode 100644 include/OtaUpdateManager.h create mode 100644 include/config/OtaUpdateConfig.h create mode 100644 include/serialization/_fbs/DeviceToGatewayMessage_generated.h delete mode 100644 include/serialization/_fbs/DeviceToServerMessage_generated.h create mode 100644 include/serialization/_fbs/FirmwareBootType_generated.h create mode 100644 include/serialization/_fbs/GatewayToDeviceMessage_generated.h create mode 100644 include/serialization/_fbs/SemVer_generated.h delete mode 100644 include/serialization/_fbs/ServerToDeviceMessage_generated.h create mode 100644 include/util/PartitionUtils.h create mode 100644 include/util/StringUtils.h create mode 100644 schemas/DeviceToGatewayMessage.fbs delete mode 100644 schemas/DeviceToServerMessage.fbs rename schemas/{ServerToDeviceMessage.fbs => GatewayToDeviceMessage.fbs} (53%) create mode 100644 schemas/Types/FirmwareBootType.fbs create mode 100644 schemas/Types/SemVer.fbs create mode 100644 src/OtaUpdateManager.cpp create mode 100644 src/config/OtaUpdateConfig.cpp create mode 100644 src/event_handlers/websocket/gateway/OtaInstall.cpp create mode 100644 src/util/ParitionUtils.cpp create mode 100644 src/util/StringUtils.cpp diff --git a/.env b/.env index 1d789eee..3afb5f60 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ OPENSHOCK_API_DOMAIN=api.shocklink.net +OPENSHOCK_FW_CDN_DOMAIN=firmware.openshock.org OPENSHOCK_FW_VERSION=0.0.0-unknown OPENSHOCK_FW_HOSTNAME=OpenShock -OPENSHOCK_FW_AP_PREFIX=OpenShock- \ No newline at end of file +OPENSHOCK_FW_AP_PREFIX=OpenShock- diff --git a/chips/ESP32-S2/4MB/merge-image.py b/chips/ESP32-S2/4MB/merge-image.py index 5b7a8680..bfe06d40 100644 --- a/chips/ESP32-S2/4MB/merge-image.py +++ b/chips/ESP32-S2/4MB/merge-image.py @@ -4,7 +4,7 @@ # fmt: off esptool.main([ - '--chip', 'esp32s2', + '--chip', 'esp32', 'merge_bin', '-o', 'merged.bin', '--flash_size', '4MB', '0x1000', './bootloader.bin', diff --git a/frontend/src/lib/MessageHandlers/index.ts b/frontend/src/lib/MessageHandlers/index.ts index 6e2ea389..b848153a 100644 --- a/frontend/src/lib/MessageHandlers/index.ts +++ b/frontend/src/lib/MessageHandlers/index.ts @@ -13,6 +13,7 @@ import { AccountLinkCommandResult } from '$lib/_fbs/open-shock/serialization/loc import { AccountLinkResultCode } from '$lib/_fbs/open-shock/serialization/local/account-link-result-code'; import { ErrorMessage } from '$lib/_fbs/open-shock/serialization/local/error-message'; import { WifiNetworkEventHandler } from './WifiNetworkEventHandler'; +import { mapConfig } from '$lib/mappers/ConfigMapper'; export type MessageHandler = (wsClient: WebSocketClient, message: DeviceToLocalMessage) => void; @@ -32,7 +33,10 @@ PayloadHandlers[DeviceToLocalMessagePayload.ReadyMessage] = (cli, msg) => { DeviceStateStore.update((store) => { store.wifiConnectedBSSID = payload.connectedWifi()?.bssid() || null; store.accountLinked = payload.accountLinked(); - store.rfTxPin = payload.config()?.rf()?.txPin() ?? 255; // 255 = invalid + store.config = mapConfig(payload.config()); + + console.log('[WS] Updated device state store: ', store); + return store; }); diff --git a/frontend/src/lib/_fbs/open-shock/serialization.ts b/frontend/src/lib/_fbs/open-shock/serialization.ts deleted file mode 100644 index 234e4cb3..00000000 --- a/frontend/src/lib/_fbs/open-shock/serialization.ts +++ /dev/null @@ -1,10 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export { CaptivePortalConfig } from './serialization/captive-portal-config'; -export { ServerToDeviceMessage } from './serialization/server-to-device-message'; -export { ServerToDeviceMessagePayload } from './serialization/server-to-device-message-payload'; -export { ShockerCommand } from './serialization/shocker-command'; -export { ShockerCommandList } from './serialization/shocker-command-list'; -export * as Types from './open-shock/serialization/types'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts index 79b60504..b1e1a096 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts @@ -1,11 +1,13 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export { BackendConfig } from './configuration/backend-config'; -export { CaptivePortalConfig } from './configuration/captive-portal-config'; -export { Config } from './configuration/config'; -export { RFConfig } from './configuration/rfconfig'; -export { SerialInputConfig } from './configuration/serial-input-config'; -export { WiFiConfig } from './configuration/wi-fi-config'; -export { WiFiCredentials } from './configuration/wi-fi-credentials'; +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export { BackendConfig } from './configuration/backend-config'; +export { CaptivePortalConfig } from './configuration/captive-portal-config'; +export { Config } from './configuration/config'; +export { OtaUpdateChannel } from './configuration/ota-update-channel'; +export { OtaUpdateConfig } from './configuration/ota-update-config'; +export { RFConfig } from './configuration/rfconfig'; +export { SerialInputConfig } from './configuration/serial-input-config'; +export { WiFiConfig } from './configuration/wi-fi-config'; +export { WiFiCredentials } from './configuration/wi-fi-credentials'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts index e905ae8b..54d691c1 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/backend-config.ts @@ -1,68 +1,68 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class BackendConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):BackendConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsBackendConfig(bb:flatbuffers.ByteBuffer, obj?:BackendConfig):BackendConfig { - return (obj || new BackendConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsBackendConfig(bb:flatbuffers.ByteBuffer, obj?:BackendConfig):BackendConfig { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new BackendConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * Domain name of the backend server, e.g. "api.shocklink.net" - */ -domain():string|null -domain(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -domain(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -/** - * Authentication token for the backend server - */ -authToken():string|null -authToken(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -authToken(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startBackendConfig(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addDomain(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, domainOffset, 0); -} - -static addAuthToken(builder:flatbuffers.Builder, authTokenOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, authTokenOffset, 0); -} - -static endBackendConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createBackendConfig(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset, authTokenOffset:flatbuffers.Offset):flatbuffers.Offset { - BackendConfig.startBackendConfig(builder); - BackendConfig.addDomain(builder, domainOffset); - BackendConfig.addAuthToken(builder, authTokenOffset); - return BackendConfig.endBackendConfig(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class BackendConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):BackendConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsBackendConfig(bb:flatbuffers.ByteBuffer, obj?:BackendConfig):BackendConfig { + return (obj || new BackendConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsBackendConfig(bb:flatbuffers.ByteBuffer, obj?:BackendConfig):BackendConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new BackendConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Domain name of the backend server, e.g. "api.shocklink.net" + */ +domain():string|null +domain(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +domain(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +/** + * Authentication token for the backend server + */ +authToken():string|null +authToken(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +authToken(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startBackendConfig(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addDomain(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, domainOffset, 0); +} + +static addAuthToken(builder:flatbuffers.Builder, authTokenOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, authTokenOffset, 0); +} + +static endBackendConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createBackendConfig(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset, authTokenOffset:flatbuffers.Offset):flatbuffers.Offset { + BackendConfig.startBackendConfig(builder); + BackendConfig.addDomain(builder, domainOffset); + BackendConfig.addAuthToken(builder, authTokenOffset); + return BackendConfig.endBackendConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts index 179cefe0..52f1c8eb 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/captive-portal-config.ts @@ -1,52 +1,52 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class CaptivePortalConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):CaptivePortalConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { - return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * Whether the captive portal is forced to be enabled - * The captive portal will otherwise shut down when a gateway connection is established - */ -alwaysEnabled():boolean { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -static startCaptivePortalConfig(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addAlwaysEnabled(builder:flatbuffers.Builder, alwaysEnabled:boolean) { - builder.addFieldInt8(0, +alwaysEnabled, +false); -} - -static endCaptivePortalConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createCaptivePortalConfig(builder:flatbuffers.Builder, alwaysEnabled:boolean):flatbuffers.Offset { - CaptivePortalConfig.startCaptivePortalConfig(builder); - CaptivePortalConfig.addAlwaysEnabled(builder, alwaysEnabled); - return CaptivePortalConfig.endCaptivePortalConfig(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class CaptivePortalConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):CaptivePortalConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { + return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsCaptivePortalConfig(bb:flatbuffers.ByteBuffer, obj?:CaptivePortalConfig):CaptivePortalConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new CaptivePortalConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Whether the captive portal is forced to be enabled + * The captive portal will otherwise shut down when a gateway connection is established + */ +alwaysEnabled():boolean { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +static startCaptivePortalConfig(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addAlwaysEnabled(builder:flatbuffers.Builder, alwaysEnabled:boolean) { + builder.addFieldInt8(0, +alwaysEnabled, +false); +} + +static endCaptivePortalConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createCaptivePortalConfig(builder:flatbuffers.Builder, alwaysEnabled:boolean):flatbuffers.Offset { + CaptivePortalConfig.startCaptivePortalConfig(builder); + CaptivePortalConfig.addAlwaysEnabled(builder, alwaysEnabled); + return CaptivePortalConfig.endCaptivePortalConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/config.ts index 71af96bb..452f7dfa 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/config.ts @@ -1,101 +1,114 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { BackendConfig } from '../../../open-shock/serialization/configuration/backend-config'; -import { CaptivePortalConfig } from '../../../open-shock/serialization/configuration/captive-portal-config'; -import { RFConfig } from '../../../open-shock/serialization/configuration/rfconfig'; -import { SerialInputConfig } from '../../../open-shock/serialization/configuration/serial-input-config'; -import { WiFiConfig } from '../../../open-shock/serialization/configuration/wi-fi-config'; - - -export class Config { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):Config { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Config { - return (obj || new Config()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Config { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new Config()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * RF Transmitter configuration - */ -rf(obj?:RFConfig):RFConfig|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? (obj || new RFConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -/** - * WiFi configuration - */ -wifi(obj?:WiFiConfig):WiFiConfig|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? (obj || new WiFiConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -/** - * Captive portal configuration - */ -captivePortal(obj?:CaptivePortalConfig):CaptivePortalConfig|null { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? (obj || new CaptivePortalConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -/** - * Backend configuration - */ -backend(obj?:BackendConfig):BackendConfig|null { - const offset = this.bb!.__offset(this.bb_pos, 10); - return offset ? (obj || new BackendConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -/** - * Serial input configuration - */ -serialInput(obj?:SerialInputConfig):SerialInputConfig|null { - const offset = this.bb!.__offset(this.bb_pos, 12); - return offset ? (obj || new SerialInputConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -static startConfig(builder:flatbuffers.Builder) { - builder.startObject(5); -} - -static addRf(builder:flatbuffers.Builder, rfOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, rfOffset, 0); -} - -static addWifi(builder:flatbuffers.Builder, wifiOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, wifiOffset, 0); -} - -static addCaptivePortal(builder:flatbuffers.Builder, captivePortalOffset:flatbuffers.Offset) { - builder.addFieldOffset(2, captivePortalOffset, 0); -} - -static addBackend(builder:flatbuffers.Builder, backendOffset:flatbuffers.Offset) { - builder.addFieldOffset(3, backendOffset, 0); -} - -static addSerialInput(builder:flatbuffers.Builder, serialInputOffset:flatbuffers.Offset) { - builder.addFieldOffset(4, serialInputOffset, 0); -} - -static endConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { BackendConfig } from '../../../open-shock/serialization/configuration/backend-config'; +import { CaptivePortalConfig } from '../../../open-shock/serialization/configuration/captive-portal-config'; +import { OtaUpdateConfig } from '../../../open-shock/serialization/configuration/ota-update-config'; +import { RFConfig } from '../../../open-shock/serialization/configuration/rfconfig'; +import { SerialInputConfig } from '../../../open-shock/serialization/configuration/serial-input-config'; +import { WiFiConfig } from '../../../open-shock/serialization/configuration/wi-fi-config'; + + +export class Config { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):Config { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Config { + return (obj || new Config()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsConfig(bb:flatbuffers.ByteBuffer, obj?:Config):Config { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new Config()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * RF Transmitter configuration + */ +rf(obj?:RFConfig):RFConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? (obj || new RFConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +/** + * WiFi configuration + */ +wifi(obj?:WiFiConfig):WiFiConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? (obj || new WiFiConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +/** + * Captive portal configuration + */ +captivePortal(obj?:CaptivePortalConfig):CaptivePortalConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? (obj || new CaptivePortalConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +/** + * Backend configuration + */ +backend(obj?:BackendConfig):BackendConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 10); + return offset ? (obj || new BackendConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +/** + * Serial input configuration + */ +serialInput(obj?:SerialInputConfig):SerialInputConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 12); + return offset ? (obj || new SerialInputConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +/** + * OTA update configuration + */ +otaUpdate(obj?:OtaUpdateConfig):OtaUpdateConfig|null { + const offset = this.bb!.__offset(this.bb_pos, 14); + return offset ? (obj || new OtaUpdateConfig()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +static startConfig(builder:flatbuffers.Builder) { + builder.startObject(6); +} + +static addRf(builder:flatbuffers.Builder, rfOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, rfOffset, 0); +} + +static addWifi(builder:flatbuffers.Builder, wifiOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, wifiOffset, 0); +} + +static addCaptivePortal(builder:flatbuffers.Builder, captivePortalOffset:flatbuffers.Offset) { + builder.addFieldOffset(2, captivePortalOffset, 0); +} + +static addBackend(builder:flatbuffers.Builder, backendOffset:flatbuffers.Offset) { + builder.addFieldOffset(3, backendOffset, 0); +} + +static addSerialInput(builder:flatbuffers.Builder, serialInputOffset:flatbuffers.Offset) { + builder.addFieldOffset(4, serialInputOffset, 0); +} + +static addOtaUpdate(builder:flatbuffers.Builder, otaUpdateOffset:flatbuffers.Offset) { + builder.addFieldOffset(5, otaUpdateOffset, 0); +} + +static endConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-channel.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-channel.ts new file mode 100644 index 00000000..535cfb3b --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-channel.ts @@ -0,0 +1,9 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum OtaUpdateChannel { + Stable = 0, + Beta = 1, + Develop = 2 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts new file mode 100644 index 00000000..998eb924 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts @@ -0,0 +1,174 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { OtaUpdateChannel } from '../../../open-shock/serialization/configuration/ota-update-channel'; +import { FirmwareBootType } from '../../../open-shock/serialization/types/firmware-boot-type'; + + +export class OtaUpdateConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaUpdateConfig(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateConfig):OtaUpdateConfig { + return (obj || new OtaUpdateConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaUpdateConfig(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateConfig):OtaUpdateConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaUpdateConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Indicates whether OTA updates are enabled. + */ +isEnabled():boolean { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +/** + * The domain name of the OTA Content Delivery Network (CDN). + */ +cdnDomain():string|null +cdnDomain(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +cdnDomain(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +/** + * The update channel to use. + */ +updateChannel():OtaUpdateChannel { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : OtaUpdateChannel.Stable; +} + +/** + * Indicates whether to check for updates on startup. + */ +checkOnStartup():boolean { + const offset = this.bb!.__offset(this.bb_pos, 10); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +/** + * Indicates whether to check for updates periodically. + */ +checkPeriodically():boolean { + const offset = this.bb!.__offset(this.bb_pos, 12); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +/** + * The interval in minutes between periodic update checks. + */ +checkInterval():number { + const offset = this.bb!.__offset(this.bb_pos, 14); + return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0; +} + +/** + * Indicates if the backend is authorized to manage the device's update version on behalf of the user. + */ +allowBackendManagement():boolean { + const offset = this.bb!.__offset(this.bb_pos, 16); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +/** + * Indicates if manual approval via serial input or captive portal is required before installing updates. + */ +requireManualApproval():boolean { + const offset = this.bb!.__offset(this.bb_pos, 18); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +/** + * Update process ID, used to track the update process server-side across reboots. + */ +updateId():number { + const offset = this.bb!.__offset(this.bb_pos, 20); + return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; +} + +/** + * Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) + */ +bootType():FirmwareBootType { + const offset = this.bb!.__offset(this.bb_pos, 22); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : FirmwareBootType.Normal; +} + +static startOtaUpdateConfig(builder:flatbuffers.Builder) { + builder.startObject(10); +} + +static addIsEnabled(builder:flatbuffers.Builder, isEnabled:boolean) { + builder.addFieldInt8(0, +isEnabled, +false); +} + +static addCdnDomain(builder:flatbuffers.Builder, cdnDomainOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, cdnDomainOffset, 0); +} + +static addUpdateChannel(builder:flatbuffers.Builder, updateChannel:OtaUpdateChannel) { + builder.addFieldInt8(2, updateChannel, OtaUpdateChannel.Stable); +} + +static addCheckOnStartup(builder:flatbuffers.Builder, checkOnStartup:boolean) { + builder.addFieldInt8(3, +checkOnStartup, +false); +} + +static addCheckPeriodically(builder:flatbuffers.Builder, checkPeriodically:boolean) { + builder.addFieldInt8(4, +checkPeriodically, +false); +} + +static addCheckInterval(builder:flatbuffers.Builder, checkInterval:number) { + builder.addFieldInt16(5, checkInterval, 0); +} + +static addAllowBackendManagement(builder:flatbuffers.Builder, allowBackendManagement:boolean) { + builder.addFieldInt8(6, +allowBackendManagement, +false); +} + +static addRequireManualApproval(builder:flatbuffers.Builder, requireManualApproval:boolean) { + builder.addFieldInt8(7, +requireManualApproval, +false); +} + +static addUpdateId(builder:flatbuffers.Builder, updateId:number) { + builder.addFieldInt32(8, updateId, 0); +} + +static addBootType(builder:flatbuffers.Builder, bootType:FirmwareBootType) { + builder.addFieldInt8(9, bootType, FirmwareBootType.Normal); +} + +static endOtaUpdateConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaUpdateConfig(builder:flatbuffers.Builder, isEnabled:boolean, cdnDomainOffset:flatbuffers.Offset, updateChannel:OtaUpdateChannel, checkOnStartup:boolean, checkPeriodically:boolean, checkInterval:number, allowBackendManagement:boolean, requireManualApproval:boolean, updateId:number, bootType:FirmwareBootType):flatbuffers.Offset { + OtaUpdateConfig.startOtaUpdateConfig(builder); + OtaUpdateConfig.addIsEnabled(builder, isEnabled); + OtaUpdateConfig.addCdnDomain(builder, cdnDomainOffset); + OtaUpdateConfig.addUpdateChannel(builder, updateChannel); + OtaUpdateConfig.addCheckOnStartup(builder, checkOnStartup); + OtaUpdateConfig.addCheckPeriodically(builder, checkPeriodically); + OtaUpdateConfig.addCheckInterval(builder, checkInterval); + OtaUpdateConfig.addAllowBackendManagement(builder, allowBackendManagement); + OtaUpdateConfig.addRequireManualApproval(builder, requireManualApproval); + OtaUpdateConfig.addUpdateId(builder, updateId); + OtaUpdateConfig.addBootType(builder, bootType); + return OtaUpdateConfig.endOtaUpdateConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts index 703b927c..b34fb2a4 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/rfconfig.ts @@ -1,64 +1,64 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class RFConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):RFConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { - return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * The GPIO pin connected to the RF modulator's data pin for transmitting (TX) - */ -txPin():number { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; -} - -/** - * Whether to transmit keepalive messages to keep the devices from entering sleep mode - */ -keepaliveEnabled():boolean { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -static startRFConfig(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addTxPin(builder:flatbuffers.Builder, txPin:number) { - builder.addFieldInt8(0, txPin, 0); -} - -static addKeepaliveEnabled(builder:flatbuffers.Builder, keepaliveEnabled:boolean) { - builder.addFieldInt8(1, +keepaliveEnabled, +false); -} - -static endRFConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createRFConfig(builder:flatbuffers.Builder, txPin:number, keepaliveEnabled:boolean):flatbuffers.Offset { - RFConfig.startRFConfig(builder); - RFConfig.addTxPin(builder, txPin); - RFConfig.addKeepaliveEnabled(builder, keepaliveEnabled); - return RFConfig.endRFConfig(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class RFConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):RFConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { + return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsRFConfig(bb:flatbuffers.ByteBuffer, obj?:RFConfig):RFConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new RFConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * The GPIO pin connected to the RF modulator's data pin for transmitting (TX) + */ +txPin():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; +} + +/** + * Whether to transmit keepalive messages to keep the devices from entering sleep mode + */ +keepaliveEnabled():boolean { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +static startRFConfig(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addTxPin(builder:flatbuffers.Builder, txPin:number) { + builder.addFieldInt8(0, txPin, 0); +} + +static addKeepaliveEnabled(builder:flatbuffers.Builder, keepaliveEnabled:boolean) { + builder.addFieldInt8(1, +keepaliveEnabled, +false); +} + +static endRFConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createRFConfig(builder:flatbuffers.Builder, txPin:number, keepaliveEnabled:boolean):flatbuffers.Offset { + RFConfig.startRFConfig(builder); + RFConfig.addTxPin(builder, txPin); + RFConfig.addKeepaliveEnabled(builder, keepaliveEnabled); + return RFConfig.endRFConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts index c7534fd3..28d823e7 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/serial-input-config.ts @@ -1,51 +1,51 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class SerialInputConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):SerialInputConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { - return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * Whether to echo typed characters back to the serial console - */ -echoEnabled():boolean { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true; -} - -static startSerialInputConfig(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addEchoEnabled(builder:flatbuffers.Builder, echoEnabled:boolean) { - builder.addFieldInt8(0, +echoEnabled, +true); -} - -static endSerialInputConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createSerialInputConfig(builder:flatbuffers.Builder, echoEnabled:boolean):flatbuffers.Offset { - SerialInputConfig.startSerialInputConfig(builder); - SerialInputConfig.addEchoEnabled(builder, echoEnabled); - return SerialInputConfig.endSerialInputConfig(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class SerialInputConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):SerialInputConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { + return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsSerialInputConfig(bb:flatbuffers.ByteBuffer, obj?:SerialInputConfig):SerialInputConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new SerialInputConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Whether to echo typed characters back to the serial console + */ +echoEnabled():boolean { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true; +} + +static startSerialInputConfig(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addEchoEnabled(builder:flatbuffers.Builder, echoEnabled:boolean) { + builder.addFieldInt8(0, +echoEnabled, +true); +} + +static endSerialInputConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createSerialInputConfig(builder:flatbuffers.Builder, echoEnabled:boolean):flatbuffers.Offset { + SerialInputConfig.startSerialInputConfig(builder); + SerialInputConfig.addEchoEnabled(builder, echoEnabled); + return SerialInputConfig.endSerialInputConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts index 24bef3f3..126b275f 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-config.ts @@ -1,101 +1,101 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { WiFiCredentials } from '../../../open-shock/serialization/configuration/wi-fi-credentials'; - - -export class WiFiConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WiFiConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWiFiConfig(bb:flatbuffers.ByteBuffer, obj?:WiFiConfig):WiFiConfig { - return (obj || new WiFiConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWiFiConfig(bb:flatbuffers.ByteBuffer, obj?:WiFiConfig):WiFiConfig { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WiFiConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * Access point SSID - */ -apSsid():string|null -apSsid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -apSsid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -/** - * Device hostname - */ -hostname():string|null -hostname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -hostname(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -/** - * WiFi network credentials - */ -credentials(index: number, obj?:WiFiCredentials):WiFiCredentials|null { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? (obj || new WiFiCredentials()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null; -} - -credentialsLength():number { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; -} - -static startWiFiConfig(builder:flatbuffers.Builder) { - builder.startObject(3); -} - -static addApSsid(builder:flatbuffers.Builder, apSsidOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, apSsidOffset, 0); -} - -static addHostname(builder:flatbuffers.Builder, hostnameOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, hostnameOffset, 0); -} - -static addCredentials(builder:flatbuffers.Builder, credentialsOffset:flatbuffers.Offset) { - builder.addFieldOffset(2, credentialsOffset, 0); -} - -static createCredentialsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset { - builder.startVector(4, data.length, 4); - for (let i = data.length - 1; i >= 0; i--) { - builder.addOffset(data[i]!); - } - return builder.endVector(); -} - -static startCredentialsVector(builder:flatbuffers.Builder, numElems:number) { - builder.startVector(4, numElems, 4); -} - -static endWiFiConfig(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWiFiConfig(builder:flatbuffers.Builder, apSsidOffset:flatbuffers.Offset, hostnameOffset:flatbuffers.Offset, credentialsOffset:flatbuffers.Offset):flatbuffers.Offset { - WiFiConfig.startWiFiConfig(builder); - WiFiConfig.addApSsid(builder, apSsidOffset); - WiFiConfig.addHostname(builder, hostnameOffset); - WiFiConfig.addCredentials(builder, credentialsOffset); - return WiFiConfig.endWiFiConfig(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { WiFiCredentials } from '../../../open-shock/serialization/configuration/wi-fi-credentials'; + + +export class WiFiConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WiFiConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWiFiConfig(bb:flatbuffers.ByteBuffer, obj?:WiFiConfig):WiFiConfig { + return (obj || new WiFiConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWiFiConfig(bb:flatbuffers.ByteBuffer, obj?:WiFiConfig):WiFiConfig { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WiFiConfig()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * Access point SSID + */ +apSsid():string|null +apSsid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +apSsid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +/** + * Device hostname + */ +hostname():string|null +hostname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +hostname(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +/** + * WiFi network credentials + */ +credentials(index: number, obj?:WiFiCredentials):WiFiCredentials|null { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? (obj || new WiFiCredentials()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null; +} + +credentialsLength():number { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; +} + +static startWiFiConfig(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addApSsid(builder:flatbuffers.Builder, apSsidOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, apSsidOffset, 0); +} + +static addHostname(builder:flatbuffers.Builder, hostnameOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, hostnameOffset, 0); +} + +static addCredentials(builder:flatbuffers.Builder, credentialsOffset:flatbuffers.Offset) { + builder.addFieldOffset(2, credentialsOffset, 0); +} + +static createCredentialsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset { + builder.startVector(4, data.length, 4); + for (let i = data.length - 1; i >= 0; i--) { + builder.addOffset(data[i]!); + } + return builder.endVector(); +} + +static startCredentialsVector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(4, numElems, 4); +} + +static endWiFiConfig(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWiFiConfig(builder:flatbuffers.Builder, apSsidOffset:flatbuffers.Offset, hostnameOffset:flatbuffers.Offset, credentialsOffset:flatbuffers.Offset):flatbuffers.Offset { + WiFiConfig.startWiFiConfig(builder); + WiFiConfig.addApSsid(builder, apSsidOffset); + WiFiConfig.addHostname(builder, hostnameOffset); + WiFiConfig.addCredentials(builder, credentialsOffset); + return WiFiConfig.endWiFiConfig(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts index ba580616..5c894bbc 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/wi-fi-credentials.ts @@ -1,81 +1,81 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WiFiCredentials { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WiFiCredentials { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWiFiCredentials(bb:flatbuffers.ByteBuffer, obj?:WiFiCredentials):WiFiCredentials { - return (obj || new WiFiCredentials()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWiFiCredentials(bb:flatbuffers.ByteBuffer, obj?:WiFiCredentials):WiFiCredentials { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WiFiCredentials()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -/** - * ID of the WiFi network credentials, used for referencing the credentials with a low memory footprint - */ -id():number { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; -} - -/** - * SSID of the WiFi network - */ -ssid():string|null -ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -/** - * Password of the WiFi network - */ -password():string|null -password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -password(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startWiFiCredentials(builder:flatbuffers.Builder) { - builder.startObject(3); -} - -static addId(builder:flatbuffers.Builder, id:number) { - builder.addFieldInt8(0, id, 0); -} - -static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, ssidOffset, 0); -} - -static addPassword(builder:flatbuffers.Builder, passwordOffset:flatbuffers.Offset) { - builder.addFieldOffset(2, passwordOffset, 0); -} - -static endWiFiCredentials(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWiFiCredentials(builder:flatbuffers.Builder, id:number, ssidOffset:flatbuffers.Offset, passwordOffset:flatbuffers.Offset):flatbuffers.Offset { - WiFiCredentials.startWiFiCredentials(builder); - WiFiCredentials.addId(builder, id); - WiFiCredentials.addSsid(builder, ssidOffset); - WiFiCredentials.addPassword(builder, passwordOffset); - return WiFiCredentials.endWiFiCredentials(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WiFiCredentials { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WiFiCredentials { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWiFiCredentials(bb:flatbuffers.ByteBuffer, obj?:WiFiCredentials):WiFiCredentials { + return (obj || new WiFiCredentials()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWiFiCredentials(bb:flatbuffers.ByteBuffer, obj?:WiFiCredentials):WiFiCredentials { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WiFiCredentials()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +/** + * ID of the WiFi network credentials, used for referencing the credentials with a low memory footprint + */ +id():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; +} + +/** + * SSID of the WiFi network + */ +ssid():string|null +ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +/** + * Password of the WiFi network + */ +password():string|null +password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +password(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startWiFiCredentials(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addId(builder:flatbuffers.Builder, id:number) { + builder.addFieldInt8(0, id, 0); +} + +static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, ssidOffset, 0); +} + +static addPassword(builder:flatbuffers.Builder, passwordOffset:flatbuffers.Offset) { + builder.addFieldOffset(2, passwordOffset, 0); +} + +static endWiFiCredentials(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWiFiCredentials(builder:flatbuffers.Builder, id:number, ssidOffset:flatbuffers.Offset, passwordOffset:flatbuffers.Offset):flatbuffers.Offset { + WiFiCredentials.startWiFiCredentials(builder); + WiFiCredentials.addId(builder, id); + WiFiCredentials.addSsid(builder, ssidOffset); + WiFiCredentials.addPassword(builder, passwordOffset); + return WiFiCredentials.endWiFiCredentials(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message-payload.ts deleted file mode 100644 index 46b1c0b9..00000000 --- a/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message-payload.ts +++ /dev/null @@ -1,34 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import { KeepAlive } from '../../open-shock/serialization/keep-alive'; - - -export enum DeviceToServerMessagePayload { - NONE = 0, - KeepAlive = 1 -} - -export function unionToDeviceToServerMessagePayload( - type: DeviceToServerMessagePayload, - accessor: (obj:KeepAlive) => KeepAlive|null -): KeepAlive|null { - switch(DeviceToServerMessagePayload[type]) { - case 'NONE': return null; - case 'KeepAlive': return accessor(new KeepAlive())! as KeepAlive; - default: return null; - } -} - -export function unionListToDeviceToServerMessagePayload( - type: DeviceToServerMessagePayload, - accessor: (index: number, obj:KeepAlive) => KeepAlive|null, - index: number -): KeepAlive|null { - switch(DeviceToServerMessagePayload[type]) { - case 'NONE': return null; - case 'KeepAlive': return accessor(index, new KeepAlive())! as KeepAlive; - default: return null; - } -} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message.ts deleted file mode 100644 index 5a3d23b6..00000000 --- a/frontend/src/lib/_fbs/open-shock/serialization/device-to-server-message.ts +++ /dev/null @@ -1,69 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { DeviceToServerMessagePayload, unionToDeviceToServerMessagePayload, unionListToDeviceToServerMessagePayload } from '../../open-shock/serialization/device-to-server-message-payload'; - - -export class DeviceToServerMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):DeviceToServerMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsDeviceToServerMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToServerMessage):DeviceToServerMessage { - return (obj || new DeviceToServerMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsDeviceToServerMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToServerMessage):DeviceToServerMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new DeviceToServerMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -payloadType():DeviceToServerMessagePayload { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : DeviceToServerMessagePayload.NONE; -} - -payload(obj:any):any|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; -} - -static startDeviceToServerMessage(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addPayloadType(builder:flatbuffers.Builder, payloadType:DeviceToServerMessagePayload) { - builder.addFieldInt8(0, payloadType, DeviceToServerMessagePayload.NONE); -} - -static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, payloadOffset, 0); -} - -static endDeviceToServerMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static finishDeviceToServerMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset); -} - -static finishSizePrefixedDeviceToServerMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset, undefined, true); -} - -static createDeviceToServerMessage(builder:flatbuffers.Builder, payloadType:DeviceToServerMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { - DeviceToServerMessage.startDeviceToServerMessage(builder); - DeviceToServerMessage.addPayloadType(builder, payloadType); - DeviceToServerMessage.addPayload(builder, payloadOffset); - return DeviceToServerMessage.endDeviceToServerMessage(builder); -} -} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway.ts new file mode 100644 index 00000000..655b96d7 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway.ts @@ -0,0 +1,10 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export { CaptivePortalConfig } from './gateway/captive-portal-config'; +export { GatewayToDeviceMessage } from './gateway/gateway-to-device-message'; +export { GatewayToDeviceMessagePayload } from './gateway/gateway-to-device-message-payload'; +export { OtaInstall } from './gateway/ota-install'; +export { ShockerCommand } from './gateway/shocker-command'; +export { ShockerCommandList } from './gateway/shocker-command-list'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/boot-status.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/boot-status.ts new file mode 100644 index 00000000..f9fe5e9f --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/boot-status.ts @@ -0,0 +1,65 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { FirmwareBootType } from '../../../open-shock/serialization/types/firmware-boot-type'; +import { SemVer } from '../../../open-shock/serialization/types/sem-ver'; + + +export class BootStatus { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):BootStatus { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsBootStatus(bb:flatbuffers.ByteBuffer, obj?:BootStatus):BootStatus { + return (obj || new BootStatus()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsBootStatus(bb:flatbuffers.ByteBuffer, obj?:BootStatus):BootStatus { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new BootStatus()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +bootType():FirmwareBootType { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : FirmwareBootType.Normal; +} + +firmwareVersion(obj?:SemVer):SemVer|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? (obj || new SemVer()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +otaUpdateId():number { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; +} + +static startBootStatus(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addBootType(builder:flatbuffers.Builder, bootType:FirmwareBootType) { + builder.addFieldInt8(0, bootType, FirmwareBootType.Normal); +} + +static addFirmwareVersion(builder:flatbuffers.Builder, firmwareVersionOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, firmwareVersionOffset, 0); +} + +static addOtaUpdateId(builder:flatbuffers.Builder, otaUpdateId:number) { + builder.addFieldInt32(2, otaUpdateId, 0); +} + +static endBootStatus(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/captive-portal-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/captive-portal-config.ts similarity index 96% rename from frontend/src/lib/_fbs/open-shock/serialization/captive-portal-config.ts rename to frontend/src/lib/_fbs/open-shock/serialization/gateway/captive-portal-config.ts index 29e06422..14d15463 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/captive-portal-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/captive-portal-config.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class CaptivePortalConfig { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):CaptivePortalConfig { - this.bb_pos = i; - this.bb = bb; - return this; -} - -enabled():boolean { - return !!this.bb!.readInt8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createCaptivePortalConfig(builder:flatbuffers.Builder, enabled: boolean):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(Number(Boolean(enabled))); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class CaptivePortalConfig { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):CaptivePortalConfig { + this.bb_pos = i; + this.bb = bb; + return this; +} + +enabled():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createCaptivePortalConfig(builder:flatbuffers.Builder, enabled: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(enabled))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message-payload.ts new file mode 100644 index 00000000..2da46cc9 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message-payload.ts @@ -0,0 +1,50 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import { BootStatus } from '../../../open-shock/serialization/gateway/boot-status'; +import { KeepAlive } from '../../../open-shock/serialization/gateway/keep-alive'; +import { OtaInstallFailed } from '../../../open-shock/serialization/gateway/ota-install-failed'; +import { OtaInstallProgress } from '../../../open-shock/serialization/gateway/ota-install-progress'; +import { OtaInstallStarted } from '../../../open-shock/serialization/gateway/ota-install-started'; + + +export enum DeviceToGatewayMessagePayload { + NONE = 0, + KeepAlive = 1, + BootStatus = 2, + OtaInstallStarted = 3, + OtaInstallProgress = 4, + OtaInstallFailed = 5 +} + +export function unionToDeviceToGatewayMessagePayload( + type: DeviceToGatewayMessagePayload, + accessor: (obj:BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted) => BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted|null +): BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted|null { + switch(DeviceToGatewayMessagePayload[type]) { + case 'NONE': return null; + case 'KeepAlive': return accessor(new KeepAlive())! as KeepAlive; + case 'BootStatus': return accessor(new BootStatus())! as BootStatus; + case 'OtaInstallStarted': return accessor(new OtaInstallStarted())! as OtaInstallStarted; + case 'OtaInstallProgress': return accessor(new OtaInstallProgress())! as OtaInstallProgress; + case 'OtaInstallFailed': return accessor(new OtaInstallFailed())! as OtaInstallFailed; + default: return null; + } +} + +export function unionListToDeviceToGatewayMessagePayload( + type: DeviceToGatewayMessagePayload, + accessor: (index: number, obj:BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted) => BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted|null, + index: number +): BootStatus|KeepAlive|OtaInstallFailed|OtaInstallProgress|OtaInstallStarted|null { + switch(DeviceToGatewayMessagePayload[type]) { + case 'NONE': return null; + case 'KeepAlive': return accessor(index, new KeepAlive())! as KeepAlive; + case 'BootStatus': return accessor(index, new BootStatus())! as BootStatus; + case 'OtaInstallStarted': return accessor(index, new OtaInstallStarted())! as OtaInstallStarted; + case 'OtaInstallProgress': return accessor(index, new OtaInstallProgress())! as OtaInstallProgress; + case 'OtaInstallFailed': return accessor(index, new OtaInstallFailed())! as OtaInstallFailed; + default: return null; + } +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message.ts new file mode 100644 index 00000000..1f0048d6 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/device-to-gateway-message.ts @@ -0,0 +1,69 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { DeviceToGatewayMessagePayload, unionToDeviceToGatewayMessagePayload, unionListToDeviceToGatewayMessagePayload } from '../../../open-shock/serialization/gateway/device-to-gateway-message-payload'; + + +export class DeviceToGatewayMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):DeviceToGatewayMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsDeviceToGatewayMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToGatewayMessage):DeviceToGatewayMessage { + return (obj || new DeviceToGatewayMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsDeviceToGatewayMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToGatewayMessage):DeviceToGatewayMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new DeviceToGatewayMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +payloadType():DeviceToGatewayMessagePayload { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : DeviceToGatewayMessagePayload.NONE; +} + +payload(obj:any):any|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; +} + +static startDeviceToGatewayMessage(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addPayloadType(builder:flatbuffers.Builder, payloadType:DeviceToGatewayMessagePayload) { + builder.addFieldInt8(0, payloadType, DeviceToGatewayMessagePayload.NONE); +} + +static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, payloadOffset, 0); +} + +static endDeviceToGatewayMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static finishDeviceToGatewayMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset); +} + +static finishSizePrefixedDeviceToGatewayMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset, undefined, true); +} + +static createDeviceToGatewayMessage(builder:flatbuffers.Builder, payloadType:DeviceToGatewayMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { + DeviceToGatewayMessage.startDeviceToGatewayMessage(builder); + DeviceToGatewayMessage.addPayloadType(builder, payloadType); + DeviceToGatewayMessage.addPayload(builder, payloadOffset); + return DeviceToGatewayMessage.endDeviceToGatewayMessage(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message-payload.ts new file mode 100644 index 00000000..0b12d57b --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message-payload.ts @@ -0,0 +1,42 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import { CaptivePortalConfig } from '../../../open-shock/serialization/gateway/captive-portal-config'; +import { OtaInstall } from '../../../open-shock/serialization/gateway/ota-install'; +import { ShockerCommandList } from '../../../open-shock/serialization/gateway/shocker-command-list'; + + +export enum GatewayToDeviceMessagePayload { + NONE = 0, + ShockerCommandList = 1, + CaptivePortalConfig = 2, + OtaInstall = 3 +} + +export function unionToGatewayToDeviceMessagePayload( + type: GatewayToDeviceMessagePayload, + accessor: (obj:CaptivePortalConfig|OtaInstall|ShockerCommandList) => CaptivePortalConfig|OtaInstall|ShockerCommandList|null +): CaptivePortalConfig|OtaInstall|ShockerCommandList|null { + switch(GatewayToDeviceMessagePayload[type]) { + case 'NONE': return null; + case 'ShockerCommandList': return accessor(new ShockerCommandList())! as ShockerCommandList; + case 'CaptivePortalConfig': return accessor(new CaptivePortalConfig())! as CaptivePortalConfig; + case 'OtaInstall': return accessor(new OtaInstall())! as OtaInstall; + default: return null; + } +} + +export function unionListToGatewayToDeviceMessagePayload( + type: GatewayToDeviceMessagePayload, + accessor: (index: number, obj:CaptivePortalConfig|OtaInstall|ShockerCommandList) => CaptivePortalConfig|OtaInstall|ShockerCommandList|null, + index: number +): CaptivePortalConfig|OtaInstall|ShockerCommandList|null { + switch(GatewayToDeviceMessagePayload[type]) { + case 'NONE': return null; + case 'ShockerCommandList': return accessor(index, new ShockerCommandList())! as ShockerCommandList; + case 'CaptivePortalConfig': return accessor(index, new CaptivePortalConfig())! as CaptivePortalConfig; + case 'OtaInstall': return accessor(index, new OtaInstall())! as OtaInstall; + default: return null; + } +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message.ts new file mode 100644 index 00000000..85a7ecc1 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/gateway-to-device-message.ts @@ -0,0 +1,69 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { GatewayToDeviceMessagePayload, unionToGatewayToDeviceMessagePayload, unionListToGatewayToDeviceMessagePayload } from '../../../open-shock/serialization/gateway/gateway-to-device-message-payload'; + + +export class GatewayToDeviceMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):GatewayToDeviceMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsGatewayToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:GatewayToDeviceMessage):GatewayToDeviceMessage { + return (obj || new GatewayToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsGatewayToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:GatewayToDeviceMessage):GatewayToDeviceMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new GatewayToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +payloadType():GatewayToDeviceMessagePayload { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : GatewayToDeviceMessagePayload.NONE; +} + +payload(obj:any):any|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; +} + +static startGatewayToDeviceMessage(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addPayloadType(builder:flatbuffers.Builder, payloadType:GatewayToDeviceMessagePayload) { + builder.addFieldInt8(0, payloadType, GatewayToDeviceMessagePayload.NONE); +} + +static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, payloadOffset, 0); +} + +static endGatewayToDeviceMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static finishGatewayToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset); +} + +static finishSizePrefixedGatewayToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset, undefined, true); +} + +static createGatewayToDeviceMessage(builder:flatbuffers.Builder, payloadType:GatewayToDeviceMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { + GatewayToDeviceMessage.startGatewayToDeviceMessage(builder); + GatewayToDeviceMessage.addPayloadType(builder, payloadType); + GatewayToDeviceMessage.addPayload(builder, payloadOffset); + return GatewayToDeviceMessage.endGatewayToDeviceMessage(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/keep-alive.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/keep-alive.ts similarity index 96% rename from frontend/src/lib/_fbs/open-shock/serialization/keep-alive.ts rename to frontend/src/lib/_fbs/open-shock/serialization/gateway/keep-alive.ts index db6e0855..3a19cbe7 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/keep-alive.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/keep-alive.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class KeepAlive { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):KeepAlive { - this.bb_pos = i; - this.bb = bb; - return this; -} - -uptime():bigint { - return this.bb!.readUint64(this.bb_pos); -} - -static sizeOf():number { - return 8; -} - -static createKeepAlive(builder:flatbuffers.Builder, uptime: bigint):flatbuffers.Offset { - builder.prep(8, 8); - builder.writeInt64(BigInt(uptime ?? 0)); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class KeepAlive { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):KeepAlive { + this.bb_pos = i; + this.bb = bb; + return this; +} + +uptime():bigint { + return this.bb!.readUint64(this.bb_pos); +} + +static sizeOf():number { + return 8; +} + +static createKeepAlive(builder:flatbuffers.Builder, uptime: bigint):flatbuffers.Offset { + builder.prep(8, 8); + builder.writeInt64(BigInt(uptime ?? 0)); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-failed.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-failed.ts new file mode 100644 index 00000000..81571d1d --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-failed.ts @@ -0,0 +1,70 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaInstallFailed { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaInstallFailed { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaInstallFailed(bb:flatbuffers.ByteBuffer, obj?:OtaInstallFailed):OtaInstallFailed { + return (obj || new OtaInstallFailed()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaInstallFailed(bb:flatbuffers.ByteBuffer, obj?:OtaInstallFailed):OtaInstallFailed { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaInstallFailed()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +updateId():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; +} + +message():string|null +message(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +message(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +fatal():boolean { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +static startOtaInstallFailed(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addUpdateId(builder:flatbuffers.Builder, updateId:number) { + builder.addFieldInt32(0, updateId, 0); +} + +static addMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, messageOffset, 0); +} + +static addFatal(builder:flatbuffers.Builder, fatal:boolean) { + builder.addFieldInt8(2, +fatal, +false); +} + +static endOtaInstallFailed(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaInstallFailed(builder:flatbuffers.Builder, updateId:number, messageOffset:flatbuffers.Offset, fatal:boolean):flatbuffers.Offset { + OtaInstallFailed.startOtaInstallFailed(builder); + OtaInstallFailed.addUpdateId(builder, updateId); + OtaInstallFailed.addMessage(builder, messageOffset); + OtaInstallFailed.addFatal(builder, fatal); + return OtaInstallFailed.endOtaInstallFailed(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress-task.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress-task.ts new file mode 100644 index 00000000..e9a25149 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress-task.ts @@ -0,0 +1,13 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum OtaInstallProgressTask { + FetchingMetadata = 0, + PreparingForInstall = 1, + FlashingFilesystem = 2, + VerifyingFilesystem = 3, + FlashingApplication = 4, + MarkingApplicationBootable = 5, + Rebooting = 6 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress.ts new file mode 100644 index 00000000..70f756a0 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-progress.ts @@ -0,0 +1,71 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { OtaInstallProgressTask } from '../../../open-shock/serialization/gateway/ota-install-progress-task'; + + +export class OtaInstallProgress { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaInstallProgress { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaInstallProgress(bb:flatbuffers.ByteBuffer, obj?:OtaInstallProgress):OtaInstallProgress { + return (obj || new OtaInstallProgress()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaInstallProgress(bb:flatbuffers.ByteBuffer, obj?:OtaInstallProgress):OtaInstallProgress { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaInstallProgress()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +updateId():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; +} + +task():OtaInstallProgressTask { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.readInt8(this.bb_pos + offset) : OtaInstallProgressTask.FetchingMetadata; +} + +progress():number { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0; +} + +static startOtaInstallProgress(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addUpdateId(builder:flatbuffers.Builder, updateId:number) { + builder.addFieldInt32(0, updateId, 0); +} + +static addTask(builder:flatbuffers.Builder, task:OtaInstallProgressTask) { + builder.addFieldInt8(1, task, OtaInstallProgressTask.FetchingMetadata); +} + +static addProgress(builder:flatbuffers.Builder, progress:number) { + builder.addFieldFloat32(2, progress, 0.0); +} + +static endOtaInstallProgress(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaInstallProgress(builder:flatbuffers.Builder, updateId:number, task:OtaInstallProgressTask, progress:number):flatbuffers.Offset { + OtaInstallProgress.startOtaInstallProgress(builder); + OtaInstallProgress.addUpdateId(builder, updateId); + OtaInstallProgress.addTask(builder, task); + OtaInstallProgress.addProgress(builder, progress); + return OtaInstallProgress.endOtaInstallProgress(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-started.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-started.ts new file mode 100644 index 00000000..bd82a2bd --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install-started.ts @@ -0,0 +1,55 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { SemVer } from '../../../open-shock/serialization/types/sem-ver'; + + +export class OtaInstallStarted { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaInstallStarted { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaInstallStarted(bb:flatbuffers.ByteBuffer, obj?:OtaInstallStarted):OtaInstallStarted { + return (obj || new OtaInstallStarted()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaInstallStarted(bb:flatbuffers.ByteBuffer, obj?:OtaInstallStarted):OtaInstallStarted { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaInstallStarted()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +updateId():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; +} + +version(obj?:SemVer):SemVer|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? (obj || new SemVer()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +static startOtaInstallStarted(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addUpdateId(builder:flatbuffers.Builder, updateId:number) { + builder.addFieldInt32(0, updateId, 0); +} + +static addVersion(builder:flatbuffers.Builder, versionOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, versionOffset, 0); +} + +static endOtaInstallStarted(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install.ts new file mode 100644 index 00000000..d3d17fc5 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/ota-install.ts @@ -0,0 +1,51 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { SemVer } from '../../../open-shock/serialization/types/sem-ver'; + + +export class OtaInstall { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaInstall { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaInstall(bb:flatbuffers.ByteBuffer, obj?:OtaInstall):OtaInstall { + return (obj || new OtaInstall()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaInstall(bb:flatbuffers.ByteBuffer, obj?:OtaInstall):OtaInstall { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaInstall()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +version(obj?:SemVer):SemVer|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? (obj || new SemVer()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +static startOtaInstall(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addVersion(builder:flatbuffers.Builder, versionOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, versionOffset, 0); +} + +static endOtaInstall(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaInstall(builder:flatbuffers.Builder, versionOffset:flatbuffers.Offset):flatbuffers.Offset { + OtaInstall.startOtaInstall(builder); + OtaInstall.addVersion(builder, versionOffset); + return OtaInstall.endOtaInstall(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/shocker-command-list.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command-list.ts similarity index 93% rename from frontend/src/lib/_fbs/open-shock/serialization/shocker-command-list.ts rename to frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command-list.ts index 238021a4..efdbdc61 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/shocker-command-list.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command-list.ts @@ -1,61 +1,61 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { ShockerCommand } from '../../open-shock/serialization/shocker-command'; - - -export class ShockerCommandList { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):ShockerCommandList { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsShockerCommandList(bb:flatbuffers.ByteBuffer, obj?:ShockerCommandList):ShockerCommandList { - return (obj || new ShockerCommandList()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsShockerCommandList(bb:flatbuffers.ByteBuffer, obj?:ShockerCommandList):ShockerCommandList { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new ShockerCommandList()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -commands(index: number, obj?:ShockerCommand):ShockerCommand|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? (obj || new ShockerCommand()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 8, this.bb!) : null; -} - -commandsLength():number { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; -} - -static startShockerCommandList(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addCommands(builder:flatbuffers.Builder, commandsOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, commandsOffset, 0); -} - -static startCommandsVector(builder:flatbuffers.Builder, numElems:number) { - builder.startVector(8, numElems, 2); -} - -static endShockerCommandList(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - builder.requiredField(offset, 4) // commands - return offset; -} - -static createShockerCommandList(builder:flatbuffers.Builder, commandsOffset:flatbuffers.Offset):flatbuffers.Offset { - ShockerCommandList.startShockerCommandList(builder); - ShockerCommandList.addCommands(builder, commandsOffset); - return ShockerCommandList.endShockerCommandList(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { ShockerCommand } from '../../../open-shock/serialization/gateway/shocker-command'; + + +export class ShockerCommandList { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):ShockerCommandList { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsShockerCommandList(bb:flatbuffers.ByteBuffer, obj?:ShockerCommandList):ShockerCommandList { + return (obj || new ShockerCommandList()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsShockerCommandList(bb:flatbuffers.ByteBuffer, obj?:ShockerCommandList):ShockerCommandList { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new ShockerCommandList()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +commands(index: number, obj?:ShockerCommand):ShockerCommand|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? (obj || new ShockerCommand()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 8, this.bb!) : null; +} + +commandsLength():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; +} + +static startShockerCommandList(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addCommands(builder:flatbuffers.Builder, commandsOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, commandsOffset, 0); +} + +static startCommandsVector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(8, numElems, 2); +} + +static endShockerCommandList(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + builder.requiredField(offset, 4) // commands + return offset; +} + +static createShockerCommandList(builder:flatbuffers.Builder, commandsOffset:flatbuffers.Offset):flatbuffers.Offset { + ShockerCommandList.startShockerCommandList(builder); + ShockerCommandList.addCommands(builder, commandsOffset); + return ShockerCommandList.endShockerCommandList(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/shocker-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command.ts similarity index 83% rename from frontend/src/lib/_fbs/open-shock/serialization/shocker-command.ts rename to frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command.ts index fdb23ac7..abf14f61 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/shocker-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/gateway/shocker-command.ts @@ -1,55 +1,55 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { ShockerCommandType } from '../../open-shock/serialization/types/shocker-command-type'; -import { ShockerModelType } from '../../open-shock/serialization/types/shocker-model-type'; - - -export class ShockerCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):ShockerCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -model():ShockerModelType { - return this.bb!.readUint8(this.bb_pos); -} - -id():number { - return this.bb!.readUint16(this.bb_pos + 2); -} - -type():ShockerCommandType { - return this.bb!.readUint8(this.bb_pos + 4); -} - -intensity():number { - return this.bb!.readUint8(this.bb_pos + 5); -} - -duration():number { - return this.bb!.readUint16(this.bb_pos + 6); -} - -static sizeOf():number { - return 8; -} - -static createShockerCommand(builder:flatbuffers.Builder, model: ShockerModelType, id: number, type: ShockerCommandType, intensity: number, duration: number):flatbuffers.Offset { - builder.prep(2, 8); - builder.writeInt16(duration); - builder.writeInt8(intensity); - builder.writeInt8(type); - builder.writeInt16(id); - builder.pad(1); - builder.writeInt8(model); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { ShockerCommandType } from '../../../open-shock/serialization/types/shocker-command-type'; +import { ShockerModelType } from '../../../open-shock/serialization/types/shocker-model-type'; + + +export class ShockerCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):ShockerCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +model():ShockerModelType { + return this.bb!.readUint8(this.bb_pos); +} + +id():number { + return this.bb!.readUint16(this.bb_pos + 2); +} + +type():ShockerCommandType { + return this.bb!.readUint8(this.bb_pos + 4); +} + +intensity():number { + return this.bb!.readUint8(this.bb_pos + 5); +} + +duration():number { + return this.bb!.readUint16(this.bb_pos + 6); +} + +static sizeOf():number { + return 8; +} + +static createShockerCommand(builder:flatbuffers.Builder, model: ShockerModelType, id: number, type: ShockerCommandType, intensity: number, duration: number):flatbuffers.Offset { + builder.prep(2, 8); + builder.writeInt16(duration); + builder.writeInt8(intensity); + builder.writeInt8(type); + builder.writeInt16(id); + builder.pad(1); + builder.writeInt8(model); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local.ts b/frontend/src/lib/_fbs/open-shock/serialization/local.ts index ce06d3d2..f7b55800 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local.ts @@ -1,14 +1,23 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export { AccountLinkCommand } from './local/account-link-command'; -export { AccountUnlinkCommand } from './local/account-unlink-command'; -export { LocalToDeviceMessage } from './local/local-to-device-message'; -export { LocalToDeviceMessagePayload } from './local/local-to-device-message-payload'; -export { SetRfTxPinCommand } from './local/set-rf-tx-pin-command'; -export { WifiNetworkConnectCommand } from './local/wifi-network-connect-command'; -export { WifiNetworkDisconnectCommand } from './local/wifi-network-disconnect-command'; -export { WifiNetworkForgetCommand } from './local/wifi-network-forget-command'; -export { WifiNetworkSaveCommand } from './local/wifi-network-save-command'; -export { WifiScanCommand } from './local/wifi-scan-command'; +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export { AccountLinkCommand } from './local/account-link-command'; +export { AccountUnlinkCommand } from './local/account-unlink-command'; +export { LocalToDeviceMessage } from './local/local-to-device-message'; +export { LocalToDeviceMessagePayload } from './local/local-to-device-message-payload'; +export { OtaUpdateCheckForUpdatesCommand } from './local/ota-update-check-for-updates-command'; +export { OtaUpdateHandleUpdateRequestCommand } from './local/ota-update-handle-update-request-command'; +export { OtaUpdateSetAllowBackendManagementCommand } from './local/ota-update-set-allow-backend-management-command'; +export { OtaUpdateSetCheckIntervalCommand } from './local/ota-update-set-check-interval-command'; +export { OtaUpdateSetDomainCommand } from './local/ota-update-set-domain-command'; +export { OtaUpdateSetIsEnabledCommand } from './local/ota-update-set-is-enabled-command'; +export { OtaUpdateSetRequireManualApprovalCommand } from './local/ota-update-set-require-manual-approval-command'; +export { OtaUpdateSetUpdateChannelCommand } from './local/ota-update-set-update-channel-command'; +export { OtaUpdateStartUpdateCommand } from './local/ota-update-start-update-command'; +export { SetRfTxPinCommand } from './local/set-rf-tx-pin-command'; +export { WifiNetworkConnectCommand } from './local/wifi-network-connect-command'; +export { WifiNetworkDisconnectCommand } from './local/wifi-network-disconnect-command'; +export { WifiNetworkForgetCommand } from './local/wifi-network-forget-command'; +export { WifiNetworkSaveCommand } from './local/wifi-network-save-command'; +export { WifiScanCommand } from './local/wifi-scan-command'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command-result.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command-result.ts index fac7e08c..491d0809 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command-result.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command-result.ts @@ -1,33 +1,33 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { AccountLinkResultCode } from '../../../open-shock/serialization/local/account-link-result-code'; - - -export class AccountLinkCommandResult { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):AccountLinkCommandResult { - this.bb_pos = i; - this.bb = bb; - return this; -} - -result():AccountLinkResultCode { - return this.bb!.readUint8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createAccountLinkCommandResult(builder:flatbuffers.Builder, result: AccountLinkResultCode):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(result); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { AccountLinkResultCode } from '../../../open-shock/serialization/local/account-link-result-code'; + + +export class AccountLinkCommandResult { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):AccountLinkCommandResult { + this.bb_pos = i; + this.bb = bb; + return this; +} + +result():AccountLinkResultCode { + return this.bb!.readUint8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createAccountLinkCommandResult(builder:flatbuffers.Builder, result: AccountLinkResultCode):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(result); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command.ts index 8ffc0f37..1c0188d3 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-command.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class AccountLinkCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):AccountLinkCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsAccountLinkCommand(bb:flatbuffers.ByteBuffer, obj?:AccountLinkCommand):AccountLinkCommand { - return (obj || new AccountLinkCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsAccountLinkCommand(bb:flatbuffers.ByteBuffer, obj?:AccountLinkCommand):AccountLinkCommand { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new AccountLinkCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -code():string|null -code(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -code(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startAccountLinkCommand(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addCode(builder:flatbuffers.Builder, codeOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, codeOffset, 0); -} - -static endAccountLinkCommand(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createAccountLinkCommand(builder:flatbuffers.Builder, codeOffset:flatbuffers.Offset):flatbuffers.Offset { - AccountLinkCommand.startAccountLinkCommand(builder); - AccountLinkCommand.addCode(builder, codeOffset); - return AccountLinkCommand.endAccountLinkCommand(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class AccountLinkCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):AccountLinkCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsAccountLinkCommand(bb:flatbuffers.ByteBuffer, obj?:AccountLinkCommand):AccountLinkCommand { + return (obj || new AccountLinkCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsAccountLinkCommand(bb:flatbuffers.ByteBuffer, obj?:AccountLinkCommand):AccountLinkCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new AccountLinkCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +code():string|null +code(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +code(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startAccountLinkCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addCode(builder:flatbuffers.Builder, codeOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, codeOffset, 0); +} + +static endAccountLinkCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createAccountLinkCommand(builder:flatbuffers.Builder, codeOffset:flatbuffers.Offset):flatbuffers.Offset { + AccountLinkCommand.startAccountLinkCommand(builder); + AccountLinkCommand.addCode(builder, codeOffset); + return AccountLinkCommand.endAccountLinkCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-result-code.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-result-code.ts index 0e7a7a13..48872d5b 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-result-code.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/account-link-result-code.ts @@ -1,12 +1,12 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum AccountLinkResultCode { - Success = 0, - CodeRequired = 1, - InvalidCodeLength = 2, - NoInternetConnection = 3, - InvalidCode = 4, - InternalError = 5 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum AccountLinkResultCode { + Success = 0, + CodeRequired = 1, + InvalidCodeLength = 2, + NoInternetConnection = 3, + InvalidCode = 4, + InternalError = 5 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/account-unlink-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/account-unlink-command.ts index 5256be63..936e2ecf 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/account-unlink-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/account-unlink-command.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class AccountUnlinkCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):AccountUnlinkCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -placeholder():boolean { - return !!this.bb!.readInt8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createAccountUnlinkCommand(builder:flatbuffers.Builder, placeholder: boolean):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(Number(Boolean(placeholder))); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class AccountUnlinkCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):AccountUnlinkCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +placeholder():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createAccountUnlinkCommand(builder:flatbuffers.Builder, placeholder: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(placeholder))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message-payload.ts index 6af05098..5e5dd9e0 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message-payload.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message-payload.ts @@ -1,62 +1,62 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import { AccountLinkCommandResult } from '../../../open-shock/serialization/local/account-link-command-result'; -import { ErrorMessage } from '../../../open-shock/serialization/local/error-message'; -import { ReadyMessage } from '../../../open-shock/serialization/local/ready-message'; -import { SetRfTxPinCommandResult } from '../../../open-shock/serialization/local/set-rf-tx-pin-command-result'; -import { WifiGotIpEvent } from '../../../open-shock/serialization/local/wifi-got-ip-event'; -import { WifiLostIpEvent } from '../../../open-shock/serialization/local/wifi-lost-ip-event'; -import { WifiNetworkEvent } from '../../../open-shock/serialization/local/wifi-network-event'; -import { WifiScanStatusMessage } from '../../../open-shock/serialization/local/wifi-scan-status-message'; - - -export enum DeviceToLocalMessagePayload { - NONE = 0, - ReadyMessage = 1, - ErrorMessage = 2, - WifiScanStatusMessage = 3, - WifiNetworkEvent = 4, - WifiGotIpEvent = 5, - WifiLostIpEvent = 6, - AccountLinkCommandResult = 7, - SetRfTxPinCommandResult = 8 -} - -export function unionToDeviceToLocalMessagePayload( - type: DeviceToLocalMessagePayload, - accessor: (obj:AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage) => AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null -): AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null { - switch(DeviceToLocalMessagePayload[type]) { - case 'NONE': return null; - case 'ReadyMessage': return accessor(new ReadyMessage())! as ReadyMessage; - case 'ErrorMessage': return accessor(new ErrorMessage())! as ErrorMessage; - case 'WifiScanStatusMessage': return accessor(new WifiScanStatusMessage())! as WifiScanStatusMessage; - case 'WifiNetworkEvent': return accessor(new WifiNetworkEvent())! as WifiNetworkEvent; - case 'WifiGotIpEvent': return accessor(new WifiGotIpEvent())! as WifiGotIpEvent; - case 'WifiLostIpEvent': return accessor(new WifiLostIpEvent())! as WifiLostIpEvent; - case 'AccountLinkCommandResult': return accessor(new AccountLinkCommandResult())! as AccountLinkCommandResult; - case 'SetRfTxPinCommandResult': return accessor(new SetRfTxPinCommandResult())! as SetRfTxPinCommandResult; - default: return null; - } -} - -export function unionListToDeviceToLocalMessagePayload( - type: DeviceToLocalMessagePayload, - accessor: (index: number, obj:AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage) => AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null, - index: number -): AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null { - switch(DeviceToLocalMessagePayload[type]) { - case 'NONE': return null; - case 'ReadyMessage': return accessor(index, new ReadyMessage())! as ReadyMessage; - case 'ErrorMessage': return accessor(index, new ErrorMessage())! as ErrorMessage; - case 'WifiScanStatusMessage': return accessor(index, new WifiScanStatusMessage())! as WifiScanStatusMessage; - case 'WifiNetworkEvent': return accessor(index, new WifiNetworkEvent())! as WifiNetworkEvent; - case 'WifiGotIpEvent': return accessor(index, new WifiGotIpEvent())! as WifiGotIpEvent; - case 'WifiLostIpEvent': return accessor(index, new WifiLostIpEvent())! as WifiLostIpEvent; - case 'AccountLinkCommandResult': return accessor(index, new AccountLinkCommandResult())! as AccountLinkCommandResult; - case 'SetRfTxPinCommandResult': return accessor(index, new SetRfTxPinCommandResult())! as SetRfTxPinCommandResult; - default: return null; - } -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import { AccountLinkCommandResult } from '../../../open-shock/serialization/local/account-link-command-result'; +import { ErrorMessage } from '../../../open-shock/serialization/local/error-message'; +import { ReadyMessage } from '../../../open-shock/serialization/local/ready-message'; +import { SetRfTxPinCommandResult } from '../../../open-shock/serialization/local/set-rf-tx-pin-command-result'; +import { WifiGotIpEvent } from '../../../open-shock/serialization/local/wifi-got-ip-event'; +import { WifiLostIpEvent } from '../../../open-shock/serialization/local/wifi-lost-ip-event'; +import { WifiNetworkEvent } from '../../../open-shock/serialization/local/wifi-network-event'; +import { WifiScanStatusMessage } from '../../../open-shock/serialization/local/wifi-scan-status-message'; + + +export enum DeviceToLocalMessagePayload { + NONE = 0, + ReadyMessage = 1, + ErrorMessage = 2, + WifiScanStatusMessage = 3, + WifiNetworkEvent = 4, + WifiGotIpEvent = 5, + WifiLostIpEvent = 6, + AccountLinkCommandResult = 7, + SetRfTxPinCommandResult = 8 +} + +export function unionToDeviceToLocalMessagePayload( + type: DeviceToLocalMessagePayload, + accessor: (obj:AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage) => AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null +): AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null { + switch(DeviceToLocalMessagePayload[type]) { + case 'NONE': return null; + case 'ReadyMessage': return accessor(new ReadyMessage())! as ReadyMessage; + case 'ErrorMessage': return accessor(new ErrorMessage())! as ErrorMessage; + case 'WifiScanStatusMessage': return accessor(new WifiScanStatusMessage())! as WifiScanStatusMessage; + case 'WifiNetworkEvent': return accessor(new WifiNetworkEvent())! as WifiNetworkEvent; + case 'WifiGotIpEvent': return accessor(new WifiGotIpEvent())! as WifiGotIpEvent; + case 'WifiLostIpEvent': return accessor(new WifiLostIpEvent())! as WifiLostIpEvent; + case 'AccountLinkCommandResult': return accessor(new AccountLinkCommandResult())! as AccountLinkCommandResult; + case 'SetRfTxPinCommandResult': return accessor(new SetRfTxPinCommandResult())! as SetRfTxPinCommandResult; + default: return null; + } +} + +export function unionListToDeviceToLocalMessagePayload( + type: DeviceToLocalMessagePayload, + accessor: (index: number, obj:AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage) => AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null, + index: number +): AccountLinkCommandResult|ErrorMessage|ReadyMessage|SetRfTxPinCommandResult|WifiGotIpEvent|WifiLostIpEvent|WifiNetworkEvent|WifiScanStatusMessage|null { + switch(DeviceToLocalMessagePayload[type]) { + case 'NONE': return null; + case 'ReadyMessage': return accessor(index, new ReadyMessage())! as ReadyMessage; + case 'ErrorMessage': return accessor(index, new ErrorMessage())! as ErrorMessage; + case 'WifiScanStatusMessage': return accessor(index, new WifiScanStatusMessage())! as WifiScanStatusMessage; + case 'WifiNetworkEvent': return accessor(index, new WifiNetworkEvent())! as WifiNetworkEvent; + case 'WifiGotIpEvent': return accessor(index, new WifiGotIpEvent())! as WifiGotIpEvent; + case 'WifiLostIpEvent': return accessor(index, new WifiLostIpEvent())! as WifiLostIpEvent; + case 'AccountLinkCommandResult': return accessor(index, new AccountLinkCommandResult())! as AccountLinkCommandResult; + case 'SetRfTxPinCommandResult': return accessor(index, new SetRfTxPinCommandResult())! as SetRfTxPinCommandResult; + default: return null; + } +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message.ts index b989d6fd..953e2207 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/device-to-local-message.ts @@ -1,69 +1,69 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { DeviceToLocalMessagePayload, unionToDeviceToLocalMessagePayload, unionListToDeviceToLocalMessagePayload } from '../../../open-shock/serialization/local/device-to-local-message-payload'; - - -export class DeviceToLocalMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):DeviceToLocalMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsDeviceToLocalMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToLocalMessage):DeviceToLocalMessage { - return (obj || new DeviceToLocalMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsDeviceToLocalMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToLocalMessage):DeviceToLocalMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new DeviceToLocalMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -payloadType():DeviceToLocalMessagePayload { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : DeviceToLocalMessagePayload.NONE; -} - -payload(obj:any):any|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; -} - -static startDeviceToLocalMessage(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addPayloadType(builder:flatbuffers.Builder, payloadType:DeviceToLocalMessagePayload) { - builder.addFieldInt8(0, payloadType, DeviceToLocalMessagePayload.NONE); -} - -static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, payloadOffset, 0); -} - -static endDeviceToLocalMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static finishDeviceToLocalMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset); -} - -static finishSizePrefixedDeviceToLocalMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset, undefined, true); -} - -static createDeviceToLocalMessage(builder:flatbuffers.Builder, payloadType:DeviceToLocalMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { - DeviceToLocalMessage.startDeviceToLocalMessage(builder); - DeviceToLocalMessage.addPayloadType(builder, payloadType); - DeviceToLocalMessage.addPayload(builder, payloadOffset); - return DeviceToLocalMessage.endDeviceToLocalMessage(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { DeviceToLocalMessagePayload, unionToDeviceToLocalMessagePayload, unionListToDeviceToLocalMessagePayload } from '../../../open-shock/serialization/local/device-to-local-message-payload'; + + +export class DeviceToLocalMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):DeviceToLocalMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsDeviceToLocalMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToLocalMessage):DeviceToLocalMessage { + return (obj || new DeviceToLocalMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsDeviceToLocalMessage(bb:flatbuffers.ByteBuffer, obj?:DeviceToLocalMessage):DeviceToLocalMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new DeviceToLocalMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +payloadType():DeviceToLocalMessagePayload { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : DeviceToLocalMessagePayload.NONE; +} + +payload(obj:any):any|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; +} + +static startDeviceToLocalMessage(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addPayloadType(builder:flatbuffers.Builder, payloadType:DeviceToLocalMessagePayload) { + builder.addFieldInt8(0, payloadType, DeviceToLocalMessagePayload.NONE); +} + +static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, payloadOffset, 0); +} + +static endDeviceToLocalMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static finishDeviceToLocalMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset); +} + +static finishSizePrefixedDeviceToLocalMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset, undefined, true); +} + +static createDeviceToLocalMessage(builder:flatbuffers.Builder, payloadType:DeviceToLocalMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { + DeviceToLocalMessage.startDeviceToLocalMessage(builder); + DeviceToLocalMessage.addPayloadType(builder, payloadType); + DeviceToLocalMessage.addPayload(builder, payloadOffset); + return DeviceToLocalMessage.endDeviceToLocalMessage(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/error-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/error-message.ts index ea45598b..9b62f56a 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/error-message.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/error-message.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class ErrorMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):ErrorMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsErrorMessage(bb:flatbuffers.ByteBuffer, obj?:ErrorMessage):ErrorMessage { - return (obj || new ErrorMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsErrorMessage(bb:flatbuffers.ByteBuffer, obj?:ErrorMessage):ErrorMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new ErrorMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -message():string|null -message(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -message(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startErrorMessage(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, messageOffset, 0); -} - -static endErrorMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createErrorMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset):flatbuffers.Offset { - ErrorMessage.startErrorMessage(builder); - ErrorMessage.addMessage(builder, messageOffset); - return ErrorMessage.endErrorMessage(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class ErrorMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):ErrorMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsErrorMessage(bb:flatbuffers.ByteBuffer, obj?:ErrorMessage):ErrorMessage { + return (obj || new ErrorMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsErrorMessage(bb:flatbuffers.ByteBuffer, obj?:ErrorMessage):ErrorMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new ErrorMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +message():string|null +message(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +message(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startErrorMessage(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, messageOffset, 0); +} + +static endErrorMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createErrorMessage(builder:flatbuffers.Builder, messageOffset:flatbuffers.Offset):flatbuffers.Offset { + ErrorMessage.startErrorMessage(builder); + ErrorMessage.addMessage(builder, messageOffset); + return ErrorMessage.endErrorMessage(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message-payload.ts index d07ca177..fc1999fb 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message-payload.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message-payload.ts @@ -1,62 +1,98 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import { AccountLinkCommand } from '../../../open-shock/serialization/local/account-link-command'; -import { AccountUnlinkCommand } from '../../../open-shock/serialization/local/account-unlink-command'; -import { SetRfTxPinCommand } from '../../../open-shock/serialization/local/set-rf-tx-pin-command'; -import { WifiNetworkConnectCommand } from '../../../open-shock/serialization/local/wifi-network-connect-command'; -import { WifiNetworkDisconnectCommand } from '../../../open-shock/serialization/local/wifi-network-disconnect-command'; -import { WifiNetworkForgetCommand } from '../../../open-shock/serialization/local/wifi-network-forget-command'; -import { WifiNetworkSaveCommand } from '../../../open-shock/serialization/local/wifi-network-save-command'; -import { WifiScanCommand } from '../../../open-shock/serialization/local/wifi-scan-command'; - - -export enum LocalToDeviceMessagePayload { - NONE = 0, - WifiScanCommand = 1, - WifiNetworkSaveCommand = 2, - WifiNetworkForgetCommand = 3, - WifiNetworkConnectCommand = 4, - WifiNetworkDisconnectCommand = 5, - AccountLinkCommand = 6, - AccountUnlinkCommand = 7, - SetRfTxPinCommand = 8 -} - -export function unionToLocalToDeviceMessagePayload( - type: LocalToDeviceMessagePayload, - accessor: (obj:AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand) => AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null -): AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null { - switch(LocalToDeviceMessagePayload[type]) { - case 'NONE': return null; - case 'WifiScanCommand': return accessor(new WifiScanCommand())! as WifiScanCommand; - case 'WifiNetworkSaveCommand': return accessor(new WifiNetworkSaveCommand())! as WifiNetworkSaveCommand; - case 'WifiNetworkForgetCommand': return accessor(new WifiNetworkForgetCommand())! as WifiNetworkForgetCommand; - case 'WifiNetworkConnectCommand': return accessor(new WifiNetworkConnectCommand())! as WifiNetworkConnectCommand; - case 'WifiNetworkDisconnectCommand': return accessor(new WifiNetworkDisconnectCommand())! as WifiNetworkDisconnectCommand; - case 'AccountLinkCommand': return accessor(new AccountLinkCommand())! as AccountLinkCommand; - case 'AccountUnlinkCommand': return accessor(new AccountUnlinkCommand())! as AccountUnlinkCommand; - case 'SetRfTxPinCommand': return accessor(new SetRfTxPinCommand())! as SetRfTxPinCommand; - default: return null; - } -} - -export function unionListToLocalToDeviceMessagePayload( - type: LocalToDeviceMessagePayload, - accessor: (index: number, obj:AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand) => AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null, - index: number -): AccountLinkCommand|AccountUnlinkCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null { - switch(LocalToDeviceMessagePayload[type]) { - case 'NONE': return null; - case 'WifiScanCommand': return accessor(index, new WifiScanCommand())! as WifiScanCommand; - case 'WifiNetworkSaveCommand': return accessor(index, new WifiNetworkSaveCommand())! as WifiNetworkSaveCommand; - case 'WifiNetworkForgetCommand': return accessor(index, new WifiNetworkForgetCommand())! as WifiNetworkForgetCommand; - case 'WifiNetworkConnectCommand': return accessor(index, new WifiNetworkConnectCommand())! as WifiNetworkConnectCommand; - case 'WifiNetworkDisconnectCommand': return accessor(index, new WifiNetworkDisconnectCommand())! as WifiNetworkDisconnectCommand; - case 'AccountLinkCommand': return accessor(index, new AccountLinkCommand())! as AccountLinkCommand; - case 'AccountUnlinkCommand': return accessor(index, new AccountUnlinkCommand())! as AccountUnlinkCommand; - case 'SetRfTxPinCommand': return accessor(index, new SetRfTxPinCommand())! as SetRfTxPinCommand; - default: return null; - } -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import { AccountLinkCommand } from '../../../open-shock/serialization/local/account-link-command'; +import { AccountUnlinkCommand } from '../../../open-shock/serialization/local/account-unlink-command'; +import { OtaUpdateCheckForUpdatesCommand } from '../../../open-shock/serialization/local/ota-update-check-for-updates-command'; +import { OtaUpdateHandleUpdateRequestCommand } from '../../../open-shock/serialization/local/ota-update-handle-update-request-command'; +import { OtaUpdateSetAllowBackendManagementCommand } from '../../../open-shock/serialization/local/ota-update-set-allow-backend-management-command'; +import { OtaUpdateSetCheckIntervalCommand } from '../../../open-shock/serialization/local/ota-update-set-check-interval-command'; +import { OtaUpdateSetDomainCommand } from '../../../open-shock/serialization/local/ota-update-set-domain-command'; +import { OtaUpdateSetIsEnabledCommand } from '../../../open-shock/serialization/local/ota-update-set-is-enabled-command'; +import { OtaUpdateSetRequireManualApprovalCommand } from '../../../open-shock/serialization/local/ota-update-set-require-manual-approval-command'; +import { OtaUpdateSetUpdateChannelCommand } from '../../../open-shock/serialization/local/ota-update-set-update-channel-command'; +import { OtaUpdateStartUpdateCommand } from '../../../open-shock/serialization/local/ota-update-start-update-command'; +import { SetRfTxPinCommand } from '../../../open-shock/serialization/local/set-rf-tx-pin-command'; +import { WifiNetworkConnectCommand } from '../../../open-shock/serialization/local/wifi-network-connect-command'; +import { WifiNetworkDisconnectCommand } from '../../../open-shock/serialization/local/wifi-network-disconnect-command'; +import { WifiNetworkForgetCommand } from '../../../open-shock/serialization/local/wifi-network-forget-command'; +import { WifiNetworkSaveCommand } from '../../../open-shock/serialization/local/wifi-network-save-command'; +import { WifiScanCommand } from '../../../open-shock/serialization/local/wifi-scan-command'; + + +export enum LocalToDeviceMessagePayload { + NONE = 0, + WifiScanCommand = 1, + WifiNetworkSaveCommand = 2, + WifiNetworkForgetCommand = 3, + WifiNetworkConnectCommand = 4, + WifiNetworkDisconnectCommand = 5, + OtaUpdateSetIsEnabledCommand = 6, + OtaUpdateSetDomainCommand = 7, + OtaUpdateSetUpdateChannelCommand = 8, + OtaUpdateSetCheckIntervalCommand = 9, + OtaUpdateSetAllowBackendManagementCommand = 10, + OtaUpdateSetRequireManualApprovalCommand = 11, + OtaUpdateHandleUpdateRequestCommand = 12, + OtaUpdateCheckForUpdatesCommand = 13, + OtaUpdateStartUpdateCommand = 14, + AccountLinkCommand = 15, + AccountUnlinkCommand = 16, + SetRfTxPinCommand = 17 +} + +export function unionToLocalToDeviceMessagePayload( + type: LocalToDeviceMessagePayload, + accessor: (obj:AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand) => AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null +): AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null { + switch(LocalToDeviceMessagePayload[type]) { + case 'NONE': return null; + case 'WifiScanCommand': return accessor(new WifiScanCommand())! as WifiScanCommand; + case 'WifiNetworkSaveCommand': return accessor(new WifiNetworkSaveCommand())! as WifiNetworkSaveCommand; + case 'WifiNetworkForgetCommand': return accessor(new WifiNetworkForgetCommand())! as WifiNetworkForgetCommand; + case 'WifiNetworkConnectCommand': return accessor(new WifiNetworkConnectCommand())! as WifiNetworkConnectCommand; + case 'WifiNetworkDisconnectCommand': return accessor(new WifiNetworkDisconnectCommand())! as WifiNetworkDisconnectCommand; + case 'OtaUpdateSetIsEnabledCommand': return accessor(new OtaUpdateSetIsEnabledCommand())! as OtaUpdateSetIsEnabledCommand; + case 'OtaUpdateSetDomainCommand': return accessor(new OtaUpdateSetDomainCommand())! as OtaUpdateSetDomainCommand; + case 'OtaUpdateSetUpdateChannelCommand': return accessor(new OtaUpdateSetUpdateChannelCommand())! as OtaUpdateSetUpdateChannelCommand; + case 'OtaUpdateSetCheckIntervalCommand': return accessor(new OtaUpdateSetCheckIntervalCommand())! as OtaUpdateSetCheckIntervalCommand; + case 'OtaUpdateSetAllowBackendManagementCommand': return accessor(new OtaUpdateSetAllowBackendManagementCommand())! as OtaUpdateSetAllowBackendManagementCommand; + case 'OtaUpdateSetRequireManualApprovalCommand': return accessor(new OtaUpdateSetRequireManualApprovalCommand())! as OtaUpdateSetRequireManualApprovalCommand; + case 'OtaUpdateHandleUpdateRequestCommand': return accessor(new OtaUpdateHandleUpdateRequestCommand())! as OtaUpdateHandleUpdateRequestCommand; + case 'OtaUpdateCheckForUpdatesCommand': return accessor(new OtaUpdateCheckForUpdatesCommand())! as OtaUpdateCheckForUpdatesCommand; + case 'OtaUpdateStartUpdateCommand': return accessor(new OtaUpdateStartUpdateCommand())! as OtaUpdateStartUpdateCommand; + case 'AccountLinkCommand': return accessor(new AccountLinkCommand())! as AccountLinkCommand; + case 'AccountUnlinkCommand': return accessor(new AccountUnlinkCommand())! as AccountUnlinkCommand; + case 'SetRfTxPinCommand': return accessor(new SetRfTxPinCommand())! as SetRfTxPinCommand; + default: return null; + } +} + +export function unionListToLocalToDeviceMessagePayload( + type: LocalToDeviceMessagePayload, + accessor: (index: number, obj:AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand) => AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null, + index: number +): AccountLinkCommand|AccountUnlinkCommand|OtaUpdateCheckForUpdatesCommand|OtaUpdateHandleUpdateRequestCommand|OtaUpdateSetAllowBackendManagementCommand|OtaUpdateSetCheckIntervalCommand|OtaUpdateSetDomainCommand|OtaUpdateSetIsEnabledCommand|OtaUpdateSetRequireManualApprovalCommand|OtaUpdateSetUpdateChannelCommand|OtaUpdateStartUpdateCommand|SetRfTxPinCommand|WifiNetworkConnectCommand|WifiNetworkDisconnectCommand|WifiNetworkForgetCommand|WifiNetworkSaveCommand|WifiScanCommand|null { + switch(LocalToDeviceMessagePayload[type]) { + case 'NONE': return null; + case 'WifiScanCommand': return accessor(index, new WifiScanCommand())! as WifiScanCommand; + case 'WifiNetworkSaveCommand': return accessor(index, new WifiNetworkSaveCommand())! as WifiNetworkSaveCommand; + case 'WifiNetworkForgetCommand': return accessor(index, new WifiNetworkForgetCommand())! as WifiNetworkForgetCommand; + case 'WifiNetworkConnectCommand': return accessor(index, new WifiNetworkConnectCommand())! as WifiNetworkConnectCommand; + case 'WifiNetworkDisconnectCommand': return accessor(index, new WifiNetworkDisconnectCommand())! as WifiNetworkDisconnectCommand; + case 'OtaUpdateSetIsEnabledCommand': return accessor(index, new OtaUpdateSetIsEnabledCommand())! as OtaUpdateSetIsEnabledCommand; + case 'OtaUpdateSetDomainCommand': return accessor(index, new OtaUpdateSetDomainCommand())! as OtaUpdateSetDomainCommand; + case 'OtaUpdateSetUpdateChannelCommand': return accessor(index, new OtaUpdateSetUpdateChannelCommand())! as OtaUpdateSetUpdateChannelCommand; + case 'OtaUpdateSetCheckIntervalCommand': return accessor(index, new OtaUpdateSetCheckIntervalCommand())! as OtaUpdateSetCheckIntervalCommand; + case 'OtaUpdateSetAllowBackendManagementCommand': return accessor(index, new OtaUpdateSetAllowBackendManagementCommand())! as OtaUpdateSetAllowBackendManagementCommand; + case 'OtaUpdateSetRequireManualApprovalCommand': return accessor(index, new OtaUpdateSetRequireManualApprovalCommand())! as OtaUpdateSetRequireManualApprovalCommand; + case 'OtaUpdateHandleUpdateRequestCommand': return accessor(index, new OtaUpdateHandleUpdateRequestCommand())! as OtaUpdateHandleUpdateRequestCommand; + case 'OtaUpdateCheckForUpdatesCommand': return accessor(index, new OtaUpdateCheckForUpdatesCommand())! as OtaUpdateCheckForUpdatesCommand; + case 'OtaUpdateStartUpdateCommand': return accessor(index, new OtaUpdateStartUpdateCommand())! as OtaUpdateStartUpdateCommand; + case 'AccountLinkCommand': return accessor(index, new AccountLinkCommand())! as AccountLinkCommand; + case 'AccountUnlinkCommand': return accessor(index, new AccountUnlinkCommand())! as AccountUnlinkCommand; + case 'SetRfTxPinCommand': return accessor(index, new SetRfTxPinCommand())! as SetRfTxPinCommand; + default: return null; + } +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message.ts index b09eeb42..91a2a4a8 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/local-to-device-message.ts @@ -1,69 +1,69 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { LocalToDeviceMessagePayload, unionToLocalToDeviceMessagePayload, unionListToLocalToDeviceMessagePayload } from '../../../open-shock/serialization/local/local-to-device-message-payload'; - - -export class LocalToDeviceMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):LocalToDeviceMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsLocalToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:LocalToDeviceMessage):LocalToDeviceMessage { - return (obj || new LocalToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsLocalToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:LocalToDeviceMessage):LocalToDeviceMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new LocalToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -payloadType():LocalToDeviceMessagePayload { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : LocalToDeviceMessagePayload.NONE; -} - -payload(obj:any):any|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; -} - -static startLocalToDeviceMessage(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addPayloadType(builder:flatbuffers.Builder, payloadType:LocalToDeviceMessagePayload) { - builder.addFieldInt8(0, payloadType, LocalToDeviceMessagePayload.NONE); -} - -static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, payloadOffset, 0); -} - -static endLocalToDeviceMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static finishLocalToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset); -} - -static finishSizePrefixedLocalToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset, undefined, true); -} - -static createLocalToDeviceMessage(builder:flatbuffers.Builder, payloadType:LocalToDeviceMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { - LocalToDeviceMessage.startLocalToDeviceMessage(builder); - LocalToDeviceMessage.addPayloadType(builder, payloadType); - LocalToDeviceMessage.addPayload(builder, payloadOffset); - return LocalToDeviceMessage.endLocalToDeviceMessage(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { LocalToDeviceMessagePayload, unionToLocalToDeviceMessagePayload, unionListToLocalToDeviceMessagePayload } from '../../../open-shock/serialization/local/local-to-device-message-payload'; + + +export class LocalToDeviceMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):LocalToDeviceMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsLocalToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:LocalToDeviceMessage):LocalToDeviceMessage { + return (obj || new LocalToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsLocalToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:LocalToDeviceMessage):LocalToDeviceMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new LocalToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +payloadType():LocalToDeviceMessagePayload { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : LocalToDeviceMessagePayload.NONE; +} + +payload(obj:any):any|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; +} + +static startLocalToDeviceMessage(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addPayloadType(builder:flatbuffers.Builder, payloadType:LocalToDeviceMessagePayload) { + builder.addFieldInt8(0, payloadType, LocalToDeviceMessagePayload.NONE); +} + +static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, payloadOffset, 0); +} + +static endLocalToDeviceMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static finishLocalToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset); +} + +static finishSizePrefixedLocalToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { + builder.finish(offset, undefined, true); +} + +static createLocalToDeviceMessage(builder:flatbuffers.Builder, payloadType:LocalToDeviceMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { + LocalToDeviceMessage.startLocalToDeviceMessage(builder); + LocalToDeviceMessage.addPayloadType(builder, payloadType); + LocalToDeviceMessage.addPayload(builder, payloadOffset); + return LocalToDeviceMessage.endLocalToDeviceMessage(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-check-for-updates-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-check-for-updates-command.ts new file mode 100644 index 00000000..d44738a4 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-check-for-updates-command.ts @@ -0,0 +1,50 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateCheckForUpdatesCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateCheckForUpdatesCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaUpdateCheckForUpdatesCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateCheckForUpdatesCommand):OtaUpdateCheckForUpdatesCommand { + return (obj || new OtaUpdateCheckForUpdatesCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaUpdateCheckForUpdatesCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateCheckForUpdatesCommand):OtaUpdateCheckForUpdatesCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaUpdateCheckForUpdatesCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +channel():string|null +channel(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +channel(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startOtaUpdateCheckForUpdatesCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addChannel(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, channelOffset, 0); +} + +static endOtaUpdateCheckForUpdatesCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaUpdateCheckForUpdatesCommand(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset):flatbuffers.Offset { + OtaUpdateCheckForUpdatesCommand.startOtaUpdateCheckForUpdatesCommand(builder); + OtaUpdateCheckForUpdatesCommand.addChannel(builder, channelOffset); + return OtaUpdateCheckForUpdatesCommand.endOtaUpdateCheckForUpdatesCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-handle-update-request-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-handle-update-request-command.ts new file mode 100644 index 00000000..82e5cd43 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-handle-update-request-command.ts @@ -0,0 +1,30 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateHandleUpdateRequestCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateHandleUpdateRequestCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +accept():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createOtaUpdateHandleUpdateRequestCommand(builder:flatbuffers.Builder, accept: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(accept))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-allow-backend-management-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-allow-backend-management-command.ts new file mode 100644 index 00000000..239cb149 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-allow-backend-management-command.ts @@ -0,0 +1,30 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetAllowBackendManagementCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetAllowBackendManagementCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +allow():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createOtaUpdateSetAllowBackendManagementCommand(builder:flatbuffers.Builder, allow: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(allow))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-check-interval-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-check-interval-command.ts new file mode 100644 index 00000000..b7c57545 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-check-interval-command.ts @@ -0,0 +1,30 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetCheckIntervalCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetCheckIntervalCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +interval():number { + return this.bb!.readUint16(this.bb_pos); +} + +static sizeOf():number { + return 2; +} + +static createOtaUpdateSetCheckIntervalCommand(builder:flatbuffers.Builder, interval: number):flatbuffers.Offset { + builder.prep(2, 2); + builder.writeInt16(interval); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-domain-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-domain-command.ts new file mode 100644 index 00000000..f4475a98 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-domain-command.ts @@ -0,0 +1,50 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetDomainCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetDomainCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaUpdateSetDomainCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateSetDomainCommand):OtaUpdateSetDomainCommand { + return (obj || new OtaUpdateSetDomainCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaUpdateSetDomainCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateSetDomainCommand):OtaUpdateSetDomainCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaUpdateSetDomainCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +domain():string|null +domain(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +domain(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startOtaUpdateSetDomainCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addDomain(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, domainOffset, 0); +} + +static endOtaUpdateSetDomainCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaUpdateSetDomainCommand(builder:flatbuffers.Builder, domainOffset:flatbuffers.Offset):flatbuffers.Offset { + OtaUpdateSetDomainCommand.startOtaUpdateSetDomainCommand(builder); + OtaUpdateSetDomainCommand.addDomain(builder, domainOffset); + return OtaUpdateSetDomainCommand.endOtaUpdateSetDomainCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-is-enabled-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-is-enabled-command.ts new file mode 100644 index 00000000..eccce2ea --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-is-enabled-command.ts @@ -0,0 +1,30 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetIsEnabledCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetIsEnabledCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +enabled():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createOtaUpdateSetIsEnabledCommand(builder:flatbuffers.Builder, enabled: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(enabled))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-require-manual-approval-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-require-manual-approval-command.ts new file mode 100644 index 00000000..4df4af6a --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-require-manual-approval-command.ts @@ -0,0 +1,30 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetRequireManualApprovalCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetRequireManualApprovalCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +require():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createOtaUpdateSetRequireManualApprovalCommand(builder:flatbuffers.Builder, require: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(require))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-update-channel-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-update-channel-command.ts new file mode 100644 index 00000000..039aa734 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-set-update-channel-command.ts @@ -0,0 +1,50 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateSetUpdateChannelCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateSetUpdateChannelCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaUpdateSetUpdateChannelCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateSetUpdateChannelCommand):OtaUpdateSetUpdateChannelCommand { + return (obj || new OtaUpdateSetUpdateChannelCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaUpdateSetUpdateChannelCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateSetUpdateChannelCommand):OtaUpdateSetUpdateChannelCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaUpdateSetUpdateChannelCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +channel():string|null +channel(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +channel(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startOtaUpdateSetUpdateChannelCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addChannel(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, channelOffset, 0); +} + +static endOtaUpdateSetUpdateChannelCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaUpdateSetUpdateChannelCommand(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset):flatbuffers.Offset { + OtaUpdateSetUpdateChannelCommand.startOtaUpdateSetUpdateChannelCommand(builder); + OtaUpdateSetUpdateChannelCommand.addChannel(builder, channelOffset); + return OtaUpdateSetUpdateChannelCommand.endOtaUpdateSetUpdateChannelCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-start-update-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-start-update-command.ts new file mode 100644 index 00000000..447711ec --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ota-update-start-update-command.ts @@ -0,0 +1,62 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class OtaUpdateStartUpdateCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):OtaUpdateStartUpdateCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsOtaUpdateStartUpdateCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateStartUpdateCommand):OtaUpdateStartUpdateCommand { + return (obj || new OtaUpdateStartUpdateCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsOtaUpdateStartUpdateCommand(bb:flatbuffers.ByteBuffer, obj?:OtaUpdateStartUpdateCommand):OtaUpdateStartUpdateCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new OtaUpdateStartUpdateCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +channel():string|null +channel(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +channel(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +version():string|null +version(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +version(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startOtaUpdateStartUpdateCommand(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addChannel(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, channelOffset, 0); +} + +static addVersion(builder:flatbuffers.Builder, versionOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, versionOffset, 0); +} + +static endOtaUpdateStartUpdateCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createOtaUpdateStartUpdateCommand(builder:flatbuffers.Builder, channelOffset:flatbuffers.Offset, versionOffset:flatbuffers.Offset):flatbuffers.Offset { + OtaUpdateStartUpdateCommand.startOtaUpdateStartUpdateCommand(builder); + OtaUpdateStartUpdateCommand.addChannel(builder, channelOffset); + OtaUpdateStartUpdateCommand.addVersion(builder, versionOffset); + return OtaUpdateStartUpdateCommand.endOtaUpdateStartUpdateCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/ready-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/ready-message.ts index 341ea14f..a4402724 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/ready-message.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/ready-message.ts @@ -1,74 +1,74 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { Config } from '../../../open-shock/serialization/configuration/config'; -import { WifiNetwork } from '../../../open-shock/serialization/types/wifi-network'; - - -export class ReadyMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):ReadyMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsReadyMessage(bb:flatbuffers.ByteBuffer, obj?:ReadyMessage):ReadyMessage { - return (obj || new ReadyMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsReadyMessage(bb:flatbuffers.ByteBuffer, obj?:ReadyMessage):ReadyMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new ReadyMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -poggies():boolean { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -connectedWifi(obj?:WifiNetwork):WifiNetwork|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -accountLinked():boolean { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -config(obj?:Config):Config|null { - const offset = this.bb!.__offset(this.bb_pos, 10); - return offset ? (obj || new Config()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -static startReadyMessage(builder:flatbuffers.Builder) { - builder.startObject(4); -} - -static addPoggies(builder:flatbuffers.Builder, poggies:boolean) { - builder.addFieldInt8(0, +poggies, +false); -} - -static addConnectedWifi(builder:flatbuffers.Builder, connectedWifiOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, connectedWifiOffset, 0); -} - -static addAccountLinked(builder:flatbuffers.Builder, accountLinked:boolean) { - builder.addFieldInt8(2, +accountLinked, +false); -} - -static addConfig(builder:flatbuffers.Builder, configOffset:flatbuffers.Offset) { - builder.addFieldOffset(3, configOffset, 0); -} - -static endReadyMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { Config } from '../../../open-shock/serialization/configuration/config'; +import { WifiNetwork } from '../../../open-shock/serialization/types/wifi-network'; + + +export class ReadyMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):ReadyMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsReadyMessage(bb:flatbuffers.ByteBuffer, obj?:ReadyMessage):ReadyMessage { + return (obj || new ReadyMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsReadyMessage(bb:flatbuffers.ByteBuffer, obj?:ReadyMessage):ReadyMessage { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new ReadyMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +poggies():boolean { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +connectedWifi(obj?:WifiNetwork):WifiNetwork|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +accountLinked():boolean { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +config(obj?:Config):Config|null { + const offset = this.bb!.__offset(this.bb_pos, 10); + return offset ? (obj || new Config()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +static startReadyMessage(builder:flatbuffers.Builder) { + builder.startObject(4); +} + +static addPoggies(builder:flatbuffers.Builder, poggies:boolean) { + builder.addFieldInt8(0, +poggies, +false); +} + +static addConnectedWifi(builder:flatbuffers.Builder, connectedWifiOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, connectedWifiOffset, 0); +} + +static addAccountLinked(builder:flatbuffers.Builder, accountLinked:boolean) { + builder.addFieldInt8(2, +accountLinked, +false); +} + +static addConfig(builder:flatbuffers.Builder, configOffset:flatbuffers.Offset) { + builder.addFieldOffset(3, configOffset, 0); +} + +static endReadyMessage(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-pin-result-code.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-pin-result-code.ts index a53d0fa3..4e608b12 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-pin-result-code.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-pin-result-code.ts @@ -1,9 +1,9 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum SetRfPinResultCode { - Success = 0, - InvalidPin = 1, - InternalError = 2 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum SetRfPinResultCode { + Success = 0, + InvalidPin = 1, + InternalError = 2 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command-result.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command-result.ts index 83e885de..94ea4a2a 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command-result.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command-result.ts @@ -1,38 +1,38 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { SetRfPinResultCode } from '../../../open-shock/serialization/local/set-rf-pin-result-code'; - - -export class SetRfTxPinCommandResult { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):SetRfTxPinCommandResult { - this.bb_pos = i; - this.bb = bb; - return this; -} - -pin():number { - return this.bb!.readUint8(this.bb_pos); -} - -result():SetRfPinResultCode { - return this.bb!.readUint8(this.bb_pos + 1); -} - -static sizeOf():number { - return 2; -} - -static createSetRfTxPinCommandResult(builder:flatbuffers.Builder, pin: number, result: SetRfPinResultCode):flatbuffers.Offset { - builder.prep(1, 2); - builder.writeInt8(result); - builder.writeInt8(pin); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { SetRfPinResultCode } from '../../../open-shock/serialization/local/set-rf-pin-result-code'; + + +export class SetRfTxPinCommandResult { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):SetRfTxPinCommandResult { + this.bb_pos = i; + this.bb = bb; + return this; +} + +pin():number { + return this.bb!.readUint8(this.bb_pos); +} + +result():SetRfPinResultCode { + return this.bb!.readUint8(this.bb_pos + 1); +} + +static sizeOf():number { + return 2; +} + +static createSetRfTxPinCommandResult(builder:flatbuffers.Builder, pin: number, result: SetRfPinResultCode):flatbuffers.Offset { + builder.prep(1, 2); + builder.writeInt8(result); + builder.writeInt8(pin); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command.ts index c26a396e..7d1e9892 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class SetRfTxPinCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):SetRfTxPinCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -pin():number { - return this.bb!.readUint8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createSetRfTxPinCommand(builder:flatbuffers.Builder, pin: number):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(pin); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class SetRfTxPinCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):SetRfTxPinCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +pin():number { + return this.bb!.readUint8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createSetRfTxPinCommand(builder:flatbuffers.Builder, pin: number):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(pin); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-got-ip-event.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-got-ip-event.ts index ae6296b0..bc8dc682 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-got-ip-event.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-got-ip-event.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiGotIpEvent { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiGotIpEvent { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiGotIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiGotIpEvent):WifiGotIpEvent { - return (obj || new WifiGotIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiGotIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiGotIpEvent):WifiGotIpEvent { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiGotIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ip():string|null -ip(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ip(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startWifiGotIpEvent(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addIp(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ipOffset, 0); -} - -static endWifiGotIpEvent(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiGotIpEvent(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset):flatbuffers.Offset { - WifiGotIpEvent.startWifiGotIpEvent(builder); - WifiGotIpEvent.addIp(builder, ipOffset); - return WifiGotIpEvent.endWifiGotIpEvent(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiGotIpEvent { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiGotIpEvent { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiGotIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiGotIpEvent):WifiGotIpEvent { + return (obj || new WifiGotIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiGotIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiGotIpEvent):WifiGotIpEvent { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiGotIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ip():string|null +ip(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ip(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startWifiGotIpEvent(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addIp(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ipOffset, 0); +} + +static endWifiGotIpEvent(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiGotIpEvent(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset):flatbuffers.Offset { + WifiGotIpEvent.startWifiGotIpEvent(builder); + WifiGotIpEvent.addIp(builder, ipOffset); + return WifiGotIpEvent.endWifiGotIpEvent(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-lost-ip-event.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-lost-ip-event.ts index 554ddf4a..a6309328 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-lost-ip-event.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-lost-ip-event.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiLostIpEvent { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiLostIpEvent { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiLostIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiLostIpEvent):WifiLostIpEvent { - return (obj || new WifiLostIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiLostIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiLostIpEvent):WifiLostIpEvent { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiLostIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ip():string|null -ip(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ip(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startWifiLostIpEvent(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addIp(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ipOffset, 0); -} - -static endWifiLostIpEvent(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiLostIpEvent(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset):flatbuffers.Offset { - WifiLostIpEvent.startWifiLostIpEvent(builder); - WifiLostIpEvent.addIp(builder, ipOffset); - return WifiLostIpEvent.endWifiLostIpEvent(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiLostIpEvent { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiLostIpEvent { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiLostIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiLostIpEvent):WifiLostIpEvent { + return (obj || new WifiLostIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiLostIpEvent(bb:flatbuffers.ByteBuffer, obj?:WifiLostIpEvent):WifiLostIpEvent { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiLostIpEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ip():string|null +ip(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ip(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startWifiLostIpEvent(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addIp(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ipOffset, 0); +} + +static endWifiLostIpEvent(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiLostIpEvent(builder:flatbuffers.Builder, ipOffset:flatbuffers.Offset):flatbuffers.Offset { + WifiLostIpEvent.startWifiLostIpEvent(builder); + WifiLostIpEvent.addIp(builder, ipOffset); + return WifiLostIpEvent.endWifiLostIpEvent(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-connect-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-connect-command.ts index 37cc5df2..45a66c20 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-connect-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-connect-command.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiNetworkConnectCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkConnectCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiNetworkConnectCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkConnectCommand):WifiNetworkConnectCommand { - return (obj || new WifiNetworkConnectCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiNetworkConnectCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkConnectCommand):WifiNetworkConnectCommand { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiNetworkConnectCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ssid():string|null -ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startWifiNetworkConnectCommand(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ssidOffset, 0); -} - -static endWifiNetworkConnectCommand(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiNetworkConnectCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset):flatbuffers.Offset { - WifiNetworkConnectCommand.startWifiNetworkConnectCommand(builder); - WifiNetworkConnectCommand.addSsid(builder, ssidOffset); - return WifiNetworkConnectCommand.endWifiNetworkConnectCommand(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiNetworkConnectCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkConnectCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiNetworkConnectCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkConnectCommand):WifiNetworkConnectCommand { + return (obj || new WifiNetworkConnectCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiNetworkConnectCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkConnectCommand):WifiNetworkConnectCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiNetworkConnectCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ssid():string|null +ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startWifiNetworkConnectCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ssidOffset, 0); +} + +static endWifiNetworkConnectCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiNetworkConnectCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset):flatbuffers.Offset { + WifiNetworkConnectCommand.startWifiNetworkConnectCommand(builder); + WifiNetworkConnectCommand.addSsid(builder, ssidOffset); + return WifiNetworkConnectCommand.endWifiNetworkConnectCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-disconnect-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-disconnect-command.ts index 0d5851ed..563b9e98 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-disconnect-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-disconnect-command.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiNetworkDisconnectCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkDisconnectCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -placeholder():boolean { - return !!this.bb!.readInt8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createWifiNetworkDisconnectCommand(builder:flatbuffers.Builder, placeholder: boolean):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(Number(Boolean(placeholder))); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiNetworkDisconnectCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkDisconnectCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +placeholder():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createWifiNetworkDisconnectCommand(builder:flatbuffers.Builder, placeholder: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(placeholder))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts index 0d4b09ec..9e8d48e6 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts @@ -1,56 +1,56 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { WifiNetwork } from '../../../open-shock/serialization/types/wifi-network'; -import { WifiNetworkEventType } from '../../../open-shock/serialization/types/wifi-network-event-type'; - - -export class WifiNetworkEvent { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkEvent { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiNetworkEvent(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkEvent):WifiNetworkEvent { - return (obj || new WifiNetworkEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiNetworkEvent(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkEvent):WifiNetworkEvent { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiNetworkEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -eventType():WifiNetworkEventType { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : WifiNetworkEventType.Discovered; -} - -network(obj?:WifiNetwork):WifiNetwork|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; -} - -static startWifiNetworkEvent(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addEventType(builder:flatbuffers.Builder, eventType:WifiNetworkEventType) { - builder.addFieldInt8(0, eventType, WifiNetworkEventType.Discovered); -} - -static addNetwork(builder:flatbuffers.Builder, networkOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, networkOffset, 0); -} - -static endWifiNetworkEvent(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { WifiNetwork } from '../../../open-shock/serialization/types/wifi-network'; +import { WifiNetworkEventType } from '../../../open-shock/serialization/types/wifi-network-event-type'; + + +export class WifiNetworkEvent { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkEvent { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiNetworkEvent(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkEvent):WifiNetworkEvent { + return (obj || new WifiNetworkEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiNetworkEvent(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkEvent):WifiNetworkEvent { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiNetworkEvent()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +eventType():WifiNetworkEventType { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : WifiNetworkEventType.Discovered; +} + +network(obj?:WifiNetwork):WifiNetwork|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; +} + +static startWifiNetworkEvent(builder:flatbuffers.Builder) { + builder.startObject(2); +} + +static addEventType(builder:flatbuffers.Builder, eventType:WifiNetworkEventType) { + builder.addFieldInt8(0, eventType, WifiNetworkEventType.Discovered); +} + +static addNetwork(builder:flatbuffers.Builder, networkOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, networkOffset, 0); +} + +static endWifiNetworkEvent(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-forget-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-forget-command.ts index 5eb7a4e2..b8bd4bf9 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-forget-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-forget-command.ts @@ -1,50 +1,50 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiNetworkForgetCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkForgetCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiNetworkForgetCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkForgetCommand):WifiNetworkForgetCommand { - return (obj || new WifiNetworkForgetCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiNetworkForgetCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkForgetCommand):WifiNetworkForgetCommand { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiNetworkForgetCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ssid():string|null -ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -static startWifiNetworkForgetCommand(builder:flatbuffers.Builder) { - builder.startObject(1); -} - -static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ssidOffset, 0); -} - -static endWifiNetworkForgetCommand(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiNetworkForgetCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset):flatbuffers.Offset { - WifiNetworkForgetCommand.startWifiNetworkForgetCommand(builder); - WifiNetworkForgetCommand.addSsid(builder, ssidOffset); - return WifiNetworkForgetCommand.endWifiNetworkForgetCommand(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiNetworkForgetCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkForgetCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiNetworkForgetCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkForgetCommand):WifiNetworkForgetCommand { + return (obj || new WifiNetworkForgetCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiNetworkForgetCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkForgetCommand):WifiNetworkForgetCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiNetworkForgetCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ssid():string|null +ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startWifiNetworkForgetCommand(builder:flatbuffers.Builder) { + builder.startObject(1); +} + +static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ssidOffset, 0); +} + +static endWifiNetworkForgetCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiNetworkForgetCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset):flatbuffers.Offset { + WifiNetworkForgetCommand.startWifiNetworkForgetCommand(builder); + WifiNetworkForgetCommand.addSsid(builder, ssidOffset); + return WifiNetworkForgetCommand.endWifiNetworkForgetCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-save-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-save-command.ts index 91974435..1742227b 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-save-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-save-command.ts @@ -1,72 +1,72 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiNetworkSaveCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkSaveCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiNetworkSaveCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkSaveCommand):WifiNetworkSaveCommand { - return (obj || new WifiNetworkSaveCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiNetworkSaveCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkSaveCommand):WifiNetworkSaveCommand { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiNetworkSaveCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ssid():string|null -ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -password():string|null -password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -password(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -connect():boolean { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -static startWifiNetworkSaveCommand(builder:flatbuffers.Builder) { - builder.startObject(3); -} - -static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ssidOffset, 0); -} - -static addPassword(builder:flatbuffers.Builder, passwordOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, passwordOffset, 0); -} - -static addConnect(builder:flatbuffers.Builder, connect:boolean) { - builder.addFieldInt8(2, +connect, +false); -} - -static endWifiNetworkSaveCommand(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiNetworkSaveCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset, passwordOffset:flatbuffers.Offset, connect:boolean):flatbuffers.Offset { - WifiNetworkSaveCommand.startWifiNetworkSaveCommand(builder); - WifiNetworkSaveCommand.addSsid(builder, ssidOffset); - WifiNetworkSaveCommand.addPassword(builder, passwordOffset); - WifiNetworkSaveCommand.addConnect(builder, connect); - return WifiNetworkSaveCommand.endWifiNetworkSaveCommand(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiNetworkSaveCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetworkSaveCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiNetworkSaveCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkSaveCommand):WifiNetworkSaveCommand { + return (obj || new WifiNetworkSaveCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiNetworkSaveCommand(bb:flatbuffers.ByteBuffer, obj?:WifiNetworkSaveCommand):WifiNetworkSaveCommand { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiNetworkSaveCommand()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ssid():string|null +ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +password():string|null +password(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +password(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +connect():boolean { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +static startWifiNetworkSaveCommand(builder:flatbuffers.Builder) { + builder.startObject(3); +} + +static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ssidOffset, 0); +} + +static addPassword(builder:flatbuffers.Builder, passwordOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, passwordOffset, 0); +} + +static addConnect(builder:flatbuffers.Builder, connect:boolean) { + builder.addFieldInt8(2, +connect, +false); +} + +static endWifiNetworkSaveCommand(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiNetworkSaveCommand(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset, passwordOffset:flatbuffers.Offset, connect:boolean):flatbuffers.Offset { + WifiNetworkSaveCommand.startWifiNetworkSaveCommand(builder); + WifiNetworkSaveCommand.addSsid(builder, ssidOffset); + WifiNetworkSaveCommand.addPassword(builder, passwordOffset); + WifiNetworkSaveCommand.addConnect(builder, connect); + return WifiNetworkSaveCommand.endWifiNetworkSaveCommand(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-command.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-command.ts index 3f0df388..ab5b0b95 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-command.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-command.ts @@ -1,30 +1,30 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -export class WifiScanCommand { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiScanCommand { - this.bb_pos = i; - this.bb = bb; - return this; -} - -run():boolean { - return !!this.bb!.readInt8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createWifiScanCommand(builder:flatbuffers.Builder, run: boolean):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(Number(Boolean(run))); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class WifiScanCommand { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiScanCommand { + this.bb_pos = i; + this.bb = bb; + return this; +} + +run():boolean { + return !!this.bb!.readInt8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createWifiScanCommand(builder:flatbuffers.Builder, run: boolean):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(Number(Boolean(run))); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-status-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-status-message.ts index 24c751d3..38547d89 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-status-message.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-scan-status-message.ts @@ -1,33 +1,33 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { WifiScanStatus } from '../../../open-shock/serialization/types/wifi-scan-status'; - - -export class WifiScanStatusMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiScanStatusMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -status():WifiScanStatus { - return this.bb!.readUint8(this.bb_pos); -} - -static sizeOf():number { - return 1; -} - -static createWifiScanStatusMessage(builder:flatbuffers.Builder, status: WifiScanStatus):flatbuffers.Offset { - builder.prep(1, 1); - builder.writeInt8(status); - return builder.offset(); -} - -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { WifiScanStatus } from '../../../open-shock/serialization/types/wifi-scan-status'; + + +export class WifiScanStatusMessage { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiScanStatusMessage { + this.bb_pos = i; + this.bb = bb; + return this; +} + +status():WifiScanStatus { + return this.bb!.readUint8(this.bb_pos); +} + +static sizeOf():number { + return 1; +} + +static createWifiScanStatusMessage(builder:flatbuffers.Builder, status: WifiScanStatus):flatbuffers.Offset { + builder.prep(1, 1); + builder.writeInt8(status); + return builder.offset(); +} + +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message-payload.ts b/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message-payload.ts deleted file mode 100644 index 03eca41f..00000000 --- a/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message-payload.ts +++ /dev/null @@ -1,38 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import { CaptivePortalConfig } from '../../open-shock/serialization/captive-portal-config'; -import { ShockerCommandList } from '../../open-shock/serialization/shocker-command-list'; - - -export enum ServerToDeviceMessagePayload { - NONE = 0, - ShockerCommandList = 1, - CaptivePortalConfig = 2 -} - -export function unionToServerToDeviceMessagePayload( - type: ServerToDeviceMessagePayload, - accessor: (obj:CaptivePortalConfig|ShockerCommandList) => CaptivePortalConfig|ShockerCommandList|null -): CaptivePortalConfig|ShockerCommandList|null { - switch(ServerToDeviceMessagePayload[type]) { - case 'NONE': return null; - case 'ShockerCommandList': return accessor(new ShockerCommandList())! as ShockerCommandList; - case 'CaptivePortalConfig': return accessor(new CaptivePortalConfig())! as CaptivePortalConfig; - default: return null; - } -} - -export function unionListToServerToDeviceMessagePayload( - type: ServerToDeviceMessagePayload, - accessor: (index: number, obj:CaptivePortalConfig|ShockerCommandList) => CaptivePortalConfig|ShockerCommandList|null, - index: number -): CaptivePortalConfig|ShockerCommandList|null { - switch(ServerToDeviceMessagePayload[type]) { - case 'NONE': return null; - case 'ShockerCommandList': return accessor(index, new ShockerCommandList())! as ShockerCommandList; - case 'CaptivePortalConfig': return accessor(index, new CaptivePortalConfig())! as CaptivePortalConfig; - default: return null; - } -} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message.ts b/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message.ts deleted file mode 100644 index 3eee79a6..00000000 --- a/frontend/src/lib/_fbs/open-shock/serialization/server-to-device-message.ts +++ /dev/null @@ -1,69 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { ServerToDeviceMessagePayload, unionToServerToDeviceMessagePayload, unionListToServerToDeviceMessagePayload } from '../../open-shock/serialization/server-to-device-message-payload'; - - -export class ServerToDeviceMessage { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):ServerToDeviceMessage { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsServerToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:ServerToDeviceMessage):ServerToDeviceMessage { - return (obj || new ServerToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsServerToDeviceMessage(bb:flatbuffers.ByteBuffer, obj?:ServerToDeviceMessage):ServerToDeviceMessage { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new ServerToDeviceMessage()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -payloadType():ServerToDeviceMessagePayload { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : ServerToDeviceMessagePayload.NONE; -} - -payload(obj:any):any|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; -} - -static startServerToDeviceMessage(builder:flatbuffers.Builder) { - builder.startObject(2); -} - -static addPayloadType(builder:flatbuffers.Builder, payloadType:ServerToDeviceMessagePayload) { - builder.addFieldInt8(0, payloadType, ServerToDeviceMessagePayload.NONE); -} - -static addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, payloadOffset, 0); -} - -static endServerToDeviceMessage(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static finishServerToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset); -} - -static finishSizePrefixedServerToDeviceMessageBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) { - builder.finish(offset, undefined, true); -} - -static createServerToDeviceMessage(builder:flatbuffers.Builder, payloadType:ServerToDeviceMessagePayload, payloadOffset:flatbuffers.Offset):flatbuffers.Offset { - ServerToDeviceMessage.startServerToDeviceMessage(builder); - ServerToDeviceMessage.addPayloadType(builder, payloadType); - ServerToDeviceMessage.addPayload(builder, payloadOffset); - return ServerToDeviceMessage.endServerToDeviceMessage(builder); -} -} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types.ts b/frontend/src/lib/_fbs/open-shock/serialization/types.ts index efe53f89..6e7cf011 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types.ts @@ -1,5 +1,5 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export { WifiScanStatus } from './types/wifi-scan-status'; +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export { WifiScanStatus } from './types/wifi-scan-status'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/firmware-boot-type.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/firmware-boot-type.ts new file mode 100644 index 00000000..fea6e2a8 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/firmware-boot-type.ts @@ -0,0 +1,9 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum FirmwareBootType { + Normal = 0, + NewFirmware = 1, + Rollback = 2 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/sem-ver.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/sem-ver.ts new file mode 100644 index 00000000..f141fcb2 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/sem-ver.ts @@ -0,0 +1,92 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +export class SemVer { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):SemVer { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsSemVer(bb:flatbuffers.ByteBuffer, obj?:SemVer):SemVer { + return (obj || new SemVer()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsSemVer(bb:flatbuffers.ByteBuffer, obj?:SemVer):SemVer { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new SemVer()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +major():number { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0; +} + +minor():number { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0; +} + +patch():number { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0; +} + +prerelease():string|null +prerelease(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +prerelease(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 10); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +build():string|null +build(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +build(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 12); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +static startSemVer(builder:flatbuffers.Builder) { + builder.startObject(5); +} + +static addMajor(builder:flatbuffers.Builder, major:number) { + builder.addFieldInt16(0, major, 0); +} + +static addMinor(builder:flatbuffers.Builder, minor:number) { + builder.addFieldInt16(1, minor, 0); +} + +static addPatch(builder:flatbuffers.Builder, patch:number) { + builder.addFieldInt16(2, patch, 0); +} + +static addPrerelease(builder:flatbuffers.Builder, prereleaseOffset:flatbuffers.Offset) { + builder.addFieldOffset(3, prereleaseOffset, 0); +} + +static addBuild(builder:flatbuffers.Builder, buildOffset:flatbuffers.Offset) { + builder.addFieldOffset(4, buildOffset, 0); +} + +static endSemVer(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createSemVer(builder:flatbuffers.Builder, major:number, minor:number, patch:number, prereleaseOffset:flatbuffers.Offset, buildOffset:flatbuffers.Offset):flatbuffers.Offset { + SemVer.startSemVer(builder); + SemVer.addMajor(builder, major); + SemVer.addMinor(builder, minor); + SemVer.addPatch(builder, patch); + SemVer.addPrerelease(builder, prereleaseOffset); + SemVer.addBuild(builder, buildOffset); + return SemVer.endSemVer(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-command-type.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-command-type.ts index e911db4b..a6c77901 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-command-type.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-command-type.ts @@ -1,10 +1,10 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum ShockerCommandType { - Stop = 0, - Shock = 1, - Vibrate = 2, - Sound = 3 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum ShockerCommandType { + Stop = 0, + Shock = 1, + Vibrate = 2, + Sound = 3 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts index 5d3bca43..e41c5b9d 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/shocker-model-type.ts @@ -1,8 +1,8 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum ShockerModelType { - CaiXianlin = 0, - Petrainer = 1 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum ShockerModelType { + CaiXianlin = 0, + Petrainer = 1 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-auth-mode.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-auth-mode.ts index ce4f3f82..e048d0e3 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-auth-mode.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-auth-mode.ts @@ -1,16 +1,16 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum WifiAuthMode { - Open = 0, - WEP = 1, - WPA_PSK = 2, - WPA2_PSK = 3, - WPA_WPA2_PSK = 4, - WPA2_ENTERPRISE = 5, - WPA3_PSK = 6, - WPA2_WPA3_PSK = 7, - WAPI_PSK = 8, - UNKNOWN = 9 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum WifiAuthMode { + Open = 0, + WEP = 1, + WPA_PSK = 2, + WPA2_PSK = 3, + WPA_WPA2_PSK = 4, + WPA2_ENTERPRISE = 5, + WPA3_PSK = 6, + WPA2_WPA3_PSK = 7, + WAPI_PSK = 8, + UNKNOWN = 9 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network-event-type.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network-event-type.ts index 33a821bd..cd7b1ee0 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network-event-type.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network-event-type.ts @@ -1,13 +1,13 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum WifiNetworkEventType { - Discovered = 0, - Updated = 1, - Lost = 2, - Saved = 3, - Removed = 4, - Connected = 5, - Disconnected = 6 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum WifiNetworkEventType { + Discovered = 0, + Updated = 1, + Lost = 2, + Saved = 3, + Removed = 4, + Connected = 5, + Disconnected = 6 +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network.ts index 529fb13f..2c2a7b23 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-network.ts @@ -1,105 +1,105 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -import * as flatbuffers from 'flatbuffers'; - -import { WifiAuthMode } from '../../../open-shock/serialization/types/wifi-auth-mode'; - - -export class WifiNetwork { - bb: flatbuffers.ByteBuffer|null = null; - bb_pos = 0; - __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetwork { - this.bb_pos = i; - this.bb = bb; - return this; -} - -static getRootAsWifiNetwork(bb:flatbuffers.ByteBuffer, obj?:WifiNetwork):WifiNetwork { - return (obj || new WifiNetwork()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -static getSizePrefixedRootAsWifiNetwork(bb:flatbuffers.ByteBuffer, obj?:WifiNetwork):WifiNetwork { - bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); - return (obj || new WifiNetwork()).__init(bb.readInt32(bb.position()) + bb.position(), bb); -} - -ssid():string|null -ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -ssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 4); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -bssid():string|null -bssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null -bssid(optionalEncoding?:any):string|Uint8Array|null { - const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; -} - -channel():number { - const offset = this.bb!.__offset(this.bb_pos, 8); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; -} - -rssi():number { - const offset = this.bb!.__offset(this.bb_pos, 10); - return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0; -} - -authMode():WifiAuthMode { - const offset = this.bb!.__offset(this.bb_pos, 12); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : WifiAuthMode.Open; -} - -saved():boolean { - const offset = this.bb!.__offset(this.bb_pos, 14); - return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; -} - -static startWifiNetwork(builder:flatbuffers.Builder) { - builder.startObject(6); -} - -static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(0, ssidOffset, 0); -} - -static addBssid(builder:flatbuffers.Builder, bssidOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, bssidOffset, 0); -} - -static addChannel(builder:flatbuffers.Builder, channel:number) { - builder.addFieldInt8(2, channel, 0); -} - -static addRssi(builder:flatbuffers.Builder, rssi:number) { - builder.addFieldInt8(3, rssi, 0); -} - -static addAuthMode(builder:flatbuffers.Builder, authMode:WifiAuthMode) { - builder.addFieldInt8(4, authMode, WifiAuthMode.Open); -} - -static addSaved(builder:flatbuffers.Builder, saved:boolean) { - builder.addFieldInt8(5, +saved, +false); -} - -static endWifiNetwork(builder:flatbuffers.Builder):flatbuffers.Offset { - const offset = builder.endObject(); - return offset; -} - -static createWifiNetwork(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset, bssidOffset:flatbuffers.Offset, channel:number, rssi:number, authMode:WifiAuthMode, saved:boolean):flatbuffers.Offset { - WifiNetwork.startWifiNetwork(builder); - WifiNetwork.addSsid(builder, ssidOffset); - WifiNetwork.addBssid(builder, bssidOffset); - WifiNetwork.addChannel(builder, channel); - WifiNetwork.addRssi(builder, rssi); - WifiNetwork.addAuthMode(builder, authMode); - WifiNetwork.addSaved(builder, saved); - return WifiNetwork.endWifiNetwork(builder); -} -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +import * as flatbuffers from 'flatbuffers'; + +import { WifiAuthMode } from '../../../open-shock/serialization/types/wifi-auth-mode'; + + +export class WifiNetwork { + bb: flatbuffers.ByteBuffer|null = null; + bb_pos = 0; + __init(i:number, bb:flatbuffers.ByteBuffer):WifiNetwork { + this.bb_pos = i; + this.bb = bb; + return this; +} + +static getRootAsWifiNetwork(bb:flatbuffers.ByteBuffer, obj?:WifiNetwork):WifiNetwork { + return (obj || new WifiNetwork()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +static getSizePrefixedRootAsWifiNetwork(bb:flatbuffers.ByteBuffer, obj?:WifiNetwork):WifiNetwork { + bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH); + return (obj || new WifiNetwork()).__init(bb.readInt32(bb.position()) + bb.position(), bb); +} + +ssid():string|null +ssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +ssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +bssid():string|null +bssid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null +bssid(optionalEncoding?:any):string|Uint8Array|null { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null; +} + +channel():number { + const offset = this.bb!.__offset(this.bb_pos, 8); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0; +} + +rssi():number { + const offset = this.bb!.__offset(this.bb_pos, 10); + return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0; +} + +authMode():WifiAuthMode { + const offset = this.bb!.__offset(this.bb_pos, 12); + return offset ? this.bb!.readUint8(this.bb_pos + offset) : WifiAuthMode.Open; +} + +saved():boolean { + const offset = this.bb!.__offset(this.bb_pos, 14); + return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false; +} + +static startWifiNetwork(builder:flatbuffers.Builder) { + builder.startObject(6); +} + +static addSsid(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(0, ssidOffset, 0); +} + +static addBssid(builder:flatbuffers.Builder, bssidOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, bssidOffset, 0); +} + +static addChannel(builder:flatbuffers.Builder, channel:number) { + builder.addFieldInt8(2, channel, 0); +} + +static addRssi(builder:flatbuffers.Builder, rssi:number) { + builder.addFieldInt8(3, rssi, 0); +} + +static addAuthMode(builder:flatbuffers.Builder, authMode:WifiAuthMode) { + builder.addFieldInt8(4, authMode, WifiAuthMode.Open); +} + +static addSaved(builder:flatbuffers.Builder, saved:boolean) { + builder.addFieldInt8(5, +saved, +false); +} + +static endWifiNetwork(builder:flatbuffers.Builder):flatbuffers.Offset { + const offset = builder.endObject(); + return offset; +} + +static createWifiNetwork(builder:flatbuffers.Builder, ssidOffset:flatbuffers.Offset, bssidOffset:flatbuffers.Offset, channel:number, rssi:number, authMode:WifiAuthMode, saved:boolean):flatbuffers.Offset { + WifiNetwork.startWifiNetwork(builder); + WifiNetwork.addSsid(builder, ssidOffset); + WifiNetwork.addBssid(builder, bssidOffset); + WifiNetwork.addChannel(builder, channel); + WifiNetwork.addRssi(builder, rssi); + WifiNetwork.addAuthMode(builder, authMode); + WifiNetwork.addSaved(builder, saved); + return WifiNetwork.endWifiNetwork(builder); +} +} diff --git a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts index 29fe5e64..0037d639 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/types/wifi-scan-status.ts @@ -1,12 +1,12 @@ -// automatically generated by the FlatBuffers compiler, do not modify - -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ - -export enum WifiScanStatus { - Started = 0, - InProgress = 1, - Completed = 2, - TimedOut = 3, - Aborted = 4, - Error = 5 -} +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum WifiScanStatus { + Started = 0, + InProgress = 1, + Completed = 2, + TimedOut = 3, + Aborted = 4, + Error = 5 +} diff --git a/frontend/src/lib/mappers/ConfigMapper.ts b/frontend/src/lib/mappers/ConfigMapper.ts new file mode 100644 index 00000000..1c7a4ec8 --- /dev/null +++ b/frontend/src/lib/mappers/ConfigMapper.ts @@ -0,0 +1,180 @@ +import type { OtaUpdateChannel } from '$lib/_fbs/open-shock/serialization/configuration'; +import { Config as FbsConfig } from '$lib/_fbs/open-shock/serialization/configuration/config'; + +export interface RFConfig { + txPin: number; + keepaliveEnabled: boolean; +} + +export interface WifiCredentials { + id: number; + ssid: string; + password: string | null; +} + +export interface WifiConfig { + apSsid: string; + hostname: string; + credentials: WifiCredentials[]; +} + +export interface CaptivePortalConfig { + alwaysEnabled: boolean; +} + +export interface BackendConfig { + domain: string; + authToken: string | null; +} + +export interface SerialInputConfig { + echoEnabled: boolean; +} + +export interface OtaUpdateConfig { + isEnabled: boolean; + cdnDomain: string; + updateChannel: OtaUpdateChannel; + checkOnStartup: boolean; + checkInterval: number; + allowBackendManagement: boolean; + requireManualApproval: boolean; +} + +export interface Config { + rf: RFConfig; + wifi: WifiConfig; + captivePortal: CaptivePortalConfig; + backend: BackendConfig; + serialInput: SerialInputConfig; + otaUpdate: OtaUpdateConfig; +} + +function mapRfConfig(fbsConfig: FbsConfig): RFConfig { + const rf = fbsConfig.rf(); + if (!rf) throw new Error('fbsConfig.rf is null'); + + const txPin = rf.txPin(); + const keepaliveEnabled = rf.keepaliveEnabled(); + + if (!txPin) throw new Error('rf.txPin is null'); + + return { + txPin, + keepaliveEnabled, + }; +} + +function mapWifiConfig(fbsConfig: FbsConfig): WifiConfig { + const wifi = fbsConfig.wifi(); + if (!wifi) throw new Error('fbsConfig.wifi is null'); + + const apSsid = wifi.apSsid(); + const hostname = wifi.hostname(); + + if (!apSsid) throw new Error('wifi.apSsid is null'); + if (!hostname) throw new Error('wifi.hostname is null'); + + const credentials: WifiCredentials[] = []; + const credentialsLength = wifi.credentialsLength(); + for (let i = 0; i < credentialsLength; i++) { + const cred = wifi.credentials(i); + if (!cred) throw new Error('wifi.credentials is null'); + + const id = cred.id(); + const ssid = cred.ssid(); + const password = cred.password(); + + if (!id) throw new Error('cred.id is null'); + if (!ssid) throw new Error('cred.ssid is null'); + if (!password) throw new Error('cred.password is null'); + + credentials.push({ + id, + ssid, + password, + }); + } + + return { + apSsid, + hostname, + credentials, + }; +} + +function mapCaptivePortalConfig(fbsConfig: FbsConfig): CaptivePortalConfig { + const captivePortal = fbsConfig.captivePortal(); + if (!captivePortal) throw new Error('fbsConfig.captivePortal is null'); + + const alwaysEnabled = captivePortal.alwaysEnabled(); + + return { + alwaysEnabled, + }; +} + +function mapBackendConfig(fbsConfig: FbsConfig): BackendConfig { + const backend = fbsConfig.backend(); + if (!backend) throw new Error('fbsConfig.backend is null'); + + const domain = backend.domain(); + const authToken = backend.authToken(); + + if (!domain) throw new Error('backend.domain is null'); + + return { + domain, + authToken, + }; +} + +function mapSerialInputConfig(fbsConfig: FbsConfig): SerialInputConfig { + const serialInput = fbsConfig.serialInput(); + if (!serialInput) throw new Error('fbsConfig.serialInput is null'); + + const echoEnabled = serialInput.echoEnabled(); + + return { + echoEnabled, + }; +} + +function mapOtaUpdateConfig(fbsConfig: FbsConfig): OtaUpdateConfig { + const otaUpdate = fbsConfig.otaUpdate(); + if (!otaUpdate) throw new Error('fbsConfig.otaUpdate is null'); + + const isEnabled = otaUpdate.isEnabled(); + const cdnDomain = otaUpdate.cdnDomain(); + const updateChannel = otaUpdate.updateChannel(); + const checkOnStartup = otaUpdate.checkOnStartup(); + const checkInterval = otaUpdate.checkInterval(); + const allowBackendManagement = otaUpdate.allowBackendManagement(); + const requireManualApproval = otaUpdate.requireManualApproval(); + + if (!cdnDomain) throw new Error('otaUpdate.cdnDomain is null'); + if (!updateChannel) throw new Error('otaUpdate.updateChannel is null'); + + return { + isEnabled, + cdnDomain, + updateChannel, + checkOnStartup, + checkInterval, + allowBackendManagement, + requireManualApproval, + }; +} + +export function mapConfig(fbsConfig: FbsConfig | null): Config | null { + if (!fbsConfig) return null; + + return { + rf: mapRfConfig(fbsConfig), + wifi: mapWifiConfig(fbsConfig), + captivePortal: mapCaptivePortalConfig(fbsConfig), + backend: mapBackendConfig(fbsConfig), + serialInput: mapSerialInputConfig(fbsConfig), + otaUpdate: mapOtaUpdateConfig(fbsConfig), + }; +} diff --git a/frontend/src/lib/stores/DeviceStateStore.ts b/frontend/src/lib/stores/DeviceStateStore.ts index 6bf0fd99..6d0f7cd1 100644 --- a/frontend/src/lib/stores/DeviceStateStore.ts +++ b/frontend/src/lib/stores/DeviceStateStore.ts @@ -9,7 +9,7 @@ const { subscribe, update } = writable({ wifiNetworks: new Map(), wifiNetworkGroups: new Map(), accountLinked: false, - rfTxPin: null, + config: null, }); function insertSorted(array: T[], value: T, compare: (a: T, b: T) => number) { @@ -26,7 +26,7 @@ function insertSorted(array: T[], value: T, compare: (a: T, b: T) => number) array.splice(low, 0, value); } -function SsidMapReducer(groups: Map, [_, value]: [string, WiFiNetwork]): Map { +function SsidMapReducer(groups: Map, [, value]: [string, WiFiNetwork]): Map { const key = `${value.ssid || value.bssid}_${WifiAuthMode[value.security]}`; // Get the group for this SSID, or create a new one @@ -103,7 +103,9 @@ export const DeviceStateStore = { }, setRfTxPin(pin: number) { update((store) => { - store.rfTxPin = pin; + if (store.config) { + store.config.rf.txPin = pin; + } return store; }); }, diff --git a/frontend/src/lib/types/DeviceState.ts b/frontend/src/lib/types/DeviceState.ts index a56dd6b8..6a698394 100644 --- a/frontend/src/lib/types/DeviceState.ts +++ b/frontend/src/lib/types/DeviceState.ts @@ -1,4 +1,5 @@ import type { WifiScanStatus } from '$lib/_fbs/open-shock/serialization/types/wifi-scan-status'; +import type { Config } from '$lib/mappers/ConfigMapper'; import type { WiFiNetwork, WiFiNetworkGroup } from './'; export type DeviceState = { @@ -7,5 +8,5 @@ export type DeviceState = { wifiNetworks: Map; wifiNetworkGroups: Map; accountLinked: boolean; - rfTxPin: number | null; + config: Config | null; }; diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 9e1f7cd9..719bce77 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -19,7 +19,7 @@ let linkCode: string = ''; $: linkCodeValid = isValidLinkCode(linkCode); - let rfTxPin: number | null = $DeviceStateStore.rfTxPin; + let rfTxPin: number | null = $DeviceStateStore.config?.rf.txPin ?? null; $: rfTxPinValid = rfTxPin !== null && rfTxPin >= 0 && rfTxPin < 255; function linkAccount() { @@ -50,7 +50,7 @@

    RF TX Pin

    - (Currently {$DeviceStateStore.rfTxPin == null ? ' not set' : $DeviceStateStore.rfTxPin}) + (Currently {$DeviceStateStore.config == null ? ' not set' : $DeviceStateStore.config.rf.txPin})
    diff --git a/include/CaptivePortal.h b/include/CaptivePortal.h index f22aee21..392e996e 100644 --- a/include/CaptivePortal.h +++ b/include/CaptivePortal.h @@ -2,12 +2,16 @@ #include "StringView.h" +#include + #include namespace OpenShock::CaptivePortal { void SetAlwaysEnabled(bool alwaysEnabled); bool IsAlwaysEnabled(); + bool ForceClose(std::uint32_t timeoutMs); + bool IsRunning(); void Update(); diff --git a/include/CaptivePortalInstance.h b/include/CaptivePortalInstance.h index 5529a627..7397c579 100644 --- a/include/CaptivePortalInstance.h +++ b/include/CaptivePortalInstance.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -33,6 +34,7 @@ namespace OpenShock { AsyncWebServer m_webServer; WebSocketsServer m_socketServer; WebSocketDeFragger m_socketDeFragger; + fs::LittleFSFS m_fileSystem; DNSServer m_dnsServer; TaskHandle_t m_taskHandle; }; diff --git a/include/Constants.h b/include/Constants.h index 9c197a4d..e72a88d2 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -9,7 +9,15 @@ #define OPENSHOCK_API_BASE_URL "https://" OPENSHOCK_API_DOMAIN #endif +#ifndef OPENSHOCK_FW_CDN_DOMAIN +#error "OPENSHOCK_FW_CDN_DOMAIN must be defined" +#endif +#ifndef OPENSHOCK_FW_CDN_BASE_URL +#define OPENSHOCK_FW_CDN_BASE_URL "https://" OPENSHOCK_FW_CDN_DOMAIN +#endif + #define OPENSHOCK_API_URL(path) OPENSHOCK_API_BASE_URL path +#define OPENSHOCK_FW_CDN_URL(path) OPENSHOCK_FW_CDN_BASE_URL path #ifndef OPENSHOCK_FW_VERSION #error "OPENSHOCK_FW_VERSION must be defined" diff --git a/include/FirmwareBootType.h b/include/FirmwareBootType.h new file mode 100644 index 00000000..f9f48896 --- /dev/null +++ b/include/FirmwareBootType.h @@ -0,0 +1,29 @@ +#pragma once + +#include "serialization/_fbs/FirmwareBootType_generated.h" + +#include +#include + +namespace OpenShock { + typedef OpenShock::Serialization::Types::FirmwareBootType FirmwareBootType; + + inline bool TryParseFirmwareBootType(FirmwareBootType& bootType, const char* str) { + if (strcasecmp(str, "normal") == 0) { + bootType = FirmwareBootType::Normal; + return true; + } + + if (strcasecmp(str, "newfirmware") == 0 || strcasecmp(str, "new_firmware") == 0) { + bootType = FirmwareBootType::NewFirmware; + return true; + } + + if (strcasecmp(str, "rollback") == 0) { + bootType = FirmwareBootType::Rollback; + return true; + } + + return false; + } +} // namespace OpenShock diff --git a/include/GatewayClient.h b/include/GatewayClient.h index 1b4e2002..64c799f5 100644 --- a/include/GatewayClient.h +++ b/include/GatewayClient.h @@ -1,10 +1,12 @@ #pragma once +#include "StringView.h" + #include +#include #include #include -#include namespace OpenShock { class GatewayClient { @@ -24,10 +26,14 @@ namespace OpenShock { void connect(const char* lcgFqdn); void disconnect(); + bool sendMessageTXT(StringView data); + bool sendMessageBIN(const std::uint8_t* data, std::size_t length); + bool loop(); private: void _sendKeepAlive(); + void _sendBootStatus(); void _handleEvent(WStype_t type, std::uint8_t* payload, std::size_t length); WebSocketsClient m_webSocket; diff --git a/include/GatewayConnectionManager.h b/include/GatewayConnectionManager.h index 4205592a..8bd1a9bd 100644 --- a/include/GatewayConnectionManager.h +++ b/include/GatewayConnectionManager.h @@ -1,6 +1,7 @@ #pragma once #include "AccountLinkResultCode.h" +#include "StringView.h" #include #include @@ -14,5 +15,8 @@ namespace OpenShock::GatewayConnectionManager { AccountLinkResultCode Link(const char* linkCode); void UnLink(); + bool SendMessageTXT(StringView data); + bool SendMessageBIN(const std::uint8_t* data, std::size_t length); + void Update(); } // namespace OpenShock::GatewayConnectionManager diff --git a/include/Hashing.h b/include/Hashing.h new file mode 100644 index 00000000..15d880ed --- /dev/null +++ b/include/Hashing.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +#include + +namespace OpenShock { +struct MD5 { + MD5() { mbedtls_md5_init(&ctx); } + ~MD5() { mbedtls_md5_free(&ctx); } + + bool begin() { return mbedtls_md5_starts_ret(&ctx) == 0; } + bool update(const std::uint8_t* data, std::size_t dataLen) { return mbedtls_md5_update_ret(&ctx, data, dataLen) == 0; } + bool finish(std::array& hash) { return mbedtls_md5_finish_ret(&ctx, hash.data()) == 0; } + + mbedtls_md5_context ctx; +}; +struct SHA1 { + SHA1() { mbedtls_sha1_init(&ctx); } + ~SHA1() { mbedtls_sha1_free(&ctx); } + + bool begin() { return mbedtls_sha1_starts_ret(&ctx) == 0; } + bool update(const std::uint8_t* data, std::size_t dataLen) { return mbedtls_sha1_update_ret(&ctx, data, dataLen) == 0; } + bool finish(std::array& hash) { return mbedtls_sha1_finish_ret(&ctx, hash.data()) == 0; } + + mbedtls_sha1_context ctx; +}; +struct SHA256 { + SHA256() { mbedtls_sha256_init(&ctx); } + ~SHA256() { mbedtls_sha256_free(&ctx); } + + bool begin() { return mbedtls_sha256_starts_ret(&ctx, 0) == 0; } + bool update(const std::uint8_t* data, std::size_t dataLen) { return mbedtls_sha256_update_ret(&ctx, data, dataLen) == 0; } + bool finish(std::array& hash) { return mbedtls_sha256_finish_ret(&ctx, hash.data()) == 0; } + + mbedtls_sha256_context ctx; +}; +} // namespace OpenShock diff --git a/include/Logging.h b/include/Logging.h index aa87e3b9..422f1a7e 100644 --- a/include/Logging.h +++ b/include/Logging.h @@ -2,12 +2,22 @@ #include #include +#include +#include -#define ESP_PANIC(TAG, format, ...) \ - ESP_LOGE(TAG, "PANIC: " format ", restarting in 5 seconds...", ##__VA_ARGS__); \ - vTaskDelay(pdMS_TO_TICKS(5000)); \ - esp_restart(); +#define ESP_PANIC_PRINT(TAG, format, ...) ESP_LOGE(TAG, "PANIC: " format, ##__VA_ARGS__) -#define ESP_PANIC_INSTANT(TAG, format, ...) \ - ESP_LOGE(TAG, "PANIC: " format ", restarting now...", ##__VA_ARGS__); \ - esp_restart(); +#define ESP_PANIC(TAG, format, ...) \ + ESP_PANIC_PRINT(TAG, format ", restarting in 5 seconds...", ##__VA_ARGS__); \ + vTaskDelay(pdMS_TO_TICKS(5000)); \ + esp_restart() + +#define ESP_PANIC_OTA(TAG, format, ...) \ + ESP_PANIC_PRINT(TAG, format ", invalidating update partition and restarting in 5 seconds...", ##__VA_ARGS__); \ + vTaskDelay(pdMS_TO_TICKS(5000)); \ + esp_ota_mark_app_invalid_rollback_and_reboot(); \ + esp_restart() + +#define ESP_PANIC_INSTANT(TAG, format, ...) \ + ESP_PANIC_PRINT(TAG, format, ##__VA_ARGS__); \ + esp_restart() diff --git a/include/OtaUpdateChannel.h b/include/OtaUpdateChannel.h new file mode 100644 index 00000000..a44ef376 --- /dev/null +++ b/include/OtaUpdateChannel.h @@ -0,0 +1,29 @@ +#pragma once + +#include "serialization/_fbs/ConfigFile_generated.h" + +#include +#include + +namespace OpenShock { + typedef OpenShock::Serialization::Configuration::OtaUpdateChannel OtaUpdateChannel; + + inline bool TryParseOtaUpdateChannel(OtaUpdateChannel& channel, const char* str) { + if (strcasecmp(str, "stable") == 0) { + channel = OtaUpdateChannel::Stable; + return true; + } + + if (strcasecmp(str, "beta") == 0) { + channel = OtaUpdateChannel::Beta; + return true; + } + + if (strcasecmp(str, "develop") == 0 || strcasecmp(str, "dev") == 0) { + channel = OtaUpdateChannel::Develop; + return true; + } + + return false; + } +} // namespace OpenShock diff --git a/include/OtaUpdateManager.h b/include/OtaUpdateManager.h new file mode 100644 index 00000000..bd26434a --- /dev/null +++ b/include/OtaUpdateManager.h @@ -0,0 +1,31 @@ +#pragma once + +#include "OtaUpdateChannel.h" +#include "SemVer.h" +#include "StringView.h" + +#include +#include +#include +#include + +namespace OpenShock::OtaUpdateManager { + bool Init(); + + struct FirmwareRelease { + std::string appBinaryUrl; + std::uint8_t appBinaryHash[32]; + std::string filesystemBinaryUrl; + std::uint8_t filesystemBinaryHash[32]; + }; + + bool TryGetFirmwareVersion(OtaUpdateChannel channel, OpenShock::SemVer& version); + bool TryGetFirmwareBoards(const OpenShock::SemVer& version, std::vector& boards); + bool TryGetFirmwareRelease(const OpenShock::SemVer& version, FirmwareRelease& release); + + bool TryStartFirmwareInstallation(const OpenShock::SemVer& version); + + bool IsValidatingApp(); + void InvalidateAndRollback(); + void ValidateApp(); +} // namespace OpenShock::OtaUpdateManager diff --git a/include/SemVer.h b/include/SemVer.h index 12632e83..dad22c14 100644 --- a/include/SemVer.h +++ b/include/SemVer.h @@ -72,5 +72,5 @@ namespace OpenShock { std::string toString() const; }; - static bool TryParseSemVer(StringView str, SemVer& out); + bool TryParseSemVer(StringView str, SemVer& out); } // namespace OpenShock diff --git a/include/config/Config.h b/include/config/Config.h index bba3dcec..c3b6f2e8 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -2,6 +2,7 @@ #include "config/BackendConfig.h" #include "config/CaptivePortalConfig.h" +#include "config/OtaUpdateConfig.h" #include "config/RFConfig.h" #include "config/SerialInputConfig.h" #include "config/WiFiConfig.h" @@ -35,6 +36,7 @@ namespace OpenShock::Config { bool GetRFConfig(RFConfig& out); bool GetWiFiConfig(WiFiConfig& out); + bool GetOtaUpdateConfig(OtaUpdateConfig& out); bool GetWiFiCredentials(cJSON* array, bool withSensitiveData); bool GetWiFiCredentials(std::vector& out); @@ -62,6 +64,11 @@ namespace OpenShock::Config { bool RemoveWiFiCredentials(std::uint8_t id); bool ClearWiFiCredentials(); + bool GetOtaUpdateId(std::int32_t& out); + bool SetOtaUpdateId(std::int32_t updateId); + bool GetOtaFirmwareBootType(FirmwareBootType& out); + bool SetOtaFirmwareBootType(FirmwareBootType bootType); + bool HasBackendAuthToken(); bool GetBackendAuthToken(std::string& out); bool SetBackendAuthToken(const std::string& token); diff --git a/include/config/OtaUpdateConfig.h b/include/config/OtaUpdateConfig.h new file mode 100644 index 00000000..88e906ea --- /dev/null +++ b/include/config/OtaUpdateConfig.h @@ -0,0 +1,44 @@ +#pragma once + +#include "config/ConfigBase.h" +#include "FirmwareBootType.h" +#include "OtaUpdateChannel.h" + +#include + +namespace OpenShock::Config { + struct OtaUpdateConfig : public ConfigBase { + OtaUpdateConfig(); + OtaUpdateConfig( + bool isEnabled, + std::string cdnDomain, + OtaUpdateChannel updateChannel, + bool checkOnStartup, + bool checkPeriodically, + std::uint16_t checkInterval, + bool allowBackendManagement, + bool requireManualApproval, + std::int32_t updateId, + FirmwareBootType bootType + ); + + bool isEnabled; + std::string cdnDomain; + OtaUpdateChannel updateChannel; + bool checkOnStartup; + bool checkPeriodically; + std::uint16_t checkInterval; + bool allowBackendManagement; + bool requireManualApproval; + std::int32_t updateId; + FirmwareBootType bootType; + + void ToDefault() override; + + bool FromFlatbuffers(const Serialization::Configuration::OtaUpdateConfig* config) override; + flatbuffers::Offset ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const override; + + bool FromJSON(const cJSON* json) override; + cJSON* ToJSON(bool withSensitiveData) const override; + }; +} // namespace OpenShock::Config diff --git a/include/config/RootConfig.h b/include/config/RootConfig.h index 29d95bd5..8a23e179 100644 --- a/include/config/RootConfig.h +++ b/include/config/RootConfig.h @@ -3,6 +3,7 @@ #include "config/BackendConfig.h" #include "config/CaptivePortalConfig.h" #include "config/ConfigBase.h" +#include "config/OtaUpdateConfig.h" #include "config/RFConfig.h" #include "config/SerialInputConfig.h" #include "config/WiFiConfig.h" @@ -14,6 +15,7 @@ namespace OpenShock::Config { OpenShock::Config::CaptivePortalConfig captivePortal; OpenShock::Config::BackendConfig backend; OpenShock::Config::SerialInputConfig serialInput; + OpenShock::Config::OtaUpdateConfig otaUpdate; void ToDefault() override; diff --git a/include/config/internal/utils.h b/include/config/internal/utils.h index 850a21ef..c48d587b 100644 --- a/include/config/internal/utils.h +++ b/include/config/internal/utils.h @@ -13,6 +13,7 @@ namespace OpenShock::Config::Internal::Utils { bool FromJsonBool(bool& val, const cJSON* json, const char* name, bool defaultVal); bool FromJsonU8(std::uint8_t& val, const cJSON* json, const char* name, std::uint8_t defaultVal); bool FromJsonU16(std::uint16_t& val, const cJSON* json, const char* name, std::uint16_t defaultVal); + bool FromJsonI32(std::int32_t& val, const cJSON* json, const char* name, std::int32_t defaultVal); bool FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr); template // T inherits from ConfigBase diff --git a/include/event_handlers/impl/WSGateway.h b/include/event_handlers/impl/WSGateway.h index 9f54a8b0..cf0419fd 100644 --- a/include/event_handlers/impl/WSGateway.h +++ b/include/event_handlers/impl/WSGateway.h @@ -1,14 +1,15 @@ #pragma once -#include "serialization/_fbs/ServerToDeviceMessage_generated.h" +#include "serialization/_fbs/GatewayToDeviceMessage_generated.h" #include -#define WS_EVENT_HANDLER_SIGNATURE(NAME) void NAME(const OpenShock::Serialization::ServerToDeviceMessage* msg) +#define WS_EVENT_HANDLER_SIGNATURE(NAME) void NAME(const OpenShock::Serialization::Gateway::GatewayToDeviceMessage* msg) namespace OpenShock::MessageHandlers::Server::_Private { typedef WS_EVENT_HANDLER_SIGNATURE((*HandlerType)); WS_EVENT_HANDLER_SIGNATURE(HandleInvalidMessage); WS_EVENT_HANDLER_SIGNATURE(HandleShockerCommandList); WS_EVENT_HANDLER_SIGNATURE(HandleCaptivePortalConfig); + WS_EVENT_HANDLER_SIGNATURE(HandleOtaInstall); } // namespace OpenShock::MessageHandlers::Server::_Private diff --git a/include/serialization/WSGateway.h b/include/serialization/WSGateway.h index f5269b29..81a304c0 100644 --- a/include/serialization/WSGateway.h +++ b/include/serialization/WSGateway.h @@ -1,5 +1,16 @@ #pragma once +#include "FirmwareBootType.h" +#include "SemVer.h" #include "serialization/CallbackFn.h" +#include "StringView.h" -namespace OpenShock::Serialization::Gateway { } +#include "serialization/_fbs/DeviceToGatewayMessage_generated.h" + +namespace OpenShock::Serialization::Gateway { + bool SerializeKeepAliveMessage(Common::SerializationCallbackFn callback); + bool SerializeBootStatusMessage(std::int32_t otaUpdateId, OpenShock::FirmwareBootType bootType, const OpenShock::SemVer& version, Common::SerializationCallbackFn callback); + bool SerializeOtaInstallStartedMessage(std::int32_t updateId, const OpenShock::SemVer& version, Common::SerializationCallbackFn callback); + bool SerializeOtaInstallProgressMessage(std::int32_t updateId, Gateway::OtaInstallProgressTask task, float progress, Common::SerializationCallbackFn callback); + bool SerializeOtaInstallFailedMessage(std::int32_t updateId, StringView message, bool fatal, Common::SerializationCallbackFn callback); +} // namespace OpenShock::Serialization::Gateway diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index 06eeb171..e508be11 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -13,6 +13,8 @@ static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && FLATBUFFERS_VERSION_REVISION == 26, "Non-compatible flatbuffers version included"); +#include "FirmwareBootType_generated.h" + namespace OpenShock { namespace Serialization { namespace Configuration { @@ -35,9 +37,45 @@ struct BackendConfigBuilder; struct SerialInputConfig; struct SerialInputConfigBuilder; +struct OtaUpdateConfig; +struct OtaUpdateConfigBuilder; + struct Config; struct ConfigBuilder; +enum class OtaUpdateChannel : uint8_t { + Stable = 0, + Beta = 1, + Develop = 2, + MIN = Stable, + MAX = Develop +}; + +inline const OtaUpdateChannel (&EnumValuesOtaUpdateChannel())[3] { + static const OtaUpdateChannel values[] = { + OtaUpdateChannel::Stable, + OtaUpdateChannel::Beta, + OtaUpdateChannel::Develop + }; + return values; +} + +inline const char * const *EnumNamesOtaUpdateChannel() { + static const char * const names[4] = { + "Stable", + "Beta", + "Develop", + nullptr + }; + return names; +} + +inline const char *EnumNameOtaUpdateChannel(OtaUpdateChannel e) { + if (::flatbuffers::IsOutRange(e, OtaUpdateChannel::Stable, OtaUpdateChannel::Develop)) return ""; + const size_t index = static_cast(e); + return EnumNamesOtaUpdateChannel()[index]; +} + struct RFConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef RFConfigBuilder Builder; struct Traits; @@ -460,6 +498,184 @@ struct SerialInputConfig::Traits { static auto constexpr Create = CreateSerialInputConfig; }; +struct OtaUpdateConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaUpdateConfigBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Configuration.OtaUpdateConfig"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_IS_ENABLED = 4, + VT_CDN_DOMAIN = 6, + VT_UPDATE_CHANNEL = 8, + VT_CHECK_ON_STARTUP = 10, + VT_CHECK_PERIODICALLY = 12, + VT_CHECK_INTERVAL = 14, + VT_ALLOW_BACKEND_MANAGEMENT = 16, + VT_REQUIRE_MANUAL_APPROVAL = 18, + VT_UPDATE_ID = 20, + VT_BOOT_TYPE = 22 + }; + /// Indicates whether OTA updates are enabled. + bool is_enabled() const { + return GetField(VT_IS_ENABLED, 0) != 0; + } + /// The domain name of the OTA Content Delivery Network (CDN). + const ::flatbuffers::String *cdn_domain() const { + return GetPointer(VT_CDN_DOMAIN); + } + /// The update channel to use. + OpenShock::Serialization::Configuration::OtaUpdateChannel update_channel() const { + return static_cast(GetField(VT_UPDATE_CHANNEL, 0)); + } + /// Indicates whether to check for updates on startup. + bool check_on_startup() const { + return GetField(VT_CHECK_ON_STARTUP, 0) != 0; + } + /// Indicates whether to check for updates periodically. + bool check_periodically() const { + return GetField(VT_CHECK_PERIODICALLY, 0) != 0; + } + /// The interval in minutes between periodic update checks. + uint16_t check_interval() const { + return GetField(VT_CHECK_INTERVAL, 0); + } + /// Indicates if the backend is authorized to manage the device's update version on behalf of the user. + bool allow_backend_management() const { + return GetField(VT_ALLOW_BACKEND_MANAGEMENT, 0) != 0; + } + /// Indicates if manual approval via serial input or captive portal is required before installing updates. + bool require_manual_approval() const { + return GetField(VT_REQUIRE_MANUAL_APPROVAL, 0) != 0; + } + /// Update process ID, used to track the update process server-side across reboots. + int32_t update_id() const { + return GetField(VT_UPDATE_ID, 0); + } + /// Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) + OpenShock::Serialization::Types::FirmwareBootType boot_type() const { + return static_cast(GetField(VT_BOOT_TYPE, 0)); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_IS_ENABLED, 1) && + VerifyOffset(verifier, VT_CDN_DOMAIN) && + verifier.VerifyString(cdn_domain()) && + VerifyField(verifier, VT_UPDATE_CHANNEL, 1) && + VerifyField(verifier, VT_CHECK_ON_STARTUP, 1) && + VerifyField(verifier, VT_CHECK_PERIODICALLY, 1) && + VerifyField(verifier, VT_CHECK_INTERVAL, 2) && + VerifyField(verifier, VT_ALLOW_BACKEND_MANAGEMENT, 1) && + VerifyField(verifier, VT_REQUIRE_MANUAL_APPROVAL, 1) && + VerifyField(verifier, VT_UPDATE_ID, 4) && + VerifyField(verifier, VT_BOOT_TYPE, 1) && + verifier.EndTable(); + } +}; + +struct OtaUpdateConfigBuilder { + typedef OtaUpdateConfig Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_is_enabled(bool is_enabled) { + fbb_.AddElement(OtaUpdateConfig::VT_IS_ENABLED, static_cast(is_enabled), 0); + } + void add_cdn_domain(::flatbuffers::Offset<::flatbuffers::String> cdn_domain) { + fbb_.AddOffset(OtaUpdateConfig::VT_CDN_DOMAIN, cdn_domain); + } + void add_update_channel(OpenShock::Serialization::Configuration::OtaUpdateChannel update_channel) { + fbb_.AddElement(OtaUpdateConfig::VT_UPDATE_CHANNEL, static_cast(update_channel), 0); + } + void add_check_on_startup(bool check_on_startup) { + fbb_.AddElement(OtaUpdateConfig::VT_CHECK_ON_STARTUP, static_cast(check_on_startup), 0); + } + void add_check_periodically(bool check_periodically) { + fbb_.AddElement(OtaUpdateConfig::VT_CHECK_PERIODICALLY, static_cast(check_periodically), 0); + } + void add_check_interval(uint16_t check_interval) { + fbb_.AddElement(OtaUpdateConfig::VT_CHECK_INTERVAL, check_interval, 0); + } + void add_allow_backend_management(bool allow_backend_management) { + fbb_.AddElement(OtaUpdateConfig::VT_ALLOW_BACKEND_MANAGEMENT, static_cast(allow_backend_management), 0); + } + void add_require_manual_approval(bool require_manual_approval) { + fbb_.AddElement(OtaUpdateConfig::VT_REQUIRE_MANUAL_APPROVAL, static_cast(require_manual_approval), 0); + } + void add_update_id(int32_t update_id) { + fbb_.AddElement(OtaUpdateConfig::VT_UPDATE_ID, update_id, 0); + } + void add_boot_type(OpenShock::Serialization::Types::FirmwareBootType boot_type) { + fbb_.AddElement(OtaUpdateConfig::VT_BOOT_TYPE, static_cast(boot_type), 0); + } + explicit OtaUpdateConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaUpdateConfig( + ::flatbuffers::FlatBufferBuilder &_fbb, + bool is_enabled = false, + ::flatbuffers::Offset<::flatbuffers::String> cdn_domain = 0, + OpenShock::Serialization::Configuration::OtaUpdateChannel update_channel = OpenShock::Serialization::Configuration::OtaUpdateChannel::Stable, + bool check_on_startup = false, + bool check_periodically = false, + uint16_t check_interval = 0, + bool allow_backend_management = false, + bool require_manual_approval = false, + int32_t update_id = 0, + OpenShock::Serialization::Types::FirmwareBootType boot_type = OpenShock::Serialization::Types::FirmwareBootType::Normal) { + OtaUpdateConfigBuilder builder_(_fbb); + builder_.add_update_id(update_id); + builder_.add_cdn_domain(cdn_domain); + builder_.add_check_interval(check_interval); + builder_.add_boot_type(boot_type); + builder_.add_require_manual_approval(require_manual_approval); + builder_.add_allow_backend_management(allow_backend_management); + builder_.add_check_periodically(check_periodically); + builder_.add_check_on_startup(check_on_startup); + builder_.add_update_channel(update_channel); + builder_.add_is_enabled(is_enabled); + return builder_.Finish(); +} + +struct OtaUpdateConfig::Traits { + using type = OtaUpdateConfig; + static auto constexpr Create = CreateOtaUpdateConfig; +}; + +inline ::flatbuffers::Offset CreateOtaUpdateConfigDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + bool is_enabled = false, + const char *cdn_domain = nullptr, + OpenShock::Serialization::Configuration::OtaUpdateChannel update_channel = OpenShock::Serialization::Configuration::OtaUpdateChannel::Stable, + bool check_on_startup = false, + bool check_periodically = false, + uint16_t check_interval = 0, + bool allow_backend_management = false, + bool require_manual_approval = false, + int32_t update_id = 0, + OpenShock::Serialization::Types::FirmwareBootType boot_type = OpenShock::Serialization::Types::FirmwareBootType::Normal) { + auto cdn_domain__ = cdn_domain ? _fbb.CreateString(cdn_domain) : 0; + return OpenShock::Serialization::Configuration::CreateOtaUpdateConfig( + _fbb, + is_enabled, + cdn_domain__, + update_channel, + check_on_startup, + check_periodically, + check_interval, + allow_backend_management, + require_manual_approval, + update_id, + boot_type); +} + struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef ConfigBuilder Builder; struct Traits; @@ -471,7 +687,8 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_WIFI = 6, VT_CAPTIVE_PORTAL = 8, VT_BACKEND = 10, - VT_SERIAL_INPUT = 12 + VT_SERIAL_INPUT = 12, + VT_OTA_UPDATE = 14 }; /// RF Transmitter configuration const OpenShock::Serialization::Configuration::RFConfig *rf() const { @@ -493,6 +710,10 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { const OpenShock::Serialization::Configuration::SerialInputConfig *serial_input() const { return GetPointer(VT_SERIAL_INPUT); } + /// OTA update configuration + const OpenShock::Serialization::Configuration::OtaUpdateConfig *ota_update() const { + return GetPointer(VT_OTA_UPDATE); + } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_RF) && @@ -505,6 +726,8 @@ struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { verifier.VerifyTable(backend()) && VerifyOffset(verifier, VT_SERIAL_INPUT) && verifier.VerifyTable(serial_input()) && + VerifyOffset(verifier, VT_OTA_UPDATE) && + verifier.VerifyTable(ota_update()) && verifier.EndTable(); } }; @@ -528,6 +751,9 @@ struct ConfigBuilder { void add_serial_input(::flatbuffers::Offset serial_input) { fbb_.AddOffset(Config::VT_SERIAL_INPUT, serial_input); } + void add_ota_update(::flatbuffers::Offset ota_update) { + fbb_.AddOffset(Config::VT_OTA_UPDATE, ota_update); + } explicit ConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -545,8 +771,10 @@ inline ::flatbuffers::Offset CreateConfig( ::flatbuffers::Offset wifi = 0, ::flatbuffers::Offset captive_portal = 0, ::flatbuffers::Offset backend = 0, - ::flatbuffers::Offset serial_input = 0) { + ::flatbuffers::Offset serial_input = 0, + ::flatbuffers::Offset ota_update = 0) { ConfigBuilder builder_(_fbb); + builder_.add_ota_update(ota_update); builder_.add_serial_input(serial_input); builder_.add_backend(backend); builder_.add_captive_portal(captive_portal); diff --git a/include/serialization/_fbs/DeviceToGatewayMessage_generated.h b/include/serialization/_fbs/DeviceToGatewayMessage_generated.h new file mode 100644 index 00000000..a853d7f2 --- /dev/null +++ b/include/serialization/_fbs/DeviceToGatewayMessage_generated.h @@ -0,0 +1,636 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_DEVICETOGATEWAYMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ +#define FLATBUFFERS_GENERATED_DEVICETOGATEWAYMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ + +#include "flatbuffers/flatbuffers.h" + +// Ensure the included flatbuffers.h is the same version as when this file was +// generated, otherwise it may not be compatible. +static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && + FLATBUFFERS_VERSION_MINOR == 5 && + FLATBUFFERS_VERSION_REVISION == 26, + "Non-compatible flatbuffers version included"); + +#include "FirmwareBootType_generated.h" +#include "SemVer_generated.h" + +namespace OpenShock { +namespace Serialization { +namespace Gateway { + +struct KeepAlive; + +struct BootStatus; +struct BootStatusBuilder; + +struct OtaInstallStarted; +struct OtaInstallStartedBuilder; + +struct OtaInstallProgress; +struct OtaInstallProgressBuilder; + +struct OtaInstallFailed; +struct OtaInstallFailedBuilder; + +struct DeviceToGatewayMessage; +struct DeviceToGatewayMessageBuilder; + +enum class OtaInstallProgressTask : int8_t { + FetchingMetadata = 0, + PreparingForInstall = 1, + FlashingFilesystem = 2, + VerifyingFilesystem = 3, + FlashingApplication = 4, + MarkingApplicationBootable = 5, + Rebooting = 6, + MIN = FetchingMetadata, + MAX = Rebooting +}; + +inline const OtaInstallProgressTask (&EnumValuesOtaInstallProgressTask())[7] { + static const OtaInstallProgressTask values[] = { + OtaInstallProgressTask::FetchingMetadata, + OtaInstallProgressTask::PreparingForInstall, + OtaInstallProgressTask::FlashingFilesystem, + OtaInstallProgressTask::VerifyingFilesystem, + OtaInstallProgressTask::FlashingApplication, + OtaInstallProgressTask::MarkingApplicationBootable, + OtaInstallProgressTask::Rebooting + }; + return values; +} + +inline const char * const *EnumNamesOtaInstallProgressTask() { + static const char * const names[8] = { + "FetchingMetadata", + "PreparingForInstall", + "FlashingFilesystem", + "VerifyingFilesystem", + "FlashingApplication", + "MarkingApplicationBootable", + "Rebooting", + nullptr + }; + return names; +} + +inline const char *EnumNameOtaInstallProgressTask(OtaInstallProgressTask e) { + if (::flatbuffers::IsOutRange(e, OtaInstallProgressTask::FetchingMetadata, OtaInstallProgressTask::Rebooting)) return ""; + const size_t index = static_cast(e); + return EnumNamesOtaInstallProgressTask()[index]; +} + +enum class DeviceToGatewayMessagePayload : uint8_t { + NONE = 0, + KeepAlive = 1, + BootStatus = 2, + OtaInstallStarted = 3, + OtaInstallProgress = 4, + OtaInstallFailed = 5, + MIN = NONE, + MAX = OtaInstallFailed +}; + +inline const DeviceToGatewayMessagePayload (&EnumValuesDeviceToGatewayMessagePayload())[6] { + static const DeviceToGatewayMessagePayload values[] = { + DeviceToGatewayMessagePayload::NONE, + DeviceToGatewayMessagePayload::KeepAlive, + DeviceToGatewayMessagePayload::BootStatus, + DeviceToGatewayMessagePayload::OtaInstallStarted, + DeviceToGatewayMessagePayload::OtaInstallProgress, + DeviceToGatewayMessagePayload::OtaInstallFailed + }; + return values; +} + +inline const char * const *EnumNamesDeviceToGatewayMessagePayload() { + static const char * const names[7] = { + "NONE", + "KeepAlive", + "BootStatus", + "OtaInstallStarted", + "OtaInstallProgress", + "OtaInstallFailed", + nullptr + }; + return names; +} + +inline const char *EnumNameDeviceToGatewayMessagePayload(DeviceToGatewayMessagePayload e) { + if (::flatbuffers::IsOutRange(e, DeviceToGatewayMessagePayload::NONE, DeviceToGatewayMessagePayload::OtaInstallFailed)) return ""; + const size_t index = static_cast(e); + return EnumNamesDeviceToGatewayMessagePayload()[index]; +} + +template struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::NONE; +}; + +template<> struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::KeepAlive; +}; + +template<> struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::BootStatus; +}; + +template<> struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::OtaInstallStarted; +}; + +template<> struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::OtaInstallProgress; +}; + +template<> struct DeviceToGatewayMessagePayloadTraits { + static const DeviceToGatewayMessagePayload enum_value = DeviceToGatewayMessagePayload::OtaInstallFailed; +}; + +bool VerifyDeviceToGatewayMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, DeviceToGatewayMessagePayload type); +bool VerifyDeviceToGatewayMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types); + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) KeepAlive FLATBUFFERS_FINAL_CLASS { + private: + uint64_t uptime_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.KeepAlive"; + } + KeepAlive() + : uptime_(0) { + } + KeepAlive(uint64_t _uptime) + : uptime_(::flatbuffers::EndianScalar(_uptime)) { + } + uint64_t uptime() const { + return ::flatbuffers::EndianScalar(uptime_); + } +}; +FLATBUFFERS_STRUCT_END(KeepAlive, 8); + +struct KeepAlive::Traits { + using type = KeepAlive; +}; + +struct BootStatus FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef BootStatusBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.BootStatus"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BOOT_TYPE = 4, + VT_FIRMWARE_VERSION = 6, + VT_OTA_UPDATE_ID = 8 + }; + OpenShock::Serialization::Types::FirmwareBootType boot_type() const { + return static_cast(GetField(VT_BOOT_TYPE, 0)); + } + const OpenShock::Serialization::Types::SemVer *firmware_version() const { + return GetPointer(VT_FIRMWARE_VERSION); + } + int32_t ota_update_id() const { + return GetField(VT_OTA_UPDATE_ID, 0); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BOOT_TYPE, 1) && + VerifyOffset(verifier, VT_FIRMWARE_VERSION) && + verifier.VerifyTable(firmware_version()) && + VerifyField(verifier, VT_OTA_UPDATE_ID, 4) && + verifier.EndTable(); + } +}; + +struct BootStatusBuilder { + typedef BootStatus Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_boot_type(OpenShock::Serialization::Types::FirmwareBootType boot_type) { + fbb_.AddElement(BootStatus::VT_BOOT_TYPE, static_cast(boot_type), 0); + } + void add_firmware_version(::flatbuffers::Offset firmware_version) { + fbb_.AddOffset(BootStatus::VT_FIRMWARE_VERSION, firmware_version); + } + void add_ota_update_id(int32_t ota_update_id) { + fbb_.AddElement(BootStatus::VT_OTA_UPDATE_ID, ota_update_id, 0); + } + explicit BootStatusBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateBootStatus( + ::flatbuffers::FlatBufferBuilder &_fbb, + OpenShock::Serialization::Types::FirmwareBootType boot_type = OpenShock::Serialization::Types::FirmwareBootType::Normal, + ::flatbuffers::Offset firmware_version = 0, + int32_t ota_update_id = 0) { + BootStatusBuilder builder_(_fbb); + builder_.add_ota_update_id(ota_update_id); + builder_.add_firmware_version(firmware_version); + builder_.add_boot_type(boot_type); + return builder_.Finish(); +} + +struct BootStatus::Traits { + using type = BootStatus; + static auto constexpr Create = CreateBootStatus; +}; + +struct OtaInstallStarted FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaInstallStartedBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.OtaInstallStarted"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_UPDATE_ID = 4, + VT_VERSION = 6 + }; + int32_t update_id() const { + return GetField(VT_UPDATE_ID, 0); + } + const OpenShock::Serialization::Types::SemVer *version() const { + return GetPointer(VT_VERSION); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_UPDATE_ID, 4) && + VerifyOffset(verifier, VT_VERSION) && + verifier.VerifyTable(version()) && + verifier.EndTable(); + } +}; + +struct OtaInstallStartedBuilder { + typedef OtaInstallStarted Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_update_id(int32_t update_id) { + fbb_.AddElement(OtaInstallStarted::VT_UPDATE_ID, update_id, 0); + } + void add_version(::flatbuffers::Offset version) { + fbb_.AddOffset(OtaInstallStarted::VT_VERSION, version); + } + explicit OtaInstallStartedBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaInstallStarted( + ::flatbuffers::FlatBufferBuilder &_fbb, + int32_t update_id = 0, + ::flatbuffers::Offset version = 0) { + OtaInstallStartedBuilder builder_(_fbb); + builder_.add_version(version); + builder_.add_update_id(update_id); + return builder_.Finish(); +} + +struct OtaInstallStarted::Traits { + using type = OtaInstallStarted; + static auto constexpr Create = CreateOtaInstallStarted; +}; + +struct OtaInstallProgress FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaInstallProgressBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.OtaInstallProgress"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_UPDATE_ID = 4, + VT_TASK = 6, + VT_PROGRESS = 8 + }; + int32_t update_id() const { + return GetField(VT_UPDATE_ID, 0); + } + OpenShock::Serialization::Gateway::OtaInstallProgressTask task() const { + return static_cast(GetField(VT_TASK, 0)); + } + float progress() const { + return GetField(VT_PROGRESS, 0.0f); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_UPDATE_ID, 4) && + VerifyField(verifier, VT_TASK, 1) && + VerifyField(verifier, VT_PROGRESS, 4) && + verifier.EndTable(); + } +}; + +struct OtaInstallProgressBuilder { + typedef OtaInstallProgress Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_update_id(int32_t update_id) { + fbb_.AddElement(OtaInstallProgress::VT_UPDATE_ID, update_id, 0); + } + void add_task(OpenShock::Serialization::Gateway::OtaInstallProgressTask task) { + fbb_.AddElement(OtaInstallProgress::VT_TASK, static_cast(task), 0); + } + void add_progress(float progress) { + fbb_.AddElement(OtaInstallProgress::VT_PROGRESS, progress, 0.0f); + } + explicit OtaInstallProgressBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaInstallProgress( + ::flatbuffers::FlatBufferBuilder &_fbb, + int32_t update_id = 0, + OpenShock::Serialization::Gateway::OtaInstallProgressTask task = OpenShock::Serialization::Gateway::OtaInstallProgressTask::FetchingMetadata, + float progress = 0.0f) { + OtaInstallProgressBuilder builder_(_fbb); + builder_.add_progress(progress); + builder_.add_update_id(update_id); + builder_.add_task(task); + return builder_.Finish(); +} + +struct OtaInstallProgress::Traits { + using type = OtaInstallProgress; + static auto constexpr Create = CreateOtaInstallProgress; +}; + +struct OtaInstallFailed FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaInstallFailedBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.OtaInstallFailed"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_UPDATE_ID = 4, + VT_MESSAGE = 6, + VT_FATAL = 8 + }; + int32_t update_id() const { + return GetField(VT_UPDATE_ID, 0); + } + const ::flatbuffers::String *message() const { + return GetPointer(VT_MESSAGE); + } + bool fatal() const { + return GetField(VT_FATAL, 0) != 0; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_UPDATE_ID, 4) && + VerifyOffset(verifier, VT_MESSAGE) && + verifier.VerifyString(message()) && + VerifyField(verifier, VT_FATAL, 1) && + verifier.EndTable(); + } +}; + +struct OtaInstallFailedBuilder { + typedef OtaInstallFailed Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_update_id(int32_t update_id) { + fbb_.AddElement(OtaInstallFailed::VT_UPDATE_ID, update_id, 0); + } + void add_message(::flatbuffers::Offset<::flatbuffers::String> message) { + fbb_.AddOffset(OtaInstallFailed::VT_MESSAGE, message); + } + void add_fatal(bool fatal) { + fbb_.AddElement(OtaInstallFailed::VT_FATAL, static_cast(fatal), 0); + } + explicit OtaInstallFailedBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaInstallFailed( + ::flatbuffers::FlatBufferBuilder &_fbb, + int32_t update_id = 0, + ::flatbuffers::Offset<::flatbuffers::String> message = 0, + bool fatal = false) { + OtaInstallFailedBuilder builder_(_fbb); + builder_.add_message(message); + builder_.add_update_id(update_id); + builder_.add_fatal(fatal); + return builder_.Finish(); +} + +struct OtaInstallFailed::Traits { + using type = OtaInstallFailed; + static auto constexpr Create = CreateOtaInstallFailed; +}; + +inline ::flatbuffers::Offset CreateOtaInstallFailedDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + int32_t update_id = 0, + const char *message = nullptr, + bool fatal = false) { + auto message__ = message ? _fbb.CreateString(message) : 0; + return OpenShock::Serialization::Gateway::CreateOtaInstallFailed( + _fbb, + update_id, + message__, + fatal); +} + +struct DeviceToGatewayMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef DeviceToGatewayMessageBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.DeviceToGatewayMessage"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PAYLOAD_TYPE = 4, + VT_PAYLOAD = 6 + }; + OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload payload_type() const { + return static_cast(GetField(VT_PAYLOAD_TYPE, 0)); + } + const void *payload() const { + return GetPointer(VT_PAYLOAD); + } + template const T *payload_as() const; + const OpenShock::Serialization::Gateway::KeepAlive *payload_as_KeepAlive() const { + return payload_type() == OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::KeepAlive ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::BootStatus *payload_as_BootStatus() const { + return payload_type() == OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::BootStatus ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::OtaInstallStarted *payload_as_OtaInstallStarted() const { + return payload_type() == OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::OtaInstallStarted ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::OtaInstallProgress *payload_as_OtaInstallProgress() const { + return payload_type() == OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::OtaInstallProgress ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::OtaInstallFailed *payload_as_OtaInstallFailed() const { + return payload_type() == OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::OtaInstallFailed ? static_cast(payload()) : nullptr; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PAYLOAD_TYPE, 1) && + VerifyOffset(verifier, VT_PAYLOAD) && + VerifyDeviceToGatewayMessagePayload(verifier, payload(), payload_type()) && + verifier.EndTable(); + } +}; + +template<> inline const OpenShock::Serialization::Gateway::KeepAlive *DeviceToGatewayMessage::payload_as() const { + return payload_as_KeepAlive(); +} + +template<> inline const OpenShock::Serialization::Gateway::BootStatus *DeviceToGatewayMessage::payload_as() const { + return payload_as_BootStatus(); +} + +template<> inline const OpenShock::Serialization::Gateway::OtaInstallStarted *DeviceToGatewayMessage::payload_as() const { + return payload_as_OtaInstallStarted(); +} + +template<> inline const OpenShock::Serialization::Gateway::OtaInstallProgress *DeviceToGatewayMessage::payload_as() const { + return payload_as_OtaInstallProgress(); +} + +template<> inline const OpenShock::Serialization::Gateway::OtaInstallFailed *DeviceToGatewayMessage::payload_as() const { + return payload_as_OtaInstallFailed(); +} + +struct DeviceToGatewayMessageBuilder { + typedef DeviceToGatewayMessage Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_payload_type(OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload payload_type) { + fbb_.AddElement(DeviceToGatewayMessage::VT_PAYLOAD_TYPE, static_cast(payload_type), 0); + } + void add_payload(::flatbuffers::Offset payload) { + fbb_.AddOffset(DeviceToGatewayMessage::VT_PAYLOAD, payload); + } + explicit DeviceToGatewayMessageBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateDeviceToGatewayMessage( + ::flatbuffers::FlatBufferBuilder &_fbb, + OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload payload_type = OpenShock::Serialization::Gateway::DeviceToGatewayMessagePayload::NONE, + ::flatbuffers::Offset payload = 0) { + DeviceToGatewayMessageBuilder builder_(_fbb); + builder_.add_payload(payload); + builder_.add_payload_type(payload_type); + return builder_.Finish(); +} + +struct DeviceToGatewayMessage::Traits { + using type = DeviceToGatewayMessage; + static auto constexpr Create = CreateDeviceToGatewayMessage; +}; + +inline bool VerifyDeviceToGatewayMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, DeviceToGatewayMessagePayload type) { + switch (type) { + case DeviceToGatewayMessagePayload::NONE: { + return true; + } + case DeviceToGatewayMessagePayload::KeepAlive: { + return verifier.VerifyField(static_cast(obj), 0, 8); + } + case DeviceToGatewayMessagePayload::BootStatus: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case DeviceToGatewayMessagePayload::OtaInstallStarted: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case DeviceToGatewayMessagePayload::OtaInstallProgress: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case DeviceToGatewayMessagePayload::OtaInstallFailed: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: return true; + } +} + +inline bool VerifyDeviceToGatewayMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types) { + if (!values || !types) return !values && !types; + if (values->size() != types->size()) return false; + for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifyDeviceToGatewayMessagePayload( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline const OpenShock::Serialization::Gateway::DeviceToGatewayMessage *GetDeviceToGatewayMessage(const void *buf) { + return ::flatbuffers::GetRoot(buf); +} + +inline const OpenShock::Serialization::Gateway::DeviceToGatewayMessage *GetSizePrefixedDeviceToGatewayMessage(const void *buf) { + return ::flatbuffers::GetSizePrefixedRoot(buf); +} + +inline bool VerifyDeviceToGatewayMessageBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifyBuffer(nullptr); +} + +inline bool VerifySizePrefixedDeviceToGatewayMessageBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifySizePrefixedBuffer(nullptr); +} + +inline void FinishDeviceToGatewayMessageBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.Finish(root); +} + +inline void FinishSizePrefixedDeviceToGatewayMessageBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.FinishSizePrefixed(root); +} + +} // namespace Gateway +} // namespace Serialization +} // namespace OpenShock + +#endif // FLATBUFFERS_GENERATED_DEVICETOGATEWAYMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ diff --git a/include/serialization/_fbs/DeviceToServerMessage_generated.h b/include/serialization/_fbs/DeviceToServerMessage_generated.h deleted file mode 100644 index 7dc92459..00000000 --- a/include/serialization/_fbs/DeviceToServerMessage_generated.h +++ /dev/null @@ -1,216 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - - -#ifndef FLATBUFFERS_GENERATED_DEVICETOSERVERMESSAGE_OPENSHOCK_SERIALIZATION_H_ -#define FLATBUFFERS_GENERATED_DEVICETOSERVERMESSAGE_OPENSHOCK_SERIALIZATION_H_ - -#include "flatbuffers/flatbuffers.h" - -// Ensure the included flatbuffers.h is the same version as when this file was -// generated, otherwise it may not be compatible. -static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && - FLATBUFFERS_VERSION_MINOR == 5 && - FLATBUFFERS_VERSION_REVISION == 26, - "Non-compatible flatbuffers version included"); - -namespace OpenShock { -namespace Serialization { - -struct KeepAlive; - -struct DeviceToServerMessage; -struct DeviceToServerMessageBuilder; - -enum class DeviceToServerMessagePayload : uint8_t { - NONE = 0, - KeepAlive = 1, - MIN = NONE, - MAX = KeepAlive -}; - -inline const DeviceToServerMessagePayload (&EnumValuesDeviceToServerMessagePayload())[2] { - static const DeviceToServerMessagePayload values[] = { - DeviceToServerMessagePayload::NONE, - DeviceToServerMessagePayload::KeepAlive - }; - return values; -} - -inline const char * const *EnumNamesDeviceToServerMessagePayload() { - static const char * const names[3] = { - "NONE", - "KeepAlive", - nullptr - }; - return names; -} - -inline const char *EnumNameDeviceToServerMessagePayload(DeviceToServerMessagePayload e) { - if (::flatbuffers::IsOutRange(e, DeviceToServerMessagePayload::NONE, DeviceToServerMessagePayload::KeepAlive)) return ""; - const size_t index = static_cast(e); - return EnumNamesDeviceToServerMessagePayload()[index]; -} - -template struct DeviceToServerMessagePayloadTraits { - static const DeviceToServerMessagePayload enum_value = DeviceToServerMessagePayload::NONE; -}; - -template<> struct DeviceToServerMessagePayloadTraits { - static const DeviceToServerMessagePayload enum_value = DeviceToServerMessagePayload::KeepAlive; -}; - -bool VerifyDeviceToServerMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, DeviceToServerMessagePayload type); -bool VerifyDeviceToServerMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types); - -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) KeepAlive FLATBUFFERS_FINAL_CLASS { - private: - uint64_t uptime_; - - public: - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.KeepAlive"; - } - KeepAlive() - : uptime_(0) { - } - KeepAlive(uint64_t _uptime) - : uptime_(::flatbuffers::EndianScalar(_uptime)) { - } - uint64_t uptime() const { - return ::flatbuffers::EndianScalar(uptime_); - } -}; -FLATBUFFERS_STRUCT_END(KeepAlive, 8); - -struct KeepAlive::Traits { - using type = KeepAlive; -}; - -struct DeviceToServerMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef DeviceToServerMessageBuilder Builder; - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.DeviceToServerMessage"; - } - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PAYLOAD_TYPE = 4, - VT_PAYLOAD = 6 - }; - OpenShock::Serialization::DeviceToServerMessagePayload payload_type() const { - return static_cast(GetField(VT_PAYLOAD_TYPE, 0)); - } - const void *payload() const { - return GetPointer(VT_PAYLOAD); - } - template const T *payload_as() const; - const OpenShock::Serialization::KeepAlive *payload_as_KeepAlive() const { - return payload_type() == OpenShock::Serialization::DeviceToServerMessagePayload::KeepAlive ? static_cast(payload()) : nullptr; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PAYLOAD_TYPE, 1) && - VerifyOffset(verifier, VT_PAYLOAD) && - VerifyDeviceToServerMessagePayload(verifier, payload(), payload_type()) && - verifier.EndTable(); - } -}; - -template<> inline const OpenShock::Serialization::KeepAlive *DeviceToServerMessage::payload_as() const { - return payload_as_KeepAlive(); -} - -struct DeviceToServerMessageBuilder { - typedef DeviceToServerMessage Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_payload_type(OpenShock::Serialization::DeviceToServerMessagePayload payload_type) { - fbb_.AddElement(DeviceToServerMessage::VT_PAYLOAD_TYPE, static_cast(payload_type), 0); - } - void add_payload(::flatbuffers::Offset payload) { - fbb_.AddOffset(DeviceToServerMessage::VT_PAYLOAD, payload); - } - explicit DeviceToServerMessageBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateDeviceToServerMessage( - ::flatbuffers::FlatBufferBuilder &_fbb, - OpenShock::Serialization::DeviceToServerMessagePayload payload_type = OpenShock::Serialization::DeviceToServerMessagePayload::NONE, - ::flatbuffers::Offset payload = 0) { - DeviceToServerMessageBuilder builder_(_fbb); - builder_.add_payload(payload); - builder_.add_payload_type(payload_type); - return builder_.Finish(); -} - -struct DeviceToServerMessage::Traits { - using type = DeviceToServerMessage; - static auto constexpr Create = CreateDeviceToServerMessage; -}; - -inline bool VerifyDeviceToServerMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, DeviceToServerMessagePayload type) { - switch (type) { - case DeviceToServerMessagePayload::NONE: { - return true; - } - case DeviceToServerMessagePayload::KeepAlive: { - return verifier.VerifyField(static_cast(obj), 0, 8); - } - default: return true; - } -} - -inline bool VerifyDeviceToServerMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types) { - if (!values || !types) return !values && !types; - if (values->size() != types->size()) return false; - for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { - if (!VerifyDeviceToServerMessagePayload( - verifier, values->Get(i), types->GetEnum(i))) { - return false; - } - } - return true; -} - -inline const OpenShock::Serialization::DeviceToServerMessage *GetDeviceToServerMessage(const void *buf) { - return ::flatbuffers::GetRoot(buf); -} - -inline const OpenShock::Serialization::DeviceToServerMessage *GetSizePrefixedDeviceToServerMessage(const void *buf) { - return ::flatbuffers::GetSizePrefixedRoot(buf); -} - -inline bool VerifyDeviceToServerMessageBuffer( - ::flatbuffers::Verifier &verifier) { - return verifier.VerifyBuffer(nullptr); -} - -inline bool VerifySizePrefixedDeviceToServerMessageBuffer( - ::flatbuffers::Verifier &verifier) { - return verifier.VerifySizePrefixedBuffer(nullptr); -} - -inline void FinishDeviceToServerMessageBuffer( - ::flatbuffers::FlatBufferBuilder &fbb, - ::flatbuffers::Offset root) { - fbb.Finish(root); -} - -inline void FinishSizePrefixedDeviceToServerMessageBuffer( - ::flatbuffers::FlatBufferBuilder &fbb, - ::flatbuffers::Offset root) { - fbb.FinishSizePrefixed(root); -} - -} // namespace Serialization -} // namespace OpenShock - -#endif // FLATBUFFERS_GENERATED_DEVICETOSERVERMESSAGE_OPENSHOCK_SERIALIZATION_H_ diff --git a/include/serialization/_fbs/FirmwareBootType_generated.h b/include/serialization/_fbs/FirmwareBootType_generated.h new file mode 100644 index 00000000..331c57a0 --- /dev/null +++ b/include/serialization/_fbs/FirmwareBootType_generated.h @@ -0,0 +1,57 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_FIRMWAREBOOTTYPE_OPENSHOCK_SERIALIZATION_TYPES_H_ +#define FLATBUFFERS_GENERATED_FIRMWAREBOOTTYPE_OPENSHOCK_SERIALIZATION_TYPES_H_ + +#include "flatbuffers/flatbuffers.h" + +// Ensure the included flatbuffers.h is the same version as when this file was +// generated, otherwise it may not be compatible. +static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && + FLATBUFFERS_VERSION_MINOR == 5 && + FLATBUFFERS_VERSION_REVISION == 26, + "Non-compatible flatbuffers version included"); + +namespace OpenShock { +namespace Serialization { +namespace Types { + +enum class FirmwareBootType : uint8_t { + Normal = 0, + NewFirmware = 1, + Rollback = 2, + MIN = Normal, + MAX = Rollback +}; + +inline const FirmwareBootType (&EnumValuesFirmwareBootType())[3] { + static const FirmwareBootType values[] = { + FirmwareBootType::Normal, + FirmwareBootType::NewFirmware, + FirmwareBootType::Rollback + }; + return values; +} + +inline const char * const *EnumNamesFirmwareBootType() { + static const char * const names[4] = { + "Normal", + "NewFirmware", + "Rollback", + nullptr + }; + return names; +} + +inline const char *EnumNameFirmwareBootType(FirmwareBootType e) { + if (::flatbuffers::IsOutRange(e, FirmwareBootType::Normal, FirmwareBootType::Rollback)) return ""; + const size_t index = static_cast(e); + return EnumNamesFirmwareBootType()[index]; +} + +} // namespace Types +} // namespace Serialization +} // namespace OpenShock + +#endif // FLATBUFFERS_GENERATED_FIRMWAREBOOTTYPE_OPENSHOCK_SERIALIZATION_TYPES_H_ diff --git a/include/serialization/_fbs/GatewayToDeviceMessage_generated.h b/include/serialization/_fbs/GatewayToDeviceMessage_generated.h new file mode 100644 index 00000000..2f79f58a --- /dev/null +++ b/include/serialization/_fbs/GatewayToDeviceMessage_generated.h @@ -0,0 +1,432 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_GATEWAYTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ +#define FLATBUFFERS_GENERATED_GATEWAYTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ + +#include "flatbuffers/flatbuffers.h" + +// Ensure the included flatbuffers.h is the same version as when this file was +// generated, otherwise it may not be compatible. +static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && + FLATBUFFERS_VERSION_MINOR == 5 && + FLATBUFFERS_VERSION_REVISION == 26, + "Non-compatible flatbuffers version included"); + +#include "SemVer_generated.h" +#include "ShockerCommandType_generated.h" +#include "ShockerModelType_generated.h" + +namespace OpenShock { +namespace Serialization { +namespace Gateway { + +struct ShockerCommand; + +struct ShockerCommandList; +struct ShockerCommandListBuilder; + +struct CaptivePortalConfig; + +struct OtaInstall; +struct OtaInstallBuilder; + +struct GatewayToDeviceMessage; +struct GatewayToDeviceMessageBuilder; + +enum class GatewayToDeviceMessagePayload : uint8_t { + NONE = 0, + ShockerCommandList = 1, + CaptivePortalConfig = 2, + OtaInstall = 3, + MIN = NONE, + MAX = OtaInstall +}; + +inline const GatewayToDeviceMessagePayload (&EnumValuesGatewayToDeviceMessagePayload())[4] { + static const GatewayToDeviceMessagePayload values[] = { + GatewayToDeviceMessagePayload::NONE, + GatewayToDeviceMessagePayload::ShockerCommandList, + GatewayToDeviceMessagePayload::CaptivePortalConfig, + GatewayToDeviceMessagePayload::OtaInstall + }; + return values; +} + +inline const char * const *EnumNamesGatewayToDeviceMessagePayload() { + static const char * const names[5] = { + "NONE", + "ShockerCommandList", + "CaptivePortalConfig", + "OtaInstall", + nullptr + }; + return names; +} + +inline const char *EnumNameGatewayToDeviceMessagePayload(GatewayToDeviceMessagePayload e) { + if (::flatbuffers::IsOutRange(e, GatewayToDeviceMessagePayload::NONE, GatewayToDeviceMessagePayload::OtaInstall)) return ""; + const size_t index = static_cast(e); + return EnumNamesGatewayToDeviceMessagePayload()[index]; +} + +template struct GatewayToDeviceMessagePayloadTraits { + static const GatewayToDeviceMessagePayload enum_value = GatewayToDeviceMessagePayload::NONE; +}; + +template<> struct GatewayToDeviceMessagePayloadTraits { + static const GatewayToDeviceMessagePayload enum_value = GatewayToDeviceMessagePayload::ShockerCommandList; +}; + +template<> struct GatewayToDeviceMessagePayloadTraits { + static const GatewayToDeviceMessagePayload enum_value = GatewayToDeviceMessagePayload::CaptivePortalConfig; +}; + +template<> struct GatewayToDeviceMessagePayloadTraits { + static const GatewayToDeviceMessagePayload enum_value = GatewayToDeviceMessagePayload::OtaInstall; +}; + +bool VerifyGatewayToDeviceMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, GatewayToDeviceMessagePayload type); +bool VerifyGatewayToDeviceMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types); + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) ShockerCommand FLATBUFFERS_FINAL_CLASS { + private: + uint8_t model_; + int8_t padding0__; + uint16_t id_; + uint8_t type_; + uint8_t intensity_; + uint16_t duration_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.ShockerCommand"; + } + ShockerCommand() + : model_(0), + padding0__(0), + id_(0), + type_(0), + intensity_(0), + duration_(0) { + (void)padding0__; + } + ShockerCommand(OpenShock::Serialization::Types::ShockerModelType _model, uint16_t _id, OpenShock::Serialization::Types::ShockerCommandType _type, uint8_t _intensity, uint16_t _duration) + : model_(::flatbuffers::EndianScalar(static_cast(_model))), + padding0__(0), + id_(::flatbuffers::EndianScalar(_id)), + type_(::flatbuffers::EndianScalar(static_cast(_type))), + intensity_(::flatbuffers::EndianScalar(_intensity)), + duration_(::flatbuffers::EndianScalar(_duration)) { + (void)padding0__; + } + OpenShock::Serialization::Types::ShockerModelType model() const { + return static_cast(::flatbuffers::EndianScalar(model_)); + } + uint16_t id() const { + return ::flatbuffers::EndianScalar(id_); + } + OpenShock::Serialization::Types::ShockerCommandType type() const { + return static_cast(::flatbuffers::EndianScalar(type_)); + } + uint8_t intensity() const { + return ::flatbuffers::EndianScalar(intensity_); + } + uint16_t duration() const { + return ::flatbuffers::EndianScalar(duration_); + } +}; +FLATBUFFERS_STRUCT_END(ShockerCommand, 8); + +struct ShockerCommand::Traits { + using type = ShockerCommand; +}; + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) CaptivePortalConfig FLATBUFFERS_FINAL_CLASS { + private: + uint8_t enabled_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.CaptivePortalConfig"; + } + CaptivePortalConfig() + : enabled_(0) { + } + CaptivePortalConfig(bool _enabled) + : enabled_(::flatbuffers::EndianScalar(static_cast(_enabled))) { + } + bool enabled() const { + return ::flatbuffers::EndianScalar(enabled_) != 0; + } +}; +FLATBUFFERS_STRUCT_END(CaptivePortalConfig, 1); + +struct CaptivePortalConfig::Traits { + using type = CaptivePortalConfig; +}; + +struct ShockerCommandList FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef ShockerCommandListBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.ShockerCommandList"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_COMMANDS = 4 + }; + const ::flatbuffers::Vector *commands() const { + return GetPointer *>(VT_COMMANDS); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_COMMANDS) && + verifier.VerifyVector(commands()) && + verifier.EndTable(); + } +}; + +struct ShockerCommandListBuilder { + typedef ShockerCommandList Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_commands(::flatbuffers::Offset<::flatbuffers::Vector> commands) { + fbb_.AddOffset(ShockerCommandList::VT_COMMANDS, commands); + } + explicit ShockerCommandListBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + fbb_.Required(o, ShockerCommandList::VT_COMMANDS); + return o; + } +}; + +inline ::flatbuffers::Offset CreateShockerCommandList( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::Vector> commands = 0) { + ShockerCommandListBuilder builder_(_fbb); + builder_.add_commands(commands); + return builder_.Finish(); +} + +struct ShockerCommandList::Traits { + using type = ShockerCommandList; + static auto constexpr Create = CreateShockerCommandList; +}; + +inline ::flatbuffers::Offset CreateShockerCommandListDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *commands = nullptr) { + auto commands__ = commands ? _fbb.CreateVectorOfStructs(*commands) : 0; + return OpenShock::Serialization::Gateway::CreateShockerCommandList( + _fbb, + commands__); +} + +struct OtaInstall FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaInstallBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.OtaInstall"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VERSION = 4 + }; + const OpenShock::Serialization::Types::SemVer *version() const { + return GetPointer(VT_VERSION); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_VERSION) && + verifier.VerifyTable(version()) && + verifier.EndTable(); + } +}; + +struct OtaInstallBuilder { + typedef OtaInstall Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_version(::flatbuffers::Offset version) { + fbb_.AddOffset(OtaInstall::VT_VERSION, version); + } + explicit OtaInstallBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaInstall( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset version = 0) { + OtaInstallBuilder builder_(_fbb); + builder_.add_version(version); + return builder_.Finish(); +} + +struct OtaInstall::Traits { + using type = OtaInstall; + static auto constexpr Create = CreateOtaInstall; +}; + +struct GatewayToDeviceMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef GatewayToDeviceMessageBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Gateway.GatewayToDeviceMessage"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PAYLOAD_TYPE = 4, + VT_PAYLOAD = 6 + }; + OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload payload_type() const { + return static_cast(GetField(VT_PAYLOAD_TYPE, 0)); + } + const void *payload() const { + return GetPointer(VT_PAYLOAD); + } + template const T *payload_as() const; + const OpenShock::Serialization::Gateway::ShockerCommandList *payload_as_ShockerCommandList() const { + return payload_type() == OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload::ShockerCommandList ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::CaptivePortalConfig *payload_as_CaptivePortalConfig() const { + return payload_type() == OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload::CaptivePortalConfig ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Gateway::OtaInstall *payload_as_OtaInstall() const { + return payload_type() == OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload::OtaInstall ? static_cast(payload()) : nullptr; + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PAYLOAD_TYPE, 1) && + VerifyOffset(verifier, VT_PAYLOAD) && + VerifyGatewayToDeviceMessagePayload(verifier, payload(), payload_type()) && + verifier.EndTable(); + } +}; + +template<> inline const OpenShock::Serialization::Gateway::ShockerCommandList *GatewayToDeviceMessage::payload_as() const { + return payload_as_ShockerCommandList(); +} + +template<> inline const OpenShock::Serialization::Gateway::CaptivePortalConfig *GatewayToDeviceMessage::payload_as() const { + return payload_as_CaptivePortalConfig(); +} + +template<> inline const OpenShock::Serialization::Gateway::OtaInstall *GatewayToDeviceMessage::payload_as() const { + return payload_as_OtaInstall(); +} + +struct GatewayToDeviceMessageBuilder { + typedef GatewayToDeviceMessage Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_payload_type(OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload payload_type) { + fbb_.AddElement(GatewayToDeviceMessage::VT_PAYLOAD_TYPE, static_cast(payload_type), 0); + } + void add_payload(::flatbuffers::Offset payload) { + fbb_.AddOffset(GatewayToDeviceMessage::VT_PAYLOAD, payload); + } + explicit GatewayToDeviceMessageBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateGatewayToDeviceMessage( + ::flatbuffers::FlatBufferBuilder &_fbb, + OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload payload_type = OpenShock::Serialization::Gateway::GatewayToDeviceMessagePayload::NONE, + ::flatbuffers::Offset payload = 0) { + GatewayToDeviceMessageBuilder builder_(_fbb); + builder_.add_payload(payload); + builder_.add_payload_type(payload_type); + return builder_.Finish(); +} + +struct GatewayToDeviceMessage::Traits { + using type = GatewayToDeviceMessage; + static auto constexpr Create = CreateGatewayToDeviceMessage; +}; + +inline bool VerifyGatewayToDeviceMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, GatewayToDeviceMessagePayload type) { + switch (type) { + case GatewayToDeviceMessagePayload::NONE: { + return true; + } + case GatewayToDeviceMessagePayload::ShockerCommandList: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case GatewayToDeviceMessagePayload::CaptivePortalConfig: { + return verifier.VerifyField(static_cast(obj), 0, 1); + } + case GatewayToDeviceMessagePayload::OtaInstall: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: return true; + } +} + +inline bool VerifyGatewayToDeviceMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types) { + if (!values || !types) return !values && !types; + if (values->size() != types->size()) return false; + for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifyGatewayToDeviceMessagePayload( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline const OpenShock::Serialization::Gateway::GatewayToDeviceMessage *GetGatewayToDeviceMessage(const void *buf) { + return ::flatbuffers::GetRoot(buf); +} + +inline const OpenShock::Serialization::Gateway::GatewayToDeviceMessage *GetSizePrefixedGatewayToDeviceMessage(const void *buf) { + return ::flatbuffers::GetSizePrefixedRoot(buf); +} + +inline bool VerifyGatewayToDeviceMessageBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifyBuffer(nullptr); +} + +inline bool VerifySizePrefixedGatewayToDeviceMessageBuffer( + ::flatbuffers::Verifier &verifier) { + return verifier.VerifySizePrefixedBuffer(nullptr); +} + +inline void FinishGatewayToDeviceMessageBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.Finish(root); +} + +inline void FinishSizePrefixedGatewayToDeviceMessageBuffer( + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset root) { + fbb.FinishSizePrefixed(root); +} + +} // namespace Gateway +} // namespace Serialization +} // namespace OpenShock + +#endif // FLATBUFFERS_GENERATED_GATEWAYTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_GATEWAY_H_ diff --git a/include/serialization/_fbs/LocalToDeviceMessage_generated.h b/include/serialization/_fbs/LocalToDeviceMessage_generated.h index 6f4e0d55..24afa8d6 100644 --- a/include/serialization/_fbs/LocalToDeviceMessage_generated.h +++ b/include/serialization/_fbs/LocalToDeviceMessage_generated.h @@ -30,6 +30,28 @@ struct WifiNetworkConnectCommandBuilder; struct WifiNetworkDisconnectCommand; +struct OtaUpdateSetIsEnabledCommand; + +struct OtaUpdateSetDomainCommand; +struct OtaUpdateSetDomainCommandBuilder; + +struct OtaUpdateSetUpdateChannelCommand; +struct OtaUpdateSetUpdateChannelCommandBuilder; + +struct OtaUpdateSetCheckIntervalCommand; + +struct OtaUpdateSetAllowBackendManagementCommand; + +struct OtaUpdateSetRequireManualApprovalCommand; + +struct OtaUpdateHandleUpdateRequestCommand; + +struct OtaUpdateCheckForUpdatesCommand; +struct OtaUpdateCheckForUpdatesCommandBuilder; + +struct OtaUpdateStartUpdateCommand; +struct OtaUpdateStartUpdateCommandBuilder; + struct AccountLinkCommand; struct AccountLinkCommandBuilder; @@ -47,14 +69,23 @@ enum class LocalToDeviceMessagePayload : uint8_t { WifiNetworkForgetCommand = 3, WifiNetworkConnectCommand = 4, WifiNetworkDisconnectCommand = 5, - AccountLinkCommand = 6, - AccountUnlinkCommand = 7, - SetRfTxPinCommand = 8, + OtaUpdateSetIsEnabledCommand = 6, + OtaUpdateSetDomainCommand = 7, + OtaUpdateSetUpdateChannelCommand = 8, + OtaUpdateSetCheckIntervalCommand = 9, + OtaUpdateSetAllowBackendManagementCommand = 10, + OtaUpdateSetRequireManualApprovalCommand = 11, + OtaUpdateHandleUpdateRequestCommand = 12, + OtaUpdateCheckForUpdatesCommand = 13, + OtaUpdateStartUpdateCommand = 14, + AccountLinkCommand = 15, + AccountUnlinkCommand = 16, + SetRfTxPinCommand = 17, MIN = NONE, MAX = SetRfTxPinCommand }; -inline const LocalToDeviceMessagePayload (&EnumValuesLocalToDeviceMessagePayload())[9] { +inline const LocalToDeviceMessagePayload (&EnumValuesLocalToDeviceMessagePayload())[18] { static const LocalToDeviceMessagePayload values[] = { LocalToDeviceMessagePayload::NONE, LocalToDeviceMessagePayload::WifiScanCommand, @@ -62,6 +93,15 @@ inline const LocalToDeviceMessagePayload (&EnumValuesLocalToDeviceMessagePayload LocalToDeviceMessagePayload::WifiNetworkForgetCommand, LocalToDeviceMessagePayload::WifiNetworkConnectCommand, LocalToDeviceMessagePayload::WifiNetworkDisconnectCommand, + LocalToDeviceMessagePayload::OtaUpdateSetIsEnabledCommand, + LocalToDeviceMessagePayload::OtaUpdateSetDomainCommand, + LocalToDeviceMessagePayload::OtaUpdateSetUpdateChannelCommand, + LocalToDeviceMessagePayload::OtaUpdateSetCheckIntervalCommand, + LocalToDeviceMessagePayload::OtaUpdateSetAllowBackendManagementCommand, + LocalToDeviceMessagePayload::OtaUpdateSetRequireManualApprovalCommand, + LocalToDeviceMessagePayload::OtaUpdateHandleUpdateRequestCommand, + LocalToDeviceMessagePayload::OtaUpdateCheckForUpdatesCommand, + LocalToDeviceMessagePayload::OtaUpdateStartUpdateCommand, LocalToDeviceMessagePayload::AccountLinkCommand, LocalToDeviceMessagePayload::AccountUnlinkCommand, LocalToDeviceMessagePayload::SetRfTxPinCommand @@ -70,13 +110,22 @@ inline const LocalToDeviceMessagePayload (&EnumValuesLocalToDeviceMessagePayload } inline const char * const *EnumNamesLocalToDeviceMessagePayload() { - static const char * const names[10] = { + static const char * const names[19] = { "NONE", "WifiScanCommand", "WifiNetworkSaveCommand", "WifiNetworkForgetCommand", "WifiNetworkConnectCommand", "WifiNetworkDisconnectCommand", + "OtaUpdateSetIsEnabledCommand", + "OtaUpdateSetDomainCommand", + "OtaUpdateSetUpdateChannelCommand", + "OtaUpdateSetCheckIntervalCommand", + "OtaUpdateSetAllowBackendManagementCommand", + "OtaUpdateSetRequireManualApprovalCommand", + "OtaUpdateHandleUpdateRequestCommand", + "OtaUpdateCheckForUpdatesCommand", + "OtaUpdateStartUpdateCommand", "AccountLinkCommand", "AccountUnlinkCommand", "SetRfTxPinCommand", @@ -115,6 +164,42 @@ template<> struct LocalToDeviceMessagePayloadTraits struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetIsEnabledCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetDomainCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetUpdateChannelCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetCheckIntervalCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetAllowBackendManagementCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateSetRequireManualApprovalCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateHandleUpdateRequestCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateCheckForUpdatesCommand; +}; + +template<> struct LocalToDeviceMessagePayloadTraits { + static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::OtaUpdateStartUpdateCommand; +}; + template<> struct LocalToDeviceMessagePayloadTraits { static const LocalToDeviceMessagePayload enum_value = LocalToDeviceMessagePayload::AccountLinkCommand; }; @@ -180,6 +265,131 @@ struct WifiNetworkDisconnectCommand::Traits { using type = WifiNetworkDisconnectCommand; }; +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) OtaUpdateSetIsEnabledCommand FLATBUFFERS_FINAL_CLASS { + private: + uint8_t enabled_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetIsEnabledCommand"; + } + OtaUpdateSetIsEnabledCommand() + : enabled_(0) { + } + OtaUpdateSetIsEnabledCommand(bool _enabled) + : enabled_(::flatbuffers::EndianScalar(static_cast(_enabled))) { + } + bool enabled() const { + return ::flatbuffers::EndianScalar(enabled_) != 0; + } +}; +FLATBUFFERS_STRUCT_END(OtaUpdateSetIsEnabledCommand, 1); + +struct OtaUpdateSetIsEnabledCommand::Traits { + using type = OtaUpdateSetIsEnabledCommand; +}; + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) OtaUpdateSetCheckIntervalCommand FLATBUFFERS_FINAL_CLASS { + private: + uint16_t interval_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetCheckIntervalCommand"; + } + OtaUpdateSetCheckIntervalCommand() + : interval_(0) { + } + OtaUpdateSetCheckIntervalCommand(uint16_t _interval) + : interval_(::flatbuffers::EndianScalar(_interval)) { + } + uint16_t interval() const { + return ::flatbuffers::EndianScalar(interval_); + } +}; +FLATBUFFERS_STRUCT_END(OtaUpdateSetCheckIntervalCommand, 2); + +struct OtaUpdateSetCheckIntervalCommand::Traits { + using type = OtaUpdateSetCheckIntervalCommand; +}; + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) OtaUpdateSetAllowBackendManagementCommand FLATBUFFERS_FINAL_CLASS { + private: + uint8_t allow_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetAllowBackendManagementCommand"; + } + OtaUpdateSetAllowBackendManagementCommand() + : allow_(0) { + } + OtaUpdateSetAllowBackendManagementCommand(bool _allow) + : allow_(::flatbuffers::EndianScalar(static_cast(_allow))) { + } + bool allow() const { + return ::flatbuffers::EndianScalar(allow_) != 0; + } +}; +FLATBUFFERS_STRUCT_END(OtaUpdateSetAllowBackendManagementCommand, 1); + +struct OtaUpdateSetAllowBackendManagementCommand::Traits { + using type = OtaUpdateSetAllowBackendManagementCommand; +}; + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) OtaUpdateSetRequireManualApprovalCommand FLATBUFFERS_FINAL_CLASS { + private: + uint8_t require_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetRequireManualApprovalCommand"; + } + OtaUpdateSetRequireManualApprovalCommand() + : require_(0) { + } + OtaUpdateSetRequireManualApprovalCommand(bool _require) + : require_(::flatbuffers::EndianScalar(static_cast(_require))) { + } + bool require() const { + return ::flatbuffers::EndianScalar(require_) != 0; + } +}; +FLATBUFFERS_STRUCT_END(OtaUpdateSetRequireManualApprovalCommand, 1); + +struct OtaUpdateSetRequireManualApprovalCommand::Traits { + using type = OtaUpdateSetRequireManualApprovalCommand; +}; + +FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) OtaUpdateHandleUpdateRequestCommand FLATBUFFERS_FINAL_CLASS { + private: + uint8_t accept_; + + public: + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateHandleUpdateRequestCommand"; + } + OtaUpdateHandleUpdateRequestCommand() + : accept_(0) { + } + OtaUpdateHandleUpdateRequestCommand(bool _accept) + : accept_(::flatbuffers::EndianScalar(static_cast(_accept))) { + } + bool accept() const { + return ::flatbuffers::EndianScalar(accept_) != 0; + } +}; +FLATBUFFERS_STRUCT_END(OtaUpdateHandleUpdateRequestCommand, 1); + +struct OtaUpdateHandleUpdateRequestCommand::Traits { + using type = OtaUpdateHandleUpdateRequestCommand; +}; + FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) AccountUnlinkCommand FLATBUFFERS_FINAL_CLASS { private: uint8_t placeholder_; @@ -436,6 +646,260 @@ inline ::flatbuffers::Offset CreateWifiNetworkConnect ssid__); } +struct OtaUpdateSetDomainCommand FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaUpdateSetDomainCommandBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetDomainCommand"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_DOMAIN = 4 + }; + const ::flatbuffers::String *domain() const { + return GetPointer(VT_DOMAIN); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_DOMAIN) && + verifier.VerifyString(domain()) && + verifier.EndTable(); + } +}; + +struct OtaUpdateSetDomainCommandBuilder { + typedef OtaUpdateSetDomainCommand Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_domain(::flatbuffers::Offset<::flatbuffers::String> domain) { + fbb_.AddOffset(OtaUpdateSetDomainCommand::VT_DOMAIN, domain); + } + explicit OtaUpdateSetDomainCommandBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaUpdateSetDomainCommand( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> domain = 0) { + OtaUpdateSetDomainCommandBuilder builder_(_fbb); + builder_.add_domain(domain); + return builder_.Finish(); +} + +struct OtaUpdateSetDomainCommand::Traits { + using type = OtaUpdateSetDomainCommand; + static auto constexpr Create = CreateOtaUpdateSetDomainCommand; +}; + +inline ::flatbuffers::Offset CreateOtaUpdateSetDomainCommandDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *domain = nullptr) { + auto domain__ = domain ? _fbb.CreateString(domain) : 0; + return OpenShock::Serialization::Local::CreateOtaUpdateSetDomainCommand( + _fbb, + domain__); +} + +struct OtaUpdateSetUpdateChannelCommand FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaUpdateSetUpdateChannelCommandBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateSetUpdateChannelCommand"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_CHANNEL = 4 + }; + const ::flatbuffers::String *channel() const { + return GetPointer(VT_CHANNEL); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_CHANNEL) && + verifier.VerifyString(channel()) && + verifier.EndTable(); + } +}; + +struct OtaUpdateSetUpdateChannelCommandBuilder { + typedef OtaUpdateSetUpdateChannelCommand Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_channel(::flatbuffers::Offset<::flatbuffers::String> channel) { + fbb_.AddOffset(OtaUpdateSetUpdateChannelCommand::VT_CHANNEL, channel); + } + explicit OtaUpdateSetUpdateChannelCommandBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaUpdateSetUpdateChannelCommand( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> channel = 0) { + OtaUpdateSetUpdateChannelCommandBuilder builder_(_fbb); + builder_.add_channel(channel); + return builder_.Finish(); +} + +struct OtaUpdateSetUpdateChannelCommand::Traits { + using type = OtaUpdateSetUpdateChannelCommand; + static auto constexpr Create = CreateOtaUpdateSetUpdateChannelCommand; +}; + +inline ::flatbuffers::Offset CreateOtaUpdateSetUpdateChannelCommandDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *channel = nullptr) { + auto channel__ = channel ? _fbb.CreateString(channel) : 0; + return OpenShock::Serialization::Local::CreateOtaUpdateSetUpdateChannelCommand( + _fbb, + channel__); +} + +struct OtaUpdateCheckForUpdatesCommand FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaUpdateCheckForUpdatesCommandBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateCheckForUpdatesCommand"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_CHANNEL = 4 + }; + const ::flatbuffers::String *channel() const { + return GetPointer(VT_CHANNEL); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_CHANNEL) && + verifier.VerifyString(channel()) && + verifier.EndTable(); + } +}; + +struct OtaUpdateCheckForUpdatesCommandBuilder { + typedef OtaUpdateCheckForUpdatesCommand Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_channel(::flatbuffers::Offset<::flatbuffers::String> channel) { + fbb_.AddOffset(OtaUpdateCheckForUpdatesCommand::VT_CHANNEL, channel); + } + explicit OtaUpdateCheckForUpdatesCommandBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaUpdateCheckForUpdatesCommand( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> channel = 0) { + OtaUpdateCheckForUpdatesCommandBuilder builder_(_fbb); + builder_.add_channel(channel); + return builder_.Finish(); +} + +struct OtaUpdateCheckForUpdatesCommand::Traits { + using type = OtaUpdateCheckForUpdatesCommand; + static auto constexpr Create = CreateOtaUpdateCheckForUpdatesCommand; +}; + +inline ::flatbuffers::Offset CreateOtaUpdateCheckForUpdatesCommandDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *channel = nullptr) { + auto channel__ = channel ? _fbb.CreateString(channel) : 0; + return OpenShock::Serialization::Local::CreateOtaUpdateCheckForUpdatesCommand( + _fbb, + channel__); +} + +struct OtaUpdateStartUpdateCommand FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef OtaUpdateStartUpdateCommandBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Local.OtaUpdateStartUpdateCommand"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_CHANNEL = 4, + VT_VERSION = 6 + }; + const ::flatbuffers::String *channel() const { + return GetPointer(VT_CHANNEL); + } + const ::flatbuffers::String *version() const { + return GetPointer(VT_VERSION); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_CHANNEL) && + verifier.VerifyString(channel()) && + VerifyOffset(verifier, VT_VERSION) && + verifier.VerifyString(version()) && + verifier.EndTable(); + } +}; + +struct OtaUpdateStartUpdateCommandBuilder { + typedef OtaUpdateStartUpdateCommand Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_channel(::flatbuffers::Offset<::flatbuffers::String> channel) { + fbb_.AddOffset(OtaUpdateStartUpdateCommand::VT_CHANNEL, channel); + } + void add_version(::flatbuffers::Offset<::flatbuffers::String> version) { + fbb_.AddOffset(OtaUpdateStartUpdateCommand::VT_VERSION, version); + } + explicit OtaUpdateStartUpdateCommandBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateOtaUpdateStartUpdateCommand( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> channel = 0, + ::flatbuffers::Offset<::flatbuffers::String> version = 0) { + OtaUpdateStartUpdateCommandBuilder builder_(_fbb); + builder_.add_version(version); + builder_.add_channel(channel); + return builder_.Finish(); +} + +struct OtaUpdateStartUpdateCommand::Traits { + using type = OtaUpdateStartUpdateCommand; + static auto constexpr Create = CreateOtaUpdateStartUpdateCommand; +}; + +inline ::flatbuffers::Offset CreateOtaUpdateStartUpdateCommandDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *channel = nullptr, + const char *version = nullptr) { + auto channel__ = channel ? _fbb.CreateString(channel) : 0; + auto version__ = version ? _fbb.CreateString(version) : 0; + return OpenShock::Serialization::Local::CreateOtaUpdateStartUpdateCommand( + _fbb, + channel__, + version__); +} + struct AccountLinkCommand FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef AccountLinkCommandBuilder Builder; struct Traits; @@ -528,6 +992,33 @@ struct LocalToDeviceMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Tab const OpenShock::Serialization::Local::WifiNetworkDisconnectCommand *payload_as_WifiNetworkDisconnectCommand() const { return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::WifiNetworkDisconnectCommand ? static_cast(payload()) : nullptr; } + const OpenShock::Serialization::Local::OtaUpdateSetIsEnabledCommand *payload_as_OtaUpdateSetIsEnabledCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetIsEnabledCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateSetDomainCommand *payload_as_OtaUpdateSetDomainCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetDomainCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateSetUpdateChannelCommand *payload_as_OtaUpdateSetUpdateChannelCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetUpdateChannelCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateSetCheckIntervalCommand *payload_as_OtaUpdateSetCheckIntervalCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetCheckIntervalCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateSetAllowBackendManagementCommand *payload_as_OtaUpdateSetAllowBackendManagementCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetAllowBackendManagementCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateSetRequireManualApprovalCommand *payload_as_OtaUpdateSetRequireManualApprovalCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateSetRequireManualApprovalCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateHandleUpdateRequestCommand *payload_as_OtaUpdateHandleUpdateRequestCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateHandleUpdateRequestCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateCheckForUpdatesCommand *payload_as_OtaUpdateCheckForUpdatesCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateCheckForUpdatesCommand ? static_cast(payload()) : nullptr; + } + const OpenShock::Serialization::Local::OtaUpdateStartUpdateCommand *payload_as_OtaUpdateStartUpdateCommand() const { + return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::OtaUpdateStartUpdateCommand ? static_cast(payload()) : nullptr; + } const OpenShock::Serialization::Local::AccountLinkCommand *payload_as_AccountLinkCommand() const { return payload_type() == OpenShock::Serialization::Local::LocalToDeviceMessagePayload::AccountLinkCommand ? static_cast(payload()) : nullptr; } @@ -566,6 +1057,42 @@ template<> inline const OpenShock::Serialization::Local::WifiNetworkDisconnectCo return payload_as_WifiNetworkDisconnectCommand(); } +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetIsEnabledCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetIsEnabledCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetDomainCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetDomainCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetUpdateChannelCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetUpdateChannelCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetCheckIntervalCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetCheckIntervalCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetAllowBackendManagementCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetAllowBackendManagementCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateSetRequireManualApprovalCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateSetRequireManualApprovalCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateHandleUpdateRequestCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateHandleUpdateRequestCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateCheckForUpdatesCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateCheckForUpdatesCommand(); +} + +template<> inline const OpenShock::Serialization::Local::OtaUpdateStartUpdateCommand *LocalToDeviceMessage::payload_as() const { + return payload_as_OtaUpdateStartUpdateCommand(); +} + template<> inline const OpenShock::Serialization::Local::AccountLinkCommand *LocalToDeviceMessage::payload_as() const { return payload_as_AccountLinkCommand(); } @@ -637,6 +1164,37 @@ inline bool VerifyLocalToDeviceMessagePayload(::flatbuffers::Verifier &verifier, case LocalToDeviceMessagePayload::WifiNetworkDisconnectCommand: { return verifier.VerifyField(static_cast(obj), 0, 1); } + case LocalToDeviceMessagePayload::OtaUpdateSetIsEnabledCommand: { + return verifier.VerifyField(static_cast(obj), 0, 1); + } + case LocalToDeviceMessagePayload::OtaUpdateSetDomainCommand: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case LocalToDeviceMessagePayload::OtaUpdateSetUpdateChannelCommand: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case LocalToDeviceMessagePayload::OtaUpdateSetCheckIntervalCommand: { + return verifier.VerifyField(static_cast(obj), 0, 2); + } + case LocalToDeviceMessagePayload::OtaUpdateSetAllowBackendManagementCommand: { + return verifier.VerifyField(static_cast(obj), 0, 1); + } + case LocalToDeviceMessagePayload::OtaUpdateSetRequireManualApprovalCommand: { + return verifier.VerifyField(static_cast(obj), 0, 1); + } + case LocalToDeviceMessagePayload::OtaUpdateHandleUpdateRequestCommand: { + return verifier.VerifyField(static_cast(obj), 0, 1); + } + case LocalToDeviceMessagePayload::OtaUpdateCheckForUpdatesCommand: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case LocalToDeviceMessagePayload::OtaUpdateStartUpdateCommand: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } case LocalToDeviceMessagePayload::AccountLinkCommand: { auto ptr = reinterpret_cast(obj); return verifier.VerifyTable(ptr); diff --git a/include/serialization/_fbs/SemVer_generated.h b/include/serialization/_fbs/SemVer_generated.h new file mode 100644 index 00000000..f26346fb --- /dev/null +++ b/include/serialization/_fbs/SemVer_generated.h @@ -0,0 +1,137 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +#ifndef FLATBUFFERS_GENERATED_SEMVER_OPENSHOCK_SERIALIZATION_TYPES_H_ +#define FLATBUFFERS_GENERATED_SEMVER_OPENSHOCK_SERIALIZATION_TYPES_H_ + +#include "flatbuffers/flatbuffers.h" + +// Ensure the included flatbuffers.h is the same version as when this file was +// generated, otherwise it may not be compatible. +static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && + FLATBUFFERS_VERSION_MINOR == 5 && + FLATBUFFERS_VERSION_REVISION == 26, + "Non-compatible flatbuffers version included"); + +namespace OpenShock { +namespace Serialization { +namespace Types { + +struct SemVer; +struct SemVerBuilder; + +struct SemVer FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef SemVerBuilder Builder; + struct Traits; + static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { + return "OpenShock.Serialization.Types.SemVer"; + } + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_MAJOR = 4, + VT_MINOR = 6, + VT_PATCH = 8, + VT_PRERELEASE = 10, + VT_BUILD = 12 + }; + uint16_t major() const { + return GetField(VT_MAJOR, 0); + } + uint16_t minor() const { + return GetField(VT_MINOR, 0); + } + uint16_t patch() const { + return GetField(VT_PATCH, 0); + } + const ::flatbuffers::String *prerelease() const { + return GetPointer(VT_PRERELEASE); + } + const ::flatbuffers::String *build() const { + return GetPointer(VT_BUILD); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_MAJOR, 2) && + VerifyField(verifier, VT_MINOR, 2) && + VerifyField(verifier, VT_PATCH, 2) && + VerifyOffset(verifier, VT_PRERELEASE) && + verifier.VerifyString(prerelease()) && + VerifyOffset(verifier, VT_BUILD) && + verifier.VerifyString(build()) && + verifier.EndTable(); + } +}; + +struct SemVerBuilder { + typedef SemVer Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_major(uint16_t major) { + fbb_.AddElement(SemVer::VT_MAJOR, major, 0); + } + void add_minor(uint16_t minor) { + fbb_.AddElement(SemVer::VT_MINOR, minor, 0); + } + void add_patch(uint16_t patch) { + fbb_.AddElement(SemVer::VT_PATCH, patch, 0); + } + void add_prerelease(::flatbuffers::Offset<::flatbuffers::String> prerelease) { + fbb_.AddOffset(SemVer::VT_PRERELEASE, prerelease); + } + void add_build(::flatbuffers::Offset<::flatbuffers::String> build) { + fbb_.AddOffset(SemVer::VT_BUILD, build); + } + explicit SemVerBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateSemVer( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint16_t major = 0, + uint16_t minor = 0, + uint16_t patch = 0, + ::flatbuffers::Offset<::flatbuffers::String> prerelease = 0, + ::flatbuffers::Offset<::flatbuffers::String> build = 0) { + SemVerBuilder builder_(_fbb); + builder_.add_build(build); + builder_.add_prerelease(prerelease); + builder_.add_patch(patch); + builder_.add_minor(minor); + builder_.add_major(major); + return builder_.Finish(); +} + +struct SemVer::Traits { + using type = SemVer; + static auto constexpr Create = CreateSemVer; +}; + +inline ::flatbuffers::Offset CreateSemVerDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint16_t major = 0, + uint16_t minor = 0, + uint16_t patch = 0, + const char *prerelease = nullptr, + const char *build = nullptr) { + auto prerelease__ = prerelease ? _fbb.CreateString(prerelease) : 0; + auto build__ = build ? _fbb.CreateString(build) : 0; + return OpenShock::Serialization::Types::CreateSemVer( + _fbb, + major, + minor, + patch, + prerelease__, + build__); +} + +} // namespace Types +} // namespace Serialization +} // namespace OpenShock + +#endif // FLATBUFFERS_GENERATED_SEMVER_OPENSHOCK_SERIALIZATION_TYPES_H_ diff --git a/include/serialization/_fbs/ServerToDeviceMessage_generated.h b/include/serialization/_fbs/ServerToDeviceMessage_generated.h deleted file mode 100644 index 7c66c420..00000000 --- a/include/serialization/_fbs/ServerToDeviceMessage_generated.h +++ /dev/null @@ -1,357 +0,0 @@ -// automatically generated by the FlatBuffers compiler, do not modify - - -#ifndef FLATBUFFERS_GENERATED_SERVERTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_H_ -#define FLATBUFFERS_GENERATED_SERVERTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_H_ - -#include "flatbuffers/flatbuffers.h" - -// Ensure the included flatbuffers.h is the same version as when this file was -// generated, otherwise it may not be compatible. -static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && - FLATBUFFERS_VERSION_MINOR == 5 && - FLATBUFFERS_VERSION_REVISION == 26, - "Non-compatible flatbuffers version included"); - -#include "ShockerCommandType_generated.h" -#include "ShockerModelType_generated.h" - -namespace OpenShock { -namespace Serialization { - -struct ShockerCommand; - -struct ShockerCommandList; -struct ShockerCommandListBuilder; - -struct CaptivePortalConfig; - -struct ServerToDeviceMessage; -struct ServerToDeviceMessageBuilder; - -enum class ServerToDeviceMessagePayload : uint8_t { - NONE = 0, - ShockerCommandList = 1, - CaptivePortalConfig = 2, - MIN = NONE, - MAX = CaptivePortalConfig -}; - -inline const ServerToDeviceMessagePayload (&EnumValuesServerToDeviceMessagePayload())[3] { - static const ServerToDeviceMessagePayload values[] = { - ServerToDeviceMessagePayload::NONE, - ServerToDeviceMessagePayload::ShockerCommandList, - ServerToDeviceMessagePayload::CaptivePortalConfig - }; - return values; -} - -inline const char * const *EnumNamesServerToDeviceMessagePayload() { - static const char * const names[4] = { - "NONE", - "ShockerCommandList", - "CaptivePortalConfig", - nullptr - }; - return names; -} - -inline const char *EnumNameServerToDeviceMessagePayload(ServerToDeviceMessagePayload e) { - if (::flatbuffers::IsOutRange(e, ServerToDeviceMessagePayload::NONE, ServerToDeviceMessagePayload::CaptivePortalConfig)) return ""; - const size_t index = static_cast(e); - return EnumNamesServerToDeviceMessagePayload()[index]; -} - -template struct ServerToDeviceMessagePayloadTraits { - static const ServerToDeviceMessagePayload enum_value = ServerToDeviceMessagePayload::NONE; -}; - -template<> struct ServerToDeviceMessagePayloadTraits { - static const ServerToDeviceMessagePayload enum_value = ServerToDeviceMessagePayload::ShockerCommandList; -}; - -template<> struct ServerToDeviceMessagePayloadTraits { - static const ServerToDeviceMessagePayload enum_value = ServerToDeviceMessagePayload::CaptivePortalConfig; -}; - -bool VerifyServerToDeviceMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, ServerToDeviceMessagePayload type); -bool VerifyServerToDeviceMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types); - -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) ShockerCommand FLATBUFFERS_FINAL_CLASS { - private: - uint8_t model_; - int8_t padding0__; - uint16_t id_; - uint8_t type_; - uint8_t intensity_; - uint16_t duration_; - - public: - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.ShockerCommand"; - } - ShockerCommand() - : model_(0), - padding0__(0), - id_(0), - type_(0), - intensity_(0), - duration_(0) { - (void)padding0__; - } - ShockerCommand(OpenShock::Serialization::Types::ShockerModelType _model, uint16_t _id, OpenShock::Serialization::Types::ShockerCommandType _type, uint8_t _intensity, uint16_t _duration) - : model_(::flatbuffers::EndianScalar(static_cast(_model))), - padding0__(0), - id_(::flatbuffers::EndianScalar(_id)), - type_(::flatbuffers::EndianScalar(static_cast(_type))), - intensity_(::flatbuffers::EndianScalar(_intensity)), - duration_(::flatbuffers::EndianScalar(_duration)) { - (void)padding0__; - } - OpenShock::Serialization::Types::ShockerModelType model() const { - return static_cast(::flatbuffers::EndianScalar(model_)); - } - uint16_t id() const { - return ::flatbuffers::EndianScalar(id_); - } - OpenShock::Serialization::Types::ShockerCommandType type() const { - return static_cast(::flatbuffers::EndianScalar(type_)); - } - uint8_t intensity() const { - return ::flatbuffers::EndianScalar(intensity_); - } - uint16_t duration() const { - return ::flatbuffers::EndianScalar(duration_); - } -}; -FLATBUFFERS_STRUCT_END(ShockerCommand, 8); - -struct ShockerCommand::Traits { - using type = ShockerCommand; -}; - -FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(1) CaptivePortalConfig FLATBUFFERS_FINAL_CLASS { - private: - uint8_t enabled_; - - public: - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.CaptivePortalConfig"; - } - CaptivePortalConfig() - : enabled_(0) { - } - CaptivePortalConfig(bool _enabled) - : enabled_(::flatbuffers::EndianScalar(static_cast(_enabled))) { - } - bool enabled() const { - return ::flatbuffers::EndianScalar(enabled_) != 0; - } -}; -FLATBUFFERS_STRUCT_END(CaptivePortalConfig, 1); - -struct CaptivePortalConfig::Traits { - using type = CaptivePortalConfig; -}; - -struct ShockerCommandList FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef ShockerCommandListBuilder Builder; - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.ShockerCommandList"; - } - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_COMMANDS = 4 - }; - const ::flatbuffers::Vector *commands() const { - return GetPointer *>(VT_COMMANDS); - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffsetRequired(verifier, VT_COMMANDS) && - verifier.VerifyVector(commands()) && - verifier.EndTable(); - } -}; - -struct ShockerCommandListBuilder { - typedef ShockerCommandList Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_commands(::flatbuffers::Offset<::flatbuffers::Vector> commands) { - fbb_.AddOffset(ShockerCommandList::VT_COMMANDS, commands); - } - explicit ShockerCommandListBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - fbb_.Required(o, ShockerCommandList::VT_COMMANDS); - return o; - } -}; - -inline ::flatbuffers::Offset CreateShockerCommandList( - ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> commands = 0) { - ShockerCommandListBuilder builder_(_fbb); - builder_.add_commands(commands); - return builder_.Finish(); -} - -struct ShockerCommandList::Traits { - using type = ShockerCommandList; - static auto constexpr Create = CreateShockerCommandList; -}; - -inline ::flatbuffers::Offset CreateShockerCommandListDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *commands = nullptr) { - auto commands__ = commands ? _fbb.CreateVectorOfStructs(*commands) : 0; - return OpenShock::Serialization::CreateShockerCommandList( - _fbb, - commands__); -} - -struct ServerToDeviceMessage FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { - typedef ServerToDeviceMessageBuilder Builder; - struct Traits; - static FLATBUFFERS_CONSTEXPR_CPP11 const char *GetFullyQualifiedName() { - return "OpenShock.Serialization.ServerToDeviceMessage"; - } - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PAYLOAD_TYPE = 4, - VT_PAYLOAD = 6 - }; - OpenShock::Serialization::ServerToDeviceMessagePayload payload_type() const { - return static_cast(GetField(VT_PAYLOAD_TYPE, 0)); - } - const void *payload() const { - return GetPointer(VT_PAYLOAD); - } - template const T *payload_as() const; - const OpenShock::Serialization::ShockerCommandList *payload_as_ShockerCommandList() const { - return payload_type() == OpenShock::Serialization::ServerToDeviceMessagePayload::ShockerCommandList ? static_cast(payload()) : nullptr; - } - const OpenShock::Serialization::CaptivePortalConfig *payload_as_CaptivePortalConfig() const { - return payload_type() == OpenShock::Serialization::ServerToDeviceMessagePayload::CaptivePortalConfig ? static_cast(payload()) : nullptr; - } - bool Verify(::flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PAYLOAD_TYPE, 1) && - VerifyOffset(verifier, VT_PAYLOAD) && - VerifyServerToDeviceMessagePayload(verifier, payload(), payload_type()) && - verifier.EndTable(); - } -}; - -template<> inline const OpenShock::Serialization::ShockerCommandList *ServerToDeviceMessage::payload_as() const { - return payload_as_ShockerCommandList(); -} - -template<> inline const OpenShock::Serialization::CaptivePortalConfig *ServerToDeviceMessage::payload_as() const { - return payload_as_CaptivePortalConfig(); -} - -struct ServerToDeviceMessageBuilder { - typedef ServerToDeviceMessage Table; - ::flatbuffers::FlatBufferBuilder &fbb_; - ::flatbuffers::uoffset_t start_; - void add_payload_type(OpenShock::Serialization::ServerToDeviceMessagePayload payload_type) { - fbb_.AddElement(ServerToDeviceMessage::VT_PAYLOAD_TYPE, static_cast(payload_type), 0); - } - void add_payload(::flatbuffers::Offset payload) { - fbb_.AddOffset(ServerToDeviceMessage::VT_PAYLOAD, payload); - } - explicit ServerToDeviceMessageBuilder(::flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ::flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = ::flatbuffers::Offset(end); - return o; - } -}; - -inline ::flatbuffers::Offset CreateServerToDeviceMessage( - ::flatbuffers::FlatBufferBuilder &_fbb, - OpenShock::Serialization::ServerToDeviceMessagePayload payload_type = OpenShock::Serialization::ServerToDeviceMessagePayload::NONE, - ::flatbuffers::Offset payload = 0) { - ServerToDeviceMessageBuilder builder_(_fbb); - builder_.add_payload(payload); - builder_.add_payload_type(payload_type); - return builder_.Finish(); -} - -struct ServerToDeviceMessage::Traits { - using type = ServerToDeviceMessage; - static auto constexpr Create = CreateServerToDeviceMessage; -}; - -inline bool VerifyServerToDeviceMessagePayload(::flatbuffers::Verifier &verifier, const void *obj, ServerToDeviceMessagePayload type) { - switch (type) { - case ServerToDeviceMessagePayload::NONE: { - return true; - } - case ServerToDeviceMessagePayload::ShockerCommandList: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case ServerToDeviceMessagePayload::CaptivePortalConfig: { - return verifier.VerifyField(static_cast(obj), 0, 1); - } - default: return true; - } -} - -inline bool VerifyServerToDeviceMessagePayloadVector(::flatbuffers::Verifier &verifier, const ::flatbuffers::Vector<::flatbuffers::Offset> *values, const ::flatbuffers::Vector *types) { - if (!values || !types) return !values && !types; - if (values->size() != types->size()) return false; - for (::flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { - if (!VerifyServerToDeviceMessagePayload( - verifier, values->Get(i), types->GetEnum(i))) { - return false; - } - } - return true; -} - -inline const OpenShock::Serialization::ServerToDeviceMessage *GetServerToDeviceMessage(const void *buf) { - return ::flatbuffers::GetRoot(buf); -} - -inline const OpenShock::Serialization::ServerToDeviceMessage *GetSizePrefixedServerToDeviceMessage(const void *buf) { - return ::flatbuffers::GetSizePrefixedRoot(buf); -} - -inline bool VerifyServerToDeviceMessageBuffer( - ::flatbuffers::Verifier &verifier) { - return verifier.VerifyBuffer(nullptr); -} - -inline bool VerifySizePrefixedServerToDeviceMessageBuffer( - ::flatbuffers::Verifier &verifier) { - return verifier.VerifySizePrefixedBuffer(nullptr); -} - -inline void FinishServerToDeviceMessageBuffer( - ::flatbuffers::FlatBufferBuilder &fbb, - ::flatbuffers::Offset root) { - fbb.Finish(root); -} - -inline void FinishSizePrefixedServerToDeviceMessageBuffer( - ::flatbuffers::FlatBufferBuilder &fbb, - ::flatbuffers::Offset root) { - fbb.FinishSizePrefixed(root); -} - -} // namespace Serialization -} // namespace OpenShock - -#endif // FLATBUFFERS_GENERATED_SERVERTODEVICEMESSAGE_OPENSHOCK_SERIALIZATION_H_ diff --git a/include/util/HexUtils.h b/include/util/HexUtils.h index d5344abe..d723fa91 100644 --- a/include/util/HexUtils.h +++ b/include/util/HexUtils.h @@ -28,6 +28,19 @@ namespace OpenShock::HexUtils { output[N * 2] = '\0'; } + /// @brief Converts a byte array to a hex string. + /// @param data The byte array to convert. + /// @param output The output buffer to write to. + /// @param upper Whether to use uppercase hex characters. + /// @remark To use this you must specify the size of the array in the template parameter. (e.g. ToHexMac<6>(...)) + template + constexpr void ToHex(const std::uint8_t (&data)[N], std::array& output, bool upper = true) noexcept { + for (std::size_t i = 0; i < N; ++i) { + ToHex(data[i], &output[i * 2], upper); + } + output[N * 2] = '\0'; + } + /// @brief Converts a byte array to a hex string. /// @param data The byte array to convert. /// @param upper Whether to use uppercase hex characters. @@ -36,7 +49,7 @@ namespace OpenShock::HexUtils { template constexpr std::array ToHex(const std::uint8_t (&data)[N], bool upper = true) noexcept { std::array output {}; - ToHex(data, output, upper); + ToHex(data, output, upper); return output; } @@ -127,4 +140,27 @@ namespace OpenShock::HexUtils { inline std::size_t TryParseHexMac(const char* str, std::uint8_t* out, std::size_t outLen) noexcept { return TryParseHexMac(str, strlen(str), out, outLen); } + + constexpr std::size_t TryParseHex(const char* str, std::size_t strLen, std::uint8_t* out, std::size_t outLen) noexcept { + std::size_t parsedLength = strLen / 2; + + if (parsedLength * 2 != strLen) { + return 0; // Invalid hex string length. + } + + if (parsedLength > outLen) { + return 0; // Output buffer is too small. + } + + for (std::size_t i = 0; i < parsedLength; ++i) { + if (!TryParseHexPair(str[i * 2], str[i * 2 + 1], out[i])) { + return 0; // Invalid hex pair. + } + } + + return parsedLength; + } + inline std::size_t TryParseHex(const char* str, std::uint8_t* out, std::size_t outLen) noexcept { + return TryParseHex(str, strlen(str), out, outLen); + } } // namespace OpenShock::HexUtils diff --git a/include/util/PartitionUtils.h b/include/util/PartitionUtils.h new file mode 100644 index 00000000..0ff32a5a --- /dev/null +++ b/include/util/PartitionUtils.h @@ -0,0 +1,13 @@ +#pragma once + +#include "StringView.h" + +#include + +#include +#include + +namespace OpenShock { + bool TryGetPartitionHash(const esp_partition_t* partition, char (&hash)[65]); + bool FlashPartitionFromUrl(const esp_partition_t* partition, StringView remoteUrl, const std::uint8_t (&remoteHash)[32], std::function progressCallback = nullptr); +} diff --git a/include/util/StringUtils.h b/include/util/StringUtils.h new file mode 100644 index 00000000..1b2cc8c0 --- /dev/null +++ b/include/util/StringUtils.h @@ -0,0 +1,8 @@ +#pragma once + +#include +#include + +namespace OpenShock { + bool FormatToString(std::string& out, const char* format, ...); +} // namespace OpenShock diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index 94b656c2..b71c156e 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -1,3 +1,5 @@ +include "./Types/FirmwareBootType.fbs"; + namespace OpenShock.Serialization.Configuration; table RFConfig { @@ -49,6 +51,45 @@ table SerialInputConfig { echo_enabled:bool = true; } +enum OtaUpdateChannel:uint8 { + Stable = 0, + Beta = 1, + Develop = 2 +} + +// Represents configuration for Over-The-Air (OTA) updates. +table OtaUpdateConfig { + /// Indicates whether OTA updates are enabled. + is_enabled:bool; + + /// The domain name of the OTA Content Delivery Network (CDN). + cdn_domain:string; + + /// The update channel to use. + update_channel:OtaUpdateChannel; + + /// Indicates whether to check for updates on startup. + check_on_startup:bool; + + /// Indicates whether to check for updates periodically. + check_periodically:bool; + + /// The interval in minutes between periodic update checks. + check_interval:uint16; + + /// Indicates if the backend is authorized to manage the device's update version on behalf of the user. + allow_backend_management:bool; + + /// Indicates if manual approval via serial input or captive portal is required before installing updates. + require_manual_approval:bool; + + /// Update process ID, used to track the update process server-side across reboots. + update_id:int32; + + /// Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) + boot_type:Types.FirmwareBootType; +} + table Config { /// RF Transmitter configuration rf:RFConfig; @@ -64,4 +105,7 @@ table Config { /// Serial input configuration serial_input:SerialInputConfig; + + /// OTA update configuration + ota_update:OtaUpdateConfig; } diff --git a/schemas/DeviceToGatewayMessage.fbs b/schemas/DeviceToGatewayMessage.fbs new file mode 100644 index 00000000..e2e7e252 --- /dev/null +++ b/schemas/DeviceToGatewayMessage.fbs @@ -0,0 +1,57 @@ +include "./Types/SemVer.fbs"; +include "./Types/FirmwareBootType.fbs"; + +attribute "fs_serializer"; + +namespace OpenShock.Serialization.Gateway; + +struct KeepAlive { + uptime:ulong; +} + +table BootStatus { + boot_type:Types.FirmwareBootType; + firmware_version:Types.SemVer; + ota_update_id:int32; +} + +table OtaInstallStarted { + update_id:int32; + version:Types.SemVer; +} + +enum OtaInstallProgressTask:byte { + FetchingMetadata, + PreparingForInstall, + FlashingFilesystem, + VerifyingFilesystem, + FlashingApplication, + MarkingApplicationBootable, + Rebooting +} + +table OtaInstallProgress { + update_id:int32; + task:OtaInstallProgressTask; + progress:float; +} + +table OtaInstallFailed { + update_id:int32; + message:string; + fatal:bool; +} + +union DeviceToGatewayMessagePayload { + KeepAlive, + BootStatus, + OtaInstallStarted, + OtaInstallProgress, + OtaInstallFailed +} + +table DeviceToGatewayMessage (fs_serializer) { + payload:DeviceToGatewayMessagePayload; +} + +root_type DeviceToGatewayMessage; diff --git a/schemas/DeviceToServerMessage.fbs b/schemas/DeviceToServerMessage.fbs deleted file mode 100644 index 5d42b1a8..00000000 --- a/schemas/DeviceToServerMessage.fbs +++ /dev/null @@ -1,17 +0,0 @@ -attribute "fs_serializer"; - -namespace OpenShock.Serialization; - -struct KeepAlive { - uptime:ulong; -} - -union DeviceToServerMessagePayload { - KeepAlive -} - -table DeviceToServerMessage (fs_serializer) { - payload:DeviceToServerMessagePayload; -} - -root_type DeviceToServerMessage; diff --git a/schemas/ServerToDeviceMessage.fbs b/schemas/GatewayToDeviceMessage.fbs similarity index 53% rename from schemas/ServerToDeviceMessage.fbs rename to schemas/GatewayToDeviceMessage.fbs index 0936c673..141d483d 100644 --- a/schemas/ServerToDeviceMessage.fbs +++ b/schemas/GatewayToDeviceMessage.fbs @@ -1,9 +1,10 @@ include "./Types/ShockerCommandType.fbs"; include "./Types/ShockerModelType.fbs"; +include "./Types/SemVer.fbs"; attribute "fs_serializer"; -namespace OpenShock.Serialization; +namespace OpenShock.Serialization.Gateway; struct ShockerCommand { model:Types.ShockerModelType; @@ -21,13 +22,19 @@ struct CaptivePortalConfig { enabled:bool; } -union ServerToDeviceMessagePayload { +// Begin installing an OTA update +table OtaInstall { + version:Types.SemVer; +} + +union GatewayToDeviceMessagePayload { ShockerCommandList, - CaptivePortalConfig + CaptivePortalConfig, + OtaInstall } -table ServerToDeviceMessage (fs_serializer) { - payload:ServerToDeviceMessagePayload; +table GatewayToDeviceMessage (fs_serializer) { + payload:GatewayToDeviceMessagePayload; } -root_type ServerToDeviceMessage; +root_type GatewayToDeviceMessage; diff --git a/schemas/LocalToDeviceMessage.fbs b/schemas/LocalToDeviceMessage.fbs index 609ea198..12964936 100644 --- a/schemas/LocalToDeviceMessage.fbs +++ b/schemas/LocalToDeviceMessage.fbs @@ -20,6 +20,35 @@ struct WifiNetworkDisconnectCommand { placeholder:bool; } +struct OtaUpdateSetIsEnabledCommand { + enabled:bool; +} +table OtaUpdateSetDomainCommand { + domain:string; +} +table OtaUpdateSetUpdateChannelCommand { + channel:string; +} +struct OtaUpdateSetCheckIntervalCommand { + interval:uint16; +} +struct OtaUpdateSetAllowBackendManagementCommand { + allow:bool; +} +struct OtaUpdateSetRequireManualApprovalCommand { + require:bool; +} +struct OtaUpdateHandleUpdateRequestCommand { + accept:bool; +} +table OtaUpdateCheckForUpdatesCommand { + channel:string; +} +table OtaUpdateStartUpdateCommand { + channel:string; + version:string; +} + table AccountLinkCommand { code:string; } @@ -39,6 +68,17 @@ union LocalToDeviceMessagePayload { WifiNetworkConnectCommand, WifiNetworkDisconnectCommand, + // OTA stuff + OtaUpdateSetIsEnabledCommand, + OtaUpdateSetDomainCommand, + OtaUpdateSetUpdateChannelCommand, + OtaUpdateSetCheckIntervalCommand, + OtaUpdateSetAllowBackendManagementCommand, + OtaUpdateSetRequireManualApprovalCommand, + OtaUpdateHandleUpdateRequestCommand, + OtaUpdateCheckForUpdatesCommand, + OtaUpdateStartUpdateCommand, + // Account linking stuff AccountLinkCommand, AccountUnlinkCommand, diff --git a/schemas/Types/FirmwareBootType.fbs b/schemas/Types/FirmwareBootType.fbs new file mode 100644 index 00000000..2055b6dc --- /dev/null +++ b/schemas/Types/FirmwareBootType.fbs @@ -0,0 +1,7 @@ +namespace OpenShock.Serialization.Types; + +enum FirmwareBootType : uint8 { + Normal = 0, + NewFirmware = 1, + Rollback = 2, +} diff --git a/schemas/Types/SemVer.fbs b/schemas/Types/SemVer.fbs new file mode 100644 index 00000000..733f952e --- /dev/null +++ b/schemas/Types/SemVer.fbs @@ -0,0 +1,9 @@ +namespace OpenShock.Serialization.Types; + +table SemVer { + major: uint16; + minor: uint16; + patch: uint16; + prerelease: string; + build: string; +} diff --git a/src/CaptivePortal.cpp b/src/CaptivePortal.cpp index 2ce4ad16..b26a2d7b 100644 --- a/src/CaptivePortal.cpp +++ b/src/CaptivePortal.cpp @@ -5,6 +5,7 @@ #include "config/Config.h" #include "GatewayConnectionManager.h" #include "Logging.h" +#include "Time.h" #include #include @@ -19,6 +20,7 @@ static const char* TAG = "CaptivePortal"; using namespace OpenShock; static bool s_alwaysEnabled = false; +static bool s_forceClosed = false; static std::unique_ptr s_instance = nullptr; bool _startCaptive() { @@ -92,18 +94,38 @@ bool CaptivePortal::IsAlwaysEnabled() { return s_alwaysEnabled; } +bool CaptivePortal::ForceClose(std::uint32_t timeoutMs) { + s_forceClosed = true; + + if (s_instance == nullptr) return true; + + while (timeoutMs > 0) { + std::uint32_t delay = std::min(timeoutMs, 10U); + + vTaskDelay(pdMS_TO_TICKS(delay)); + + timeoutMs -= delay; + + if (s_instance == nullptr) return true; + } + + return false; +} + bool CaptivePortal::IsRunning() { return s_instance != nullptr; } + void CaptivePortal::Update() { bool gatewayConnected = GatewayConnectionManager::IsConnected(); bool commandHandlerOk = CommandHandler::Ok(); - bool shouldBeRunning = s_alwaysEnabled || !gatewayConnected || !commandHandlerOk; + bool shouldBeRunning = (s_alwaysEnabled || !gatewayConnected || !commandHandlerOk) && !s_forceClosed; if (s_instance == nullptr) { if (shouldBeRunning) { ESP_LOGD(TAG, "Starting captive portal"); ESP_LOGD(TAG, " alwaysEnabled: %s", s_alwaysEnabled ? "true" : "false"); + ESP_LOGD(TAG, " forceClosed: %s", s_forceClosed ? "true" : "false"); ESP_LOGD(TAG, " isConnected: %s", gatewayConnected ? "true" : "false"); ESP_LOGD(TAG, " commandHandlerOk: %s", commandHandlerOk ? "true" : "false"); _startCaptive(); @@ -114,6 +136,7 @@ void CaptivePortal::Update() { if (!shouldBeRunning) { ESP_LOGD(TAG, "Stopping captive portal"); ESP_LOGD(TAG, " alwaysEnabled: %s", s_alwaysEnabled ? "true" : "false"); + ESP_LOGD(TAG, " forceClosed: %s", s_forceClosed ? "true" : "false"); ESP_LOGD(TAG, " isConnected: %s", gatewayConnected ? "true" : "false"); ESP_LOGD(TAG, " commandHandlerOk: %s", commandHandlerOk ? "true" : "false"); _stopCaptive(); diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 440540e0..7581c716 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -6,12 +6,12 @@ #include "Logging.h" #include "serialization/WSLocal.h" #include "util/HexUtils.h" +#include "util/PartitionUtils.h" #include "util/TaskUtils.h" #include "wifi/WiFiManager.h" #include "serialization/_fbs/DeviceToLocalMessage_generated.h" -#include #include static const char* TAG = "CaptivePortalInstance"; @@ -40,44 +40,25 @@ const esp_partition_t* _getStaticPartition() { return nullptr; } -bool _tryGetPartitionHash(char (&buffer)[65]) { - static bool initialized = false; - static std::uint8_t staticSha256[32] = {0}; - - if (!initialized) { - initialized = true; - - ESP_LOGD(TAG, "Looking for static partition"); - - // Get the static partition - const esp_partition_t* partition = _getStaticPartition(); - if (partition == nullptr) { - ESP_LOGE(TAG, "Failed to find static partition"); - return false; - } - - ESP_LOGD(TAG, "Found static partition, getting hash..."); - - // Get the hash of the partition - esp_err_t err = esp_partition_get_sha256(partition, staticSha256); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to get partition hash: %s", esp_err_to_name(err)); - return false; - } - - ESP_LOGD(TAG, "Got partition hash"); +const char* _getPartitionHash() { + const esp_partition_t* partition = _getStaticPartition(); + if (partition == nullptr) { + return nullptr; } - // Copy the hash to the output buffer - HexUtils::ToHex<32>(staticSha256, buffer, false); + static char hash[65]; + if (!OpenShock::TryGetPartitionHash(partition, hash)) { + return nullptr; + } - return true; + return hash; } CaptivePortalInstance::CaptivePortalInstance() : m_webServer(HTTP_PORT) , m_socketServer(WEBSOCKET_PORT, "/ws", "json") , m_socketDeFragger(std::bind(&CaptivePortalInstance::handleWebSocketEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)) + , m_fileSystem() , m_dnsServer() , m_taskHandle(nullptr) { m_socketServer.onEvent(std::bind(&WebSocketDeFragger::handler, &m_socketDeFragger, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); @@ -87,14 +68,25 @@ CaptivePortalInstance::CaptivePortalInstance() ESP_LOGI(TAG, "Setting up DNS server"); m_dnsServer.start(DNS_PORT, "*", WiFi.softAPIP()); - // Check if the www folder exists and is populated - bool indexExists = LittleFS.exists("/www/index.html.gz"); + bool fsOk = true; // Get the hash of the filesystem - char fsHash[65]; - bool gotFsHash = _tryGetPartitionHash(fsHash); + const char* fsHash = _getPartitionHash(); + if (fsHash == nullptr) { + ESP_LOGE(TAG, "Failed to get filesystem hash"); + fsOk = false; + } + + if (fsOk) { + // Mounting LittleFS + if (!m_fileSystem.begin(false, "/static", 10U, "static0")) { + ESP_LOGE(TAG, "Failed to mount LittleFS"); + fsOk = false; + } else { + fsOk = m_fileSystem.exists("/www/index.html.gz"); + } + } - bool fsOk = indexExists && gotFsHash; if (fsOk) { ESP_LOGI(TAG, "Serving files from LittleFS"); ESP_LOGI(TAG, "Filesystem hash: %s", fsHash); @@ -103,7 +95,7 @@ CaptivePortalInstance::CaptivePortalInstance() snprintf(softAPURL, sizeof(softAPURL), "http://%s", WiFi.softAPIP().toString().c_str()); // Serving the captive portal files from LittleFS - m_webServer.serveStatic("/", LittleFS, "/www/", "max-age=3600").setDefaultFile("index.html").setSharedEtag(fsHash); + m_webServer.serveStatic("/", m_fileSystem, "/www/", "max-age=3600").setDefaultFile("index.html").setSharedEtag(fsHash); // Redirecting connection tests to the captive portal, triggering the "login to network" prompt m_webServer.onNotFound([softAPURL](AsyncWebServerRequest* request) { request->redirect(softAPURL); }); @@ -142,6 +134,7 @@ CaptivePortalInstance::~CaptivePortalInstance() { } m_webServer.end(); m_socketServer.close(); + m_fileSystem.end(); m_dnsServer.stop(); } @@ -150,7 +143,7 @@ void CaptivePortalInstance::task(void* arg) { while (true) { instance->m_socketServer.loop(); - instance->m_dnsServer.processNextRequest(); + // instance->m_dnsServer.processNextRequest(); vTaskDelay(pdMS_TO_TICKS(WEBSOCKET_UPDATE_INTERVAL)); } } diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index eedfa9fe..2e9d7303 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -1,16 +1,18 @@ #include "GatewayClient.h" +#include "config/Config.h" #include "event_handlers/WebSocket.h" #include "Logging.h" +#include "serialization/WSGateway.h" #include "Time.h" #include "util/CertificateUtils.h" -#include "serialization/_fbs/DeviceToServerMessage_generated.h" - const char* const TAG = "GatewayClient"; using namespace OpenShock; +static bool s_bootStatusSent = false; + GatewayClient::GatewayClient(const std::string& authToken) : m_webSocket(), m_lastKeepAlive(0), m_state(State::Disconnected) { ESP_LOGD(TAG, "Creating GatewayClient"); @@ -58,6 +60,22 @@ void GatewayClient::disconnect() { m_webSocket.disconnect(); } +bool GatewayClient::sendMessageTXT(StringView data) { + if (m_state != State::Connected) { + return false; + } + + return m_webSocket.sendTXT(data.data(), data.length()); +} + +bool GatewayClient::sendMessageBIN(const std::uint8_t* data, std::size_t length) { + if (m_state != State::Connected) { + return false; + } + + return m_webSocket.sendBIN(data, length); +} + bool GatewayClient::loop() { if (m_state == State::Disconnected) { return false; @@ -85,24 +103,38 @@ bool GatewayClient::loop() { void GatewayClient::_sendKeepAlive() { ESP_LOGV(TAG, "Sending Gateway keep-alive message"); + Serialization::Gateway::SerializeKeepAliveMessage([this](const std::uint8_t* data, std::size_t len) { return m_webSocket.sendBIN(data, len); }); +} - // Casting to uint64 here is safe since millis is guaranteed to return a positive value - OpenShock::Serialization::KeepAlive keepAlive(static_cast(OpenShock::millis())); +void GatewayClient::_sendBootStatus() { + if (s_bootStatusSent) return; - flatbuffers::FlatBufferBuilder builder(64); + ESP_LOGV(TAG, "Sending Gateway boot status message"); - auto keepAliveOffset = builder.CreateStruct(keepAlive); + std::int32_t updateId; + if (!Config::GetOtaUpdateId(updateId)) { + ESP_LOGE(TAG, "Failed to get OTA update ID"); + return; + } - auto msg = OpenShock::Serialization::CreateDeviceToServerMessage(builder, OpenShock::Serialization::DeviceToServerMessagePayload::KeepAlive, keepAliveOffset.Union()); + OpenShock::FirmwareBootType bootType; + if (!Config::GetOtaFirmwareBootType(bootType)) { + ESP_LOGE(TAG, "Failed to get OTA firmware boot type"); + return; + } - builder.Finish(msg); + OpenShock::SemVer version; + if (!OpenShock::TryParseSemVer(OPENSHOCK_FW_VERSION, version)) { + ESP_LOGE(TAG, "Failed to parse firmware version"); + return; + } - m_webSocket.sendBIN(builder.GetBufferPointer(), builder.GetSize()); + s_bootStatusSent = Serialization::Gateway::SerializeBootStatusMessage(updateId, bootType, version, [this](const std::uint8_t* data, std::size_t len) { return m_webSocket.sendBIN(data, len); }); } void GatewayClient::_handleEvent(WStype_t type, std::uint8_t* payload, std::size_t length) { (void)payload; - + switch (type) { case WStype_DISCONNECTED: ESP_LOGI(TAG, "Disconnected from API"); @@ -112,6 +144,7 @@ void GatewayClient::_handleEvent(WStype_t type, std::uint8_t* payload, std::size ESP_LOGI(TAG, "Connected to API"); m_state = State::Connected; _sendKeepAlive(); + _sendBootStatus(); break; case WStype_TEXT: ESP_LOGW(TAG, "Received text from API, JSON parsing is not supported anymore :D"); diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 1330cdd0..cd8c4471 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -120,6 +120,22 @@ void GatewayConnectionManager::UnLink() { Config::ClearBackendAuthToken(); } +bool GatewayConnectionManager::SendMessageTXT(StringView data) { + if (s_wsClient == nullptr) { + return false; + } + + return s_wsClient->sendMessageTXT(data); +} + +bool GatewayConnectionManager::SendMessageBIN(const std::uint8_t* data, std::size_t length) { + if (s_wsClient == nullptr) { + return false; + } + + return s_wsClient->sendMessageBIN(data, length); +} + bool FetchDeviceInfo(const String& authToken) { // TODO: this function is very slow, should be optimized! if ((s_flags & FLAG_HAS_IP) == 0) { diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp new file mode 100644 index 00000000..a6da621a --- /dev/null +++ b/src/OtaUpdateManager.cpp @@ -0,0 +1,655 @@ +#include "OtaUpdateManager.h" + +#include "CaptivePortal.h" +#include "config/Config.h" +#include "Constants.h" +#include "GatewayConnectionManager.h" +#include "Hashing.h" +#include "http/HTTPRequestManager.h" +#include "Logging.h" +#include "SemVer.h" +#include "serialization/WSGateway.h" +#include "StringView.h" +#include "Time.h" +#include "util/HexUtils.h" +#include "util/PartitionUtils.h" +#include "util/StringUtils.h" +#include "util/TaskUtils.h" +#include "wifi/WiFiManager.h" + +#include + +#include +#include + +#include + +#define OPENSHOCK_FW_CDN_CHANNEL_URL(ch) OPENSHOCK_FW_CDN_URL("/version-" ch ".txt") + +#define OPENSHOCK_FW_CDN_STABLE_URL OPENSHOCK_FW_CDN_CHANNEL_URL("stable") +#define OPENSHOCK_FW_CDN_BETA_URL OPENSHOCK_FW_CDN_CHANNEL_URL("beta") +#define OPENSHOCK_FW_CDN_DEVELOP_URL OPENSHOCK_FW_CDN_CHANNEL_URL("develop") + +#define OPENSHOCK_FW_CDN_BOARDS_BASE_URL_FORMAT OPENSHOCK_FW_CDN_URL("/%s") +#define OPENSHOCK_FW_CDN_BOARDS_INDEX_URL_FORMAT OPENSHOCK_FW_CDN_BOARDS_BASE_URL_FORMAT "/boards.txt" + +#define OPENSHOCK_FW_CDN_VERSION_BASE_URL_FORMAT OPENSHOCK_FW_CDN_BOARDS_BASE_URL_FORMAT "/" OPENSHOCK_FW_BOARD + +#define OPENSHOCK_FW_CDN_APP_URL_FORMAT OPENSHOCK_FW_CDN_VERSION_BASE_URL_FORMAT "/app.bin" +#define OPENSHOCK_FW_CDN_FILESYSTEM_URL_FORMAT OPENSHOCK_FW_CDN_VERSION_BASE_URL_FORMAT "/staticfs.bin" +#define OPENSHOCK_FW_CDN_SHA256_HASHES_URL_FORMAT OPENSHOCK_FW_CDN_VERSION_BASE_URL_FORMAT "/hashes.sha256.txt" + +const char* const TAG = "OtaUpdateManager"; + +/// @brief Stops initArduino() from handling OTA rollbacks +/// @todo Get rid of Arduino entirely. >:( +/// +/// @see .platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal-misc.c +/// @return true +bool verifyRollbackLater() { + return true; +} + +using namespace OpenShock; + +enum OtaTaskEventFlag : std::uint32_t { + OTA_TASK_EVENT_UPDATE_REQUESTED = 1 << 0, + OTA_TASK_EVENT_WIFI_DISCONNECTED = 1 << 1, // If both connected and disconnected are set, disconnected takes priority. + OTA_TASK_EVENT_WIFI_CONNECTED = 1 << 2, +}; + +static bool _otaValidatingApp = false; +static TaskHandle_t _taskHandle; +static OpenShock::SemVer _requestedVersion; +static SemaphoreHandle_t _requestedVersionMutex = xSemaphoreCreateMutex(); + +bool _tryQueueUpdateRequest(const OpenShock::SemVer& version) { + if (xSemaphoreTake(_requestedVersionMutex, pdMS_TO_TICKS(1000)) != pdTRUE) { + ESP_LOGE(TAG, "Failed to take requested version mutex"); + return false; + } + + _requestedVersion = version; + + xSemaphoreGive(_requestedVersionMutex); + + xTaskNotify(_taskHandle, OTA_TASK_EVENT_UPDATE_REQUESTED, eSetBits); + + return true; +} + +bool _tryGetRequestedVersion(OpenShock::SemVer& version) { + if (xSemaphoreTake(_requestedVersionMutex, pdMS_TO_TICKS(1000)) != pdTRUE) { + ESP_LOGE(TAG, "Failed to take requested version mutex"); + return false; + } + + version = _requestedVersion; + + xSemaphoreGive(_requestedVersionMutex); + + return true; +} + +void _otaEvGotIPHandler(arduino_event_t* event) { + (void)event; + xTaskNotify(_taskHandle, OTA_TASK_EVENT_WIFI_CONNECTED, eSetBits); +} +void _otaEvWiFiDisconnectedHandler(arduino_event_t* event) { + (void)event; + xTaskNotify(_taskHandle, OTA_TASK_EVENT_WIFI_DISCONNECTED, eSetBits); +} + +bool _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask task, float progress) { + std::int32_t updateId; + if (!Config::GetOtaUpdateId(updateId)) { + ESP_LOGE(TAG, "Failed to get OTA update ID"); + return false; + } + + if (!Serialization::Gateway::SerializeOtaInstallProgressMessage(updateId, task, progress, GatewayConnectionManager::SendMessageBIN)) { + ESP_LOGE(TAG, "Failed to send OTA install progress message"); + return false; + } + + return true; +} +bool _sendFailureMessage(StringView message, bool fatal = false) { + std::int32_t updateId; + if (!Config::GetOtaUpdateId(updateId)) { + ESP_LOGE(TAG, "Failed to get OTA update ID"); + return false; + } + + if (!Serialization::Gateway::SerializeOtaInstallFailedMessage(updateId, message, fatal, GatewayConnectionManager::SendMessageBIN)) { + ESP_LOGE(TAG, "Failed to send OTA install failed message"); + return false; + } + + return true; +} + +bool _flashAppPartition(const esp_partition_t* partition, StringView remoteUrl, const std::uint8_t (&remoteHash)[32]) { + ESP_LOGD(TAG, "Flashing app partition"); + + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::FlashingApplication, 0.0f)) { + return false; + } + + auto onProgress = [](std::size_t current, std::size_t total, float progress) -> bool { + ESP_LOGD(TAG, "Flashing app partition: %u / %u (%.2f%%)", current, total, progress * 100.0f); + + _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::FlashingApplication, progress); + + return true; + }; + + if (!OpenShock::FlashPartitionFromUrl(partition, remoteUrl, remoteHash, onProgress)) { + ESP_LOGE(TAG, "Failed to flash app partition"); + _sendFailureMessage("Failed to flash app partition"); + return false; + } + + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::MarkingApplicationBootable, 0.0f)) { + return false; + } + + // Set app partition bootable. + if (esp_ota_set_boot_partition(partition) != ESP_OK) { + ESP_LOGE(TAG, "Failed to set app partition bootable"); + _sendFailureMessage("Failed to set app partition bootable"); + return false; + } + + return true; +} + +bool _flashFilesystemPartition(const esp_partition_t* parition, StringView remoteUrl, const std::uint8_t (&remoteHash)[32]) { + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::PreparingForInstall, 0.0f)) { + return false; + } + + // Make sure captive portal is stopped, timeout after 5 seconds. + if (!CaptivePortal::ForceClose(5000U)) { + ESP_LOGE(TAG, "Failed to force close captive portal (timed out)"); + _sendFailureMessage("Failed to force close captive portal (timed out)"); + return false; + } + + ESP_LOGD(TAG, "Flashing filesystem partition"); + + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::FlashingFilesystem, 0.0f)) { + return false; + } + + auto onProgress = [](std::size_t current, std::size_t total, float progress) -> bool { + ESP_LOGD(TAG, "Flashing filesystem partition: %u / %u (%.2f%%)", current, total, progress * 100.0f); + + _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::FlashingFilesystem, progress); + + return true; + }; + + if (!OpenShock::FlashPartitionFromUrl(parition, remoteUrl, remoteHash, onProgress)) { + ESP_LOGE(TAG, "Failed to flash filesystem partition"); + _sendFailureMessage("Failed to flash filesystem partition"); + return false; + } + + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::VerifyingFilesystem, 0.0f)) { + return false; + } + + // Attempt to mount filesystem. + fs::LittleFSFS test; + if (!test.begin(false, "/static", 10, "static0")) { + ESP_LOGE(TAG, "Failed to mount filesystem"); + _sendFailureMessage("Failed to mount filesystem"); + return false; + } + test.end(); + + OpenShock::CaptivePortal::ForceClose(false); + + return true; +} + +void _otaUpdateTask(void* arg) { + (void)arg; + + ESP_LOGD(TAG, "OTA update task started"); + + bool connected = false; + bool updateRequested = false; + std::int64_t lastUpdateCheck = 0; + + // Update task loop. + while (true) { + // Wait for event. + uint32_t eventBits = 0; + xTaskNotifyWait(0, UINT32_MAX, &eventBits, pdMS_TO_TICKS(5000)); // TODO: wait for rest time + + updateRequested |= (eventBits & OTA_TASK_EVENT_UPDATE_REQUESTED) != 0; + + if ((eventBits & OTA_TASK_EVENT_WIFI_DISCONNECTED) != 0) { + ESP_LOGD(TAG, "WiFi disconnected"); + connected = false; + continue; // No further processing needed. + } + + if ((eventBits & OTA_TASK_EVENT_WIFI_CONNECTED) != 0 && !connected) { + ESP_LOGD(TAG, "WiFi connected"); + connected = true; + } + + // If we're not connected, continue. + if (!connected) { + ESP_LOGD(TAG, "Not connected, skipping update check"); + continue; + } + + std::int64_t now = OpenShock::millis(); + + Config::OtaUpdateConfig config; + if (!Config::GetOtaUpdateConfig(config)) { + ESP_LOGE(TAG, "Failed to get OTA update config"); + continue; + } + + if (!config.isEnabled) { + ESP_LOGD(TAG, "OTA updates are disabled, skipping update check"); + continue; + } + + bool firstCheck = lastUpdateCheck == 0; + std::int64_t diff = now - lastUpdateCheck; + std::int64_t diffMins = diff / 60'000LL; + + bool check = false; + check |= config.checkOnStartup && firstCheck; // On startup + check |= config.checkPeriodically && diffMins >= config.checkInterval; // Periodically + check |= updateRequested && (firstCheck || diffMins >= 1); // Update requested + + if (!check) { + continue; + } + + lastUpdateCheck = now; + + if (config.requireManualApproval) { + ESP_LOGD(TAG, "Manual approval required, skipping update check"); + // TODO: IMPLEMENT + continue; + } + + OpenShock::SemVer version; + if (updateRequested) { + updateRequested = false; + + if (!_tryGetRequestedVersion(version)) { + ESP_LOGE(TAG, "Failed to get requested version"); + continue; + } + + ESP_LOGD(TAG, "Update requested for version %s", version.toString().c_str()); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + } else { + ESP_LOGD(TAG, "Checking for updates"); + + // Fetch current version. + if (!OtaUpdateManager::TryGetFirmwareVersion(config.updateChannel, version)) { + ESP_LOGE(TAG, "Failed to fetch firmware version"); + continue; + } + + ESP_LOGD(TAG, "Remote version: %s", version.toString().c_str()); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + } + + if (version.toString() == OPENSHOCK_FW_VERSION) { // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + ESP_LOGI(TAG, "Requested version is already installed"); + continue; + } + + // Generate random int32_t for this update. + std::int32_t updateId = static_cast(esp_random()); + if (!Config::SetOtaUpdateId(updateId)) { + ESP_LOGE(TAG, "Failed to set OTA update ID"); + continue; + } + + if (!Serialization::Gateway::SerializeOtaInstallStartedMessage(updateId, version, GatewayConnectionManager::SendMessageBIN)) { + ESP_LOGE(TAG, "Failed to serialize OTA install started message"); + continue; + } + + if (!_sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::FetchingMetadata, 0.0f)) { + continue; + } + + // Fetch current release. + OtaUpdateManager::FirmwareRelease release; + if (!OtaUpdateManager::TryGetFirmwareRelease(version, release)) { + ESP_LOGE(TAG, "Failed to fetch firmware release"); // TODO: Send error message to server + _sendFailureMessage("Failed to fetch firmware release"); + continue; + } + + // Print release. + ESP_LOGD(TAG, "Firmware release:"); + ESP_LOGD(TAG, " Version: %s", version.toString().c_str()); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + ESP_LOGD(TAG, " App binary URL: %s", release.appBinaryUrl.c_str()); + ESP_LOGD(TAG, " App binary hash: %s", HexUtils::ToHex<32>(release.appBinaryHash).data()); + ESP_LOGD(TAG, " Filesystem binary URL: %s", release.filesystemBinaryUrl.c_str()); + ESP_LOGD(TAG, " Filesystem binary hash: %s", HexUtils::ToHex<32>(release.filesystemBinaryHash).data()); + + // Get available app update partition. + const esp_partition_t* appPartition = esp_ota_get_next_update_partition(nullptr); + if (appPartition == nullptr) { + ESP_LOGE(TAG, "Failed to get app update partition"); // TODO: Send error message to server + _sendFailureMessage("Failed to get app update partition"); + continue; + } + + // Get filesystem partition. + const esp_partition_t* filesystemPartition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "static0"); + if (filesystemPartition == nullptr) { + ESP_LOGE(TAG, "Failed to find filesystem partition"); // TODO: Send error message to server + _sendFailureMessage("Failed to find filesystem partition"); + continue; + } + + // Flash app and filesystem partitions. + if (!_flashFilesystemPartition(filesystemPartition, release.filesystemBinaryUrl, release.filesystemBinaryHash)) continue; + if (!_flashAppPartition(appPartition, release.appBinaryUrl, release.appBinaryHash)) continue; + + // Set OTA boot type in config. + if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::NewFirmware)) { + ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); + _sendFailureMessage("Failed to set OTA firmware boot type"); + continue; + } + + // Send reboot message. + _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::Rebooting, 0.0f); + + // Restart. + ESP_LOGI(TAG, "Restarting in 1 seconds..."); + vTaskDelay(pdMS_TO_TICKS(1000)); + esp_restart(); + + _sendFailureMessage("Well, this is awkward..."); + } +} + +bool _tryGetStringList(StringView url, std::vector& list) { + auto response = OpenShock::HTTP::GetString( + url, + { + {"Accept", "text/plain"} + }, + {200, 304} + ); + if (response.result != OpenShock::HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Failed to fetch list: [%u] %s", response.code, response.data.c_str()); + return false; + } + + list.clear(); + + OpenShock::StringView data = response.data; + + for (auto line : data.splitLines()) { + line = line.trim(); + + if (line.isNullOrEmpty()) { + continue; + } + + list.push_back(line.toString()); + } + + return true; +} + +bool OtaUpdateManager::Init() { + ESP_LOGD(TAG, "Fetching current partition"); + + // Fetch current partition info. + const esp_partition_t* partition = esp_ota_get_running_partition(); + if (partition == nullptr) { + ESP_PANIC(TAG, "Failed to get currently running partition"); + return false; // This will never be reached, but the compiler doesn't know that. + } + + ESP_LOGD(TAG, "Fetching partition state"); + + // Get OTA state for said partition. + esp_ota_img_states_t states; + esp_err_t err = esp_ota_get_state_partition(partition, &states); + if (err != ESP_OK) { + ESP_PANIC(TAG, "Failed to get partition state: %s", esp_err_to_name(err)); + return false; // This will never be reached, but the compiler doesn't know that. + } + + ESP_LOGD(TAG, "Partition state: %u", states); + + // If the currently booting partition is being verified, set correct state. + _otaValidatingApp = states == ESP_OTA_IMG_PENDING_VERIFY; + + // Configure event triggers. + Config::OtaUpdateConfig otaUpdateConfig; + if (!Config::GetOtaUpdateConfig(otaUpdateConfig)) { + ESP_LOGE(TAG, "Failed to get OTA update config"); + return false; + } + + WiFi.onEvent(_otaEvGotIPHandler, ARDUINO_EVENT_WIFI_STA_GOT_IP); + WiFi.onEvent(_otaEvGotIPHandler, ARDUINO_EVENT_WIFI_STA_GOT_IP6); + WiFi.onEvent(_otaEvWiFiDisconnectedHandler, ARDUINO_EVENT_WIFI_STA_DISCONNECTED); + + // Start OTA update task. + TaskUtils::TaskCreateExpensive(_otaUpdateTask, "OTA Update", 8192, nullptr, 1, &_taskHandle); + + return true; +} + +bool OtaUpdateManager::TryGetFirmwareVersion(OtaUpdateChannel channel, OpenShock::SemVer& version) { + const char* channelIndexUrl = nullptr; + switch (channel) { + case OtaUpdateChannel::Stable: + channelIndexUrl = OPENSHOCK_FW_CDN_STABLE_URL; + break; + case OtaUpdateChannel::Beta: + channelIndexUrl = OPENSHOCK_FW_CDN_BETA_URL; + break; + case OtaUpdateChannel::Develop: + channelIndexUrl = OPENSHOCK_FW_CDN_DEVELOP_URL; + break; + default: + ESP_LOGE(TAG, "Unknown channel: %u", channel); + return false; + } + + ESP_LOGD(TAG, "Fetching firmware version from %s", channelIndexUrl); + + auto response = OpenShock::HTTP::GetString( + channelIndexUrl, + { + {"Accept", "text/plain"} + }, + {200, 304} + ); + if (response.result != OpenShock::HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Failed to fetch firmware version: [%u] %s", response.code, response.data.c_str()); + return false; + } + + if (!OpenShock::TryParseSemVer(response.data, version)) { + ESP_LOGE(TAG, "Failed to parse firmware version: %.*s", response.data.size(), response.data.data()); + return false; + } + + return true; +} + +bool OtaUpdateManager::TryGetFirmwareBoards(const OpenShock::SemVer& version, std::vector& boards) { + std::string channelIndexUrl; + if (!FormatToString(channelIndexUrl, OPENSHOCK_FW_CDN_BOARDS_INDEX_URL_FORMAT, version.toString().c_str())) { // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + ESP_LOGE(TAG, "Failed to format URL"); + return false; + } + + ESP_LOGD(TAG, "Fetching firmware boards from %s", channelIndexUrl.c_str()); + + if (!_tryGetStringList(channelIndexUrl.c_str(), boards)) { + ESP_LOGE(TAG, "Failed to fetch firmware boards"); + return false; + } + + return true; +} + +bool _tryParseIntoHash(const std::string& hash, std::uint8_t (&hashBytes)[32]) { + if (!HexUtils::TryParseHex(hash.data(), hash.size(), hashBytes, 32)) { + ESP_LOGE(TAG, "Failed to parse hash: %.*s", hash.size(), hash.data()); + return false; + } + + return true; +} + +bool OtaUpdateManager::TryGetFirmwareRelease(const OpenShock::SemVer& version, FirmwareRelease& release) { + auto versionStr = version.toString(); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + + if (!FormatToString(release.appBinaryUrl, OPENSHOCK_FW_CDN_APP_URL_FORMAT, versionStr.c_str())) { + ESP_LOGE(TAG, "Failed to format URL"); + return false; + } + + if (!FormatToString(release.filesystemBinaryUrl, OPENSHOCK_FW_CDN_FILESYSTEM_URL_FORMAT, versionStr.c_str())) { + ESP_LOGE(TAG, "Failed to format URL"); + return false; + } + + // Construct hash URLs. + std::string sha256HashesUrl; + if (!FormatToString(sha256HashesUrl, OPENSHOCK_FW_CDN_SHA256_HASHES_URL_FORMAT, versionStr.c_str())) { + ESP_LOGE(TAG, "Failed to format URL"); + return false; + } + + // Fetch hashes. + auto sha256HashesResponse = OpenShock::HTTP::GetString( + sha256HashesUrl.c_str(), + { + {"Accept", "text/plain"} + }, + {200, 304} + ); + if (sha256HashesResponse.result != OpenShock::HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Failed to fetch hashes: [%u] %s", sha256HashesResponse.code, sha256HashesResponse.data.c_str()); + return false; + } + + auto hashesLines = OpenShock::StringView(sha256HashesResponse.data).splitLines(); + + // Parse hashes. + bool foundAppHash = false, foundFilesystemHash = false; + for (auto line : hashesLines) { + auto parts = line.splitWhitespace(); + if (parts.size() != 2) { + ESP_LOGE(TAG, "Invalid hashes entry: %.*s", line.size(), line.data()); + return false; + } + + auto hash = parts[0].trim(); + auto file = parts[1].trim(); + + if (file.startsWith("./")) { + file = file.substr(2); + } + + if (hash.size() != 64) { + ESP_LOGE(TAG, "Invalid hash: %.*s", hash.size(), hash.data()); + return false; + } + + if (file == "app.bin") { + if (foundAppHash) { + ESP_LOGE(TAG, "Duplicate hash for app.bin"); + return false; + } + + if (!_tryParseIntoHash(hash.toString(), release.appBinaryHash)) { + return false; + } + + foundAppHash = true; + } else if (file == "staticfs.bin") { + if (foundFilesystemHash) { + ESP_LOGE(TAG, "Duplicate hash for staticfs.bin"); + return false; + } + + if (!_tryParseIntoHash(hash.toString(), release.filesystemBinaryHash)) { + return false; + } + + foundFilesystemHash = true; + } + } + + return true; +} + +bool OtaUpdateManager::TryStartFirmwareInstallation(const OpenShock::SemVer& version) { + ESP_LOGD(TAG, "Requesting firmware version %s", version.toString().c_str()); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + + return _tryQueueUpdateRequest(version); +} + +bool OtaUpdateManager::IsValidatingApp() { + return _otaValidatingApp; +} + +void OtaUpdateManager::InvalidateAndRollback() { + // Set OTA boot type in config. + if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Rollback)) { + ESP_PANIC(TAG, "Failed to set OTA firmware boot type in critical section"); // TODO: THIS IS A CRITICAL SECTION, WHAT DO WE DO? + return; + } + + switch (esp_ota_mark_app_invalid_rollback_and_reboot()) { + case ESP_FAIL: + ESP_LOGE(TAG, "Rollback failed (ESP_FAIL)"); + break; + case ESP_ERR_OTA_ROLLBACK_FAILED: + ESP_LOGE(TAG, "Rollback failed (ESP_ERR_OTA_ROLLBACK_FAILED)"); + break; + default: + ESP_LOGE(TAG, "Rollback failed (Unknown)"); + break; + } + + // Set OTA boot type in config. + if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Normal)) { + ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); + } + + esp_restart(); +} + +void OtaUpdateManager::ValidateApp() { + if (esp_ota_mark_app_valid_cancel_rollback() != ESP_OK) { + // Set OTA boot type in config. + if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Rollback)) { // TODO: Check if we are in new firmware, if so set to rollback, else set to normal + ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); + } + + ESP_PANIC(TAG, "Unable to mark app as valid, WTF?"); // TODO: Wtf do we do here? + } + + // Set OTA boot type in config. + if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Normal)) { + ESP_PANIC(TAG, "Failed to set OTA firmware boot type in critical section"); // TODO: THIS IS A CRITICAL SECTION, WHAT DO WE DO? + } +} diff --git a/src/config/Config.cpp b/src/config/Config.cpp index 7d276f9c..ed7eaf4e 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -272,6 +272,18 @@ bool Config::GetWiFiConfig(Config::WiFiConfig& out) { return true; } +bool Config::GetOtaUpdateConfig(Config::OtaUpdateConfig& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + return false; + } + + out = _configData.otaUpdate; + + return true; +} + bool Config::GetWiFiCredentials(cJSON* array, bool withSensitiveData) { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { @@ -567,6 +579,56 @@ bool Config::ClearWiFiCredentials() { return _trySaveConfig(); } +bool Config::GetOtaUpdateId(std::int32_t& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + } + + out = _configData.otaUpdate.updateId; + + return true; +} + +bool Config::SetOtaUpdateId(std::int32_t updateId) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + } + + if (_configData.otaUpdate.updateId == updateId) { + return true; + } + + _configData.otaUpdate.updateId = updateId; + return _trySaveConfig(); +} + +bool Config::GetOtaFirmwareBootType(FirmwareBootType& out) { + ScopedReadLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire read lock"); + } + + out = _configData.otaUpdate.bootType; + + return true; +} + +bool Config::SetOtaFirmwareBootType(FirmwareBootType bootType) { + ScopedWriteLock lock(&_configMutex); + if (!lock.isLocked()) { + ESP_LOGE(TAG, "Failed to acquire write lock"); + } + + if (_configData.otaUpdate.bootType == bootType) { + return true; + } + + _configData.otaUpdate.bootType = bootType; + return _trySaveConfig(); +} + bool Config::HasBackendAuthToken() { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { diff --git a/src/config/OtaUpdateConfig.cpp b/src/config/OtaUpdateConfig.cpp new file mode 100644 index 00000000..af8d8acf --- /dev/null +++ b/src/config/OtaUpdateConfig.cpp @@ -0,0 +1,115 @@ +#include "config/OtaUpdateConfig.h" + +#include "config/internal/utils.h" +#include "Logging.h" + +const char* const TAG = "Config::OtaUpdateConfig"; + +using namespace OpenShock::Config; + +OtaUpdateConfig::OtaUpdateConfig() { + ToDefault(); +} + +OtaUpdateConfig::OtaUpdateConfig( + bool isEnabled, + std::string cdnDomain, + OtaUpdateChannel updateChannel, + bool checkOnStartup, + bool checkPeriodically, + std::uint16_t checkInterval, + bool allowBackendManagement, + bool requireManualApproval, + std::int32_t updateId, + FirmwareBootType bootType +) { + this->isEnabled = isEnabled; + this->cdnDomain = cdnDomain; + this->updateChannel = updateChannel; + this->checkOnStartup = checkOnStartup; + this->checkPeriodically = checkPeriodically; + this->checkInterval = checkInterval; + this->allowBackendManagement = allowBackendManagement; + this->requireManualApproval = requireManualApproval; + this->updateId = updateId; + this->bootType = bootType; +} + +void OtaUpdateConfig::ToDefault() { + isEnabled = true; + cdnDomain = OPENSHOCK_FW_CDN_DOMAIN; + updateChannel = OtaUpdateChannel::Stable; + checkOnStartup = false; + checkPeriodically = false; + checkInterval = 30; // 30 minutes + allowBackendManagement = true; + requireManualApproval = false; + updateId = 0; + bootType = FirmwareBootType::Normal; +} + +bool OtaUpdateConfig::FromFlatbuffers(const Serialization::Configuration::OtaUpdateConfig* config) { + if (config == nullptr) { + ESP_LOGE(TAG, "config is null"); + return false; + } + + isEnabled = config->is_enabled(); + Internal::Utils::FromFbsStr(cdnDomain, config->cdn_domain(), OPENSHOCK_FW_CDN_DOMAIN); + updateChannel = config->update_channel(); + checkOnStartup = config->check_on_startup(); + checkPeriodically = config->check_periodically(); + checkInterval = config->check_interval(); + allowBackendManagement = config->allow_backend_management(); + requireManualApproval = config->require_manual_approval(); + updateId = config->update_id(); + bootType = config->boot_type(); + + return true; +} + +flatbuffers::Offset OtaUpdateConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { + return Serialization::Configuration::CreateOtaUpdateConfig(builder, isEnabled, builder.CreateString(cdnDomain), updateChannel, checkPeriodically, checkInterval, allowBackendManagement, requireManualApproval); +} + +bool OtaUpdateConfig::FromJSON(const cJSON* json) { + if (json == nullptr) { + ESP_LOGE(TAG, "json is null"); + return false; + } + + if (!cJSON_IsObject(json)) { + ESP_LOGE(TAG, "json is not an object"); + return false; + } + + Internal::Utils::FromJsonBool(isEnabled, json, "isEnabled", true); + Internal::Utils::FromJsonStr(cdnDomain, json, "cdnDomain", OPENSHOCK_FW_CDN_DOMAIN); + Internal::Utils::FromJsonStrParsed(updateChannel, json, "updateChannel", OpenShock::TryParseOtaUpdateChannel, OpenShock::OtaUpdateChannel::Stable); + Internal::Utils::FromJsonBool(checkOnStartup, json, "checkOnStartup", true); + Internal::Utils::FromJsonBool(checkPeriodically, json, "checkPeriodically", false); + Internal::Utils::FromJsonU16(checkInterval, json, "checkInterval", 0); + Internal::Utils::FromJsonBool(allowBackendManagement, json, "allowBackendManagement", true); + Internal::Utils::FromJsonBool(requireManualApproval, json, "requireManualApproval", false); + Internal::Utils::FromJsonI32(updateId, json, "updateId", 0); + Internal::Utils::FromJsonStrParsed(bootType, json, "bootType", OpenShock::TryParseFirmwareBootType, OpenShock::FirmwareBootType::Normal); + + return true; +} + +cJSON* OtaUpdateConfig::ToJSON(bool withSensitiveData) const { + cJSON* root = cJSON_CreateObject(); + + cJSON_AddBoolToObject(root, "isEnabled", isEnabled); + cJSON_AddStringToObject(root, "cdnDomain", cdnDomain.c_str()); + cJSON_AddStringToObject(root, "updateChannel", OpenShock::Serialization::Configuration::EnumNameOtaUpdateChannel(updateChannel)); + cJSON_AddBoolToObject(root, "checkOnStartup", checkOnStartup); + cJSON_AddBoolToObject(root, "checkPeriodically", checkPeriodically); + cJSON_AddNumberToObject(root, "checkInterval", checkInterval); + cJSON_AddBoolToObject(root, "allowBackendManagement", allowBackendManagement); + cJSON_AddBoolToObject(root, "requireManualApproval", requireManualApproval); + cJSON_AddNumberToObject(root, "updateId", updateId); + cJSON_AddStringToObject(root, "bootType", OpenShock::Serialization::Types::EnumNameFirmwareBootType(bootType)); + + return root; +} diff --git a/src/config/RootConfig.cpp b/src/config/RootConfig.cpp index 60f030f2..20e8ba41 100644 --- a/src/config/RootConfig.cpp +++ b/src/config/RootConfig.cpp @@ -45,6 +45,11 @@ bool RootConfig::FromFlatbuffers(const Serialization::Configuration::Config* con return false; } + if (!otaUpdate.FromFlatbuffers(config->ota_update())) { + ESP_LOGE(TAG, "Unable to load ota update config"); + return false; + } + return true; } @@ -54,8 +59,9 @@ flatbuffers::Offset RootConfig: auto captivePortalOffset = captivePortal.ToFlatbuffers(builder, withSensitiveData); auto backendOffset = backend.ToFlatbuffers(builder, withSensitiveData); auto serialInputOffset = serialInput.ToFlatbuffers(builder, withSensitiveData); + auto otaUpdateOffset = otaUpdate.ToFlatbuffers(builder, withSensitiveData); - return Serialization::Configuration::CreateConfig(builder, rfOffset, wifiOffset, captivePortalOffset, backendOffset, serialInputOffset); + return Serialization::Configuration::CreateConfig(builder, rfOffset, wifiOffset, captivePortalOffset, backendOffset, serialInputOffset, otaUpdateOffset); } bool RootConfig::FromJSON(const cJSON* json) { @@ -94,6 +100,11 @@ bool RootConfig::FromJSON(const cJSON* json) { return false; } + if (!otaUpdate.FromJSON(cJSON_GetObjectItemCaseSensitive(json, "otaUpdate"))) { + ESP_LOGE(TAG, "Unable to load ota update config"); + return false; + } + return true; } @@ -105,6 +116,7 @@ cJSON* RootConfig::ToJSON(bool withSensitiveData) const { cJSON_AddItemToObject(root, "captivePortal", captivePortal.ToJSON(withSensitiveData)); cJSON_AddItemToObject(root, "backend", backend.ToJSON(withSensitiveData)); cJSON_AddItemToObject(root, "serialInput", serialInput.ToJSON(withSensitiveData)); + cJSON_AddItemToObject(root, "otaUpdate", otaUpdate.ToJSON(withSensitiveData)); return root; } diff --git a/src/config/internal/utils.cpp b/src/config/internal/utils.cpp index 3c7e4913..8b3d014f 100644 --- a/src/config/internal/utils.cpp +++ b/src/config/internal/utils.cpp @@ -71,6 +71,10 @@ bool Config::Internal::Utils::FromJsonU16(std::uint16_t& val, const cJSON* json, return _utilFromJsonInt(val, json, name, defaultVal, 0, UINT16_MAX); } +bool Config::Internal::Utils::FromJsonI32(std::int32_t& val, const cJSON* json, const char* name, std::int32_t defaultVal) { + return _utilFromJsonInt(val, json, name, defaultVal, INT32_MIN, INT32_MAX); +} + bool Config::Internal::Utils::FromJsonStr(std::string& str, const cJSON* json, const char* name, const char* defaultStr) { const cJSON* jsonVal = cJSON_GetObjectItemCaseSensitive(json, name); if (jsonVal == nullptr) { diff --git a/src/event_handlers/websocket/Gateway.cpp b/src/event_handlers/websocket/Gateway.cpp index 4c9ef0f7..2d3849ef 100644 --- a/src/event_handlers/websocket/Gateway.cpp +++ b/src/event_handlers/websocket/Gateway.cpp @@ -4,7 +4,7 @@ #include "Logging.h" -#include "serialization/_fbs/ServerToDeviceMessage_generated.h" +#include "serialization/_fbs/GatewayToDeviceMessage_generated.h" #include @@ -13,9 +13,9 @@ static const char* TAG = "ServerMessageHandlers"; -namespace Schemas = OpenShock::Serialization; +namespace Schemas = OpenShock::Serialization::Gateway; namespace Handlers = OpenShock::MessageHandlers::Server::_Private; -typedef Schemas::ServerToDeviceMessagePayload PayloadType; +typedef Schemas::GatewayToDeviceMessagePayload PayloadType; using namespace OpenShock; @@ -29,13 +29,14 @@ static std::array s_serverHandlers = []() SET_HANDLER(PayloadType::ShockerCommandList, Handlers::HandleShockerCommandList); SET_HANDLER(PayloadType::CaptivePortalConfig, Handlers::HandleCaptivePortalConfig); + SET_HANDLER(PayloadType::OtaInstall, Handlers::HandleOtaInstall); return handlers; }(); void EventHandlers::WebSocket::HandleGatewayBinary(const std::uint8_t* data, std::size_t len) { // Deserialize - auto msg = flatbuffers::GetRoot(data); + auto msg = flatbuffers::GetRoot(data); if (msg == nullptr) { ESP_LOGE(TAG, "Failed to deserialize message"); return; diff --git a/src/event_handlers/websocket/gateway/CaptivePortalConfig.cpp b/src/event_handlers/websocket/gateway/CaptivePortalConfig.cpp index 60616e30..b29216d3 100644 --- a/src/event_handlers/websocket/gateway/CaptivePortalConfig.cpp +++ b/src/event_handlers/websocket/gateway/CaptivePortalConfig.cpp @@ -9,7 +9,7 @@ const char* const TAG = "ServerMessageHandlers"; using namespace OpenShock::MessageHandlers::Server; -void _Private::HandleCaptivePortalConfig(const OpenShock::Serialization::ServerToDeviceMessage* root) { +void _Private::HandleCaptivePortalConfig(const OpenShock::Serialization::Gateway::GatewayToDeviceMessage* root) { auto msg = root->payload_as_CaptivePortalConfig(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as CaptivePortalConfig"); diff --git a/src/event_handlers/websocket/gateway/OtaInstall.cpp b/src/event_handlers/websocket/gateway/OtaInstall.cpp new file mode 100644 index 00000000..18634fee --- /dev/null +++ b/src/event_handlers/websocket/gateway/OtaInstall.cpp @@ -0,0 +1,42 @@ +#include "event_handlers/impl/WSGateway.h" + +#include "CaptivePortal.h" +#include "Logging.h" +#include "OtaUpdateManager.h" + +#include + +const char* const TAG = "ServerMessageHandlers"; + +using namespace OpenShock::MessageHandlers::Server; + +void _Private::HandleOtaInstall(const OpenShock::Serialization::Gateway::GatewayToDeviceMessage* root) { + auto msg = root->payload_as_OtaInstall(); + if (msg == nullptr) { + ESP_LOGE(TAG, "Payload cannot be parsed as OtaInstall"); + return; + } + + auto semver = msg->version(); + if (semver == nullptr) { + ESP_LOGE(TAG, "Version cannot be parsed"); + return; + } + + StringView prerelease, build; + if (semver->prerelease() != nullptr) { + prerelease = StringView(semver->prerelease()->c_str(), semver->prerelease()->size()); + } + if (semver->build() != nullptr) { + build = StringView(semver->build()->c_str(), semver->build()->size()); + } + + OpenShock::SemVer version(semver->major(), semver->minor(), semver->patch(), prerelease, build); + + ESP_LOGI(TAG, "OTA install requested for version %s", version.toString().c_str()); // TODO: This is abusing the SemVer::toString() method causing alot of string copies, fix this + + if (!OpenShock::OtaUpdateManager::TryStartFirmwareInstallation(version)) { + ESP_LOGE(TAG, "Failed to install firmware"); // TODO: Send error message to server + return; + } +} diff --git a/src/event_handlers/websocket/gateway/ShockerCommandList.cpp b/src/event_handlers/websocket/gateway/ShockerCommandList.cpp index 55cdd99e..6145c16d 100644 --- a/src/event_handlers/websocket/gateway/ShockerCommandList.cpp +++ b/src/event_handlers/websocket/gateway/ShockerCommandList.cpp @@ -10,7 +10,7 @@ const char* const TAG = "ServerMessageHandlers"; using namespace OpenShock::MessageHandlers::Server; -void _Private::HandleShockerCommandList(const OpenShock::Serialization::ServerToDeviceMessage* root) { +void _Private::HandleShockerCommandList(const OpenShock::Serialization::Gateway::GatewayToDeviceMessage* root) { auto msg = root->payload_as_ShockerCommandList(); if (msg == nullptr) { ESP_LOGE(TAG, "Payload cannot be parsed as ShockerCommandList"); diff --git a/src/event_handlers/websocket/gateway/_InvalidMessage.cpp b/src/event_handlers/websocket/gateway/_InvalidMessage.cpp index 68ef41b1..f5eb97d8 100644 --- a/src/event_handlers/websocket/gateway/_InvalidMessage.cpp +++ b/src/event_handlers/websocket/gateway/_InvalidMessage.cpp @@ -7,7 +7,7 @@ const char* const TAG = "ServerMessageHandlers"; using namespace OpenShock::MessageHandlers::Server; -void _Private::HandleInvalidMessage(const OpenShock::Serialization::ServerToDeviceMessage* root) { +void _Private::HandleInvalidMessage(const OpenShock::Serialization::Gateway::GatewayToDeviceMessage* root) { if (root == nullptr) { ESP_LOGE(TAG, "Message cannot be parsed"); return; diff --git a/src/main.cpp b/src/main.cpp index a5bb283e..66569565 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,26 +6,22 @@ #include "event_handlers/Init.h" #include "GatewayConnectionManager.h" #include "Logging.h" +#include "OtaUpdateManager.h" #include "serial/SerialInputHandler.h" +#include "util/TaskUtils.h" #include "VisualStateManager.h" #include "wifi/WiFiManager.h" #include "wifi/WiFiScanManager.h" -#include +#include #include const char* const TAG = "OpenShock"; -void setup() { - Serial.begin(115'200); - - if (!LittleFS.begin(true, "/static", 10, "static0")) { - ESP_PANIC(TAG, "Unable to mount LittleFS"); - } - +// Internal setup function, returns true if setup succeeded, false otherwise. +bool trySetup() { OpenShock::EventHandlers::Init(); - OpenShock::VisualStateManager::Init(); OpenShock::EStopManager::Init(100); // 100ms update interval @@ -33,25 +29,80 @@ void setup() { OpenShock::Config::Init(); if (!OpenShock::SerialInputHandler::Init()) { - ESP_PANIC(TAG, "Unable to initialize SerialInputHandler"); + ESP_LOGE(TAG, "Unable to initialize SerialInputHandler"); + return false; } if (!OpenShock::CommandHandler::Init()) { ESP_LOGW(TAG, "Unable to initialize CommandHandler"); + return false; } if (!OpenShock::WiFiManager::Init()) { - ESP_PANIC(TAG, "Unable to initialize WiFiManager"); + ESP_LOGE(TAG, "Unable to initialize WiFiManager"); + return false; } if (!OpenShock::GatewayConnectionManager::Init()) { - ESP_PANIC(TAG, "Unable to initialize GatewayConnectionManager"); + ESP_LOGE(TAG, "Unable to initialize GatewayConnectionManager"); + return false; + } + + return true; +} + +// OTA setup is the same as normal setup, but we invalidate the currently running app, and roll back if it fails. +void otaSetup() { + ESP_LOGI(TAG, "Validating OTA app"); + + if (!trySetup()) { + ESP_LOGE(TAG, "Unable to validate OTA app, rolling back"); + OpenShock::OtaUpdateManager::InvalidateAndRollback(); + } + + ESP_LOGI(TAG, "Marking OTA app as valid"); + + OpenShock::OtaUpdateManager::ValidateApp(); + + ESP_LOGI(TAG, "Done validating OTA app"); +} + +// App setup is the same as normal setup, but we restart if it fails. +void appSetup() { + if (!trySetup()) { + ESP_LOGI(TAG, "Restarting in 5 seconds..."); + vTaskDelay(pdMS_TO_TICKS(5000)); + esp_restart(); + } +} + +// Arduino setup function +void setup() { + Serial.begin(115'200); + + OpenShock::OtaUpdateManager::Init(); + if (OpenShock::OtaUpdateManager::IsValidatingApp()) { + otaSetup(); + } else { + appSetup(); + } +} + +void main_app(void* arg) { + while (true) { + OpenShock::SerialInputHandler::Update(); + OpenShock::CaptivePortal::Update(); + OpenShock::GatewayConnectionManager::Update(); + OpenShock::WiFiManager::Update(); + + vTaskDelay(5); // 5 ticks update interval } } void loop() { - OpenShock::SerialInputHandler::Update(); - OpenShock::CaptivePortal::Update(); - OpenShock::GatewayConnectionManager::Update(); - OpenShock::WiFiManager::Update(); + // Start the main task + OpenShock::TaskUtils::TaskCreateExpensive(main_app, "main_app", 8192, nullptr, 1, nullptr); + + // Kill the loop task (Arduino is stinky) + vTaskDelete(nullptr); } diff --git a/src/serialization/WSGateway.cpp b/src/serialization/WSGateway.cpp index eed037bb..5fec63f1 100644 --- a/src/serialization/WSGateway.cpp +++ b/src/serialization/WSGateway.cpp @@ -1 +1,92 @@ #include "serialization/WSGateway.h" + +#include "config/Config.h" +#include "Logging.h" +#include "Time.h" + +const char* const TAG = "WSGateway"; + +using namespace OpenShock::Serialization; + +bool Gateway::SerializeKeepAliveMessage(Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + std::int64_t uptime = OpenShock::millis(); + if (uptime < 0) { + ESP_LOGE(TAG, "Failed to get uptime"); + return false; + } + + Gateway::KeepAlive keepAlive(static_cast(uptime)); + auto keepAliveOffset = builder.CreateStruct(keepAlive); + + auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::KeepAlive, keepAliveOffset.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} + +bool Gateway::SerializeBootStatusMessage(std::int32_t updateId, OpenShock::FirmwareBootType bootType, const OpenShock::SemVer& version, Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + auto fbsVersion = Types::CreateSemVerDirect(builder, version.major, version.minor, version.patch, version.prerelease.data(), version.build.data()); + + auto fbsBootStatus = Gateway::CreateBootStatus(builder, bootType, fbsVersion); + + auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::BootStatus, fbsBootStatus.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} + +bool Gateway::SerializeOtaInstallStartedMessage(std::int32_t updateId, const OpenShock::SemVer& version, Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + auto versionOffset = Types::CreateSemVerDirect(builder, version.major, version.minor, version.patch, version.prerelease.data(), version.build.data()); + + auto otaInstallStartedOffset = Gateway::CreateOtaInstallStarted(builder, updateId, versionOffset); + + auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::OtaInstallStarted, otaInstallStartedOffset.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} + +bool Gateway::SerializeOtaInstallProgressMessage(std::int32_t updateId, Gateway::OtaInstallProgressTask task, float progress, Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + auto otaInstallProgressOffset = Gateway::CreateOtaInstallProgress(builder, updateId, task, progress); + + auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::OtaInstallProgress, otaInstallProgressOffset.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} + +bool Gateway::SerializeOtaInstallFailedMessage(std::int32_t updateId, StringView message, bool fatal, Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + auto messageOffset = builder.CreateString(message.data(), message.size()); + + auto otaInstallFailedOffset = Gateway::CreateOtaInstallFailed(builder, updateId, messageOffset, fatal); + + auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::OtaInstallFailed, otaInstallFailedOffset.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} diff --git a/src/util/ParitionUtils.cpp b/src/util/ParitionUtils.cpp new file mode 100644 index 00000000..422bb7b7 --- /dev/null +++ b/src/util/ParitionUtils.cpp @@ -0,0 +1,110 @@ +#include "util/PartitionUtils.h" + +#include "Hashing.h" +#include "http/HTTPRequestManager.h" +#include "Time.h" +#include "util/HexUtils.h" + +#include + +const char* const TAG = "PartitionUtils"; + +bool OpenShock::TryGetPartitionHash(const esp_partition_t* partition, char (&hash)[65]) { + std::uint8_t buffer[32]; + esp_err_t err = esp_partition_get_sha256(partition, buffer); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to get partition hash: %s", esp_err_to_name(err)); + return false; + } + + // Copy the hash to the output buffer + HexUtils::ToHex<32>(buffer, hash, false); + + return true; +} + +bool OpenShock::FlashPartitionFromUrl(const esp_partition_t* partition, StringView remoteUrl, const std::uint8_t (&remoteHash)[32], std::function progressCallback) { + OpenShock::SHA256 sha256; + if (!sha256.begin()) { + ESP_LOGE(TAG, "Failed to initialize SHA256 hash"); + return false; + } + + std::size_t contentLength = 0; + std::size_t contentWritten = 0; + std::int64_t lastProgress = 0; + + auto sizeValidator = [partition, &contentLength, progressCallback, &lastProgress](std::size_t size) -> bool { + if (size > partition->size) { + ESP_LOGE(TAG, "Remote partition binary is too large"); + return false; + } + + // Erase app partition. + if (esp_partition_erase_range(partition, 0, partition->size) != ESP_OK) { + ESP_LOGE(TAG, "Failed to erase partition in preparation for update"); + return false; + } + + contentLength = size; + + lastProgress = OpenShock::millis(); + progressCallback(0, contentLength, 0.0f); + + return true; + }; + auto dataWriter = [partition, &sha256, &contentLength, &contentWritten, progressCallback, &lastProgress](std::size_t offset, const std::uint8_t* data, std::size_t length) -> bool { + if (esp_partition_write(partition, offset, data, length) != ESP_OK) { + ESP_LOGE(TAG, "Failed to write to partition"); + return false; + } + + if (!sha256.update(data, length)) { + ESP_LOGE(TAG, "Failed to update SHA256 hash"); + return false; + } + + contentWritten += length; + + std::int64_t now = OpenShock::millis(); + if (now - lastProgress >= 1000) { // Once per second + lastProgress = now; + progressCallback(contentWritten, contentLength, static_cast(contentWritten) / static_cast(contentLength)); + } + + return true; + }; + + // Start streaming binary to app partition. + auto appBinaryResponse = OpenShock::HTTP::Download( + remoteUrl, + { + {"Accept", "application/octet-stream"} + }, + sizeValidator, + dataWriter, + {200, 304}, + 180'000 + ); // 3 minutes + if (appBinaryResponse.result != OpenShock::HTTP::RequestResult::Success) { + ESP_LOGE(TAG, "Failed to download remote partition binary: [%u]", appBinaryResponse.code); + return false; + } + + progressCallback(contentLength, contentLength, 1.0f); + ESP_LOGD(TAG, "Wrote %u bytes to partition", appBinaryResponse.data); + + std::array localHash; + if (!sha256.finish(localHash)) { + ESP_LOGE(TAG, "Failed to finish SHA256 hash"); + return false; + } + + // Compare hashes. + if (memcmp(localHash.data(), remoteHash, 32) != 0) { + ESP_LOGE(TAG, "App binary hash mismatch"); + return false; + } + + return true; +} diff --git a/src/util/StringUtils.cpp b/src/util/StringUtils.cpp new file mode 100644 index 00000000..3d7603d2 --- /dev/null +++ b/src/util/StringUtils.cpp @@ -0,0 +1,59 @@ +#include "util/StringUtils.h" + +#include "Logging.h" + +#include +#include + +static const char* TAG = "StringUtils"; + +bool OpenShock::FormatToString(std::string& out, const char* format, ...) { + constexpr std::size_t STACK_BUFFER_SIZE = 128; + + char buffer[STACK_BUFFER_SIZE]; + char* bufferPtr = buffer; + + va_list args; + + // Try format with stack buffer. + va_start(args, format); + int result = vsnprintf(buffer, STACK_BUFFER_SIZE, format, args); + va_end(args); + + // If result is negative, something went wrong. + if (result < 0) { + ESP_LOGE(TAG, "Failed to format string"); + return false; + } + + if (result >= STACK_BUFFER_SIZE) { + // Account for null terminator. + result += 1; + + // Allocate heap buffer. + bufferPtr = new char[result]; + + // Try format with heap buffer. + va_start(args, format); + result = vsnprintf(bufferPtr, result, format, args); + va_end(args); + + // If we still fail, something is wrong. + // Free heap buffer and return false. + if (result < 0) { + delete[] bufferPtr; + ESP_LOGE(TAG, "Failed to format string"); + return false; + } + } + + // Set output string. + out = std::string(bufferPtr, result); + + // Free heap buffer if we used it. + if (bufferPtr != buffer) { + delete[] bufferPtr; + } + + return true; +} From d53787d3a1f9c50f5a749462c706d2dd2f668f4d Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 9 Jan 2024 07:46:53 +0100 Subject: [PATCH 094/147] Implement some code QOL stuffz (#179) --- include/{Constants.h => Common.h} | 8 ++++++++ include/PinPatternManager.h | 3 +++ include/RGBPatternManager.h | 3 +++ include/WebSocketDeFragger.h | 5 ++--- src/CommandHandler.cpp | 2 +- src/CompatibilityChecks.cpp | 2 +- src/config/Config.cpp | 2 +- src/config/RFConfig.cpp | 2 +- src/event_handlers/websocket/local/SetRfTxPinCommand.cpp | 2 +- src/http/JsonAPI.cpp | 2 +- src/main.cpp | 2 +- 11 files changed, 23 insertions(+), 10 deletions(-) rename include/{Constants.h => Common.h} (78%) diff --git a/include/Constants.h b/include/Common.h similarity index 78% rename from include/Constants.h rename to include/Common.h index e72a88d2..5a487fae 100644 --- a/include/Constants.h +++ b/include/Common.h @@ -2,6 +2,14 @@ #include +#define DISABLE_COPY(TypeName) \ + TypeName(const TypeName&) = delete; \ + void operator=(const TypeName&) = delete +#define DISABLE_MOVE(TypeName) \ + TypeName(TypeName&&) = delete; \ + void operator=(TypeName&&) = delete + + #ifndef OPENSHOCK_API_DOMAIN #error "OPENSHOCK_API_DOMAIN must be defined" #endif diff --git a/include/PinPatternManager.h b/include/PinPatternManager.h index eee7edf6..a61550fe 100644 --- a/include/PinPatternManager.h +++ b/include/PinPatternManager.h @@ -1,5 +1,7 @@ #pragma once +#include "Common.h" + #include #include #include @@ -9,6 +11,7 @@ namespace OpenShock { class PinPatternManager { + DISABLE_COPY(PinPatternManager); public: PinPatternManager(std::uint8_t gpioPin); ~PinPatternManager(); diff --git a/include/RGBPatternManager.h b/include/RGBPatternManager.h index 94b696c0..81231677 100644 --- a/include/RGBPatternManager.h +++ b/include/RGBPatternManager.h @@ -1,5 +1,7 @@ #pragma once +#include "Common.h" + #include #include #include @@ -11,6 +13,7 @@ namespace OpenShock { class RGBPatternManager { + DISABLE_COPY(RGBPatternManager); public: RGBPatternManager(std::uint8_t gpioPin); ~RGBPatternManager(); diff --git a/include/WebSocketDeFragger.h b/include/WebSocketDeFragger.h index 025ea98c..85d464af 100644 --- a/include/WebSocketDeFragger.h +++ b/include/WebSocketDeFragger.h @@ -1,5 +1,6 @@ #pragma once +#include "Common.h" #include "WebSocketMessageType.h" #include @@ -10,20 +11,18 @@ namespace OpenShock { class WebSocketDeFragger { + DISABLE_COPY(WebSocketDeFragger); public: typedef std::function EventCallback; WebSocketDeFragger(EventCallback callback); - WebSocketDeFragger(const WebSocketDeFragger&) = delete; ~WebSocketDeFragger(); void handler(std::uint8_t socketId, WStype_t type, const std::uint8_t* payload, std::size_t length); void onEvent(const EventCallback& callback); void clear(std::uint8_t socketId); void clear(); - - WebSocketDeFragger& operator=(const WebSocketDeFragger&) = delete; private: void start(std::uint8_t socketId, WebSocketMessageType type, const std::uint8_t* data, std::uint32_t length); void append(std::uint8_t socketId, const std::uint8_t* data, std::uint32_t length); diff --git a/src/CommandHandler.cpp b/src/CommandHandler.cpp index e9837a96..059c8c42 100644 --- a/src/CommandHandler.cpp +++ b/src/CommandHandler.cpp @@ -2,7 +2,7 @@ #include "Chipset.h" #include "config/Config.h" -#include "Constants.h" +#include "Common.h" #include "Logging.h" #include "radio/RFTransmitter.h" #include "Time.h" diff --git a/src/CompatibilityChecks.cpp b/src/CompatibilityChecks.cpp index 92edac14..7d06a571 100644 --- a/src/CompatibilityChecks.cpp +++ b/src/CompatibilityChecks.cpp @@ -1,4 +1,4 @@ -#include "Constants.h" +#include "Common.h" #include "Chipset.h" constexpr bool kIsValidRfTxPin = OpenShock::IsValidOutputPin(OPENSHOCK_RF_TX_GPIO) || OPENSHOCK_RF_TX_GPIO == UINT8_MAX; diff --git a/src/config/Config.cpp b/src/config/Config.cpp index ed7eaf4e..f45e3f35 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -1,7 +1,7 @@ #include "config/Config.h" #include "config/RootConfig.h" -#include "Constants.h" +#include "Common.h" #include "Logging.h" #include "ReadWriteMutex.h" diff --git a/src/config/RFConfig.cpp b/src/config/RFConfig.cpp index b9897520..be8007be 100644 --- a/src/config/RFConfig.cpp +++ b/src/config/RFConfig.cpp @@ -1,7 +1,7 @@ #include "config/RFConfig.h" #include "config/internal/utils.h" -#include "Constants.h" +#include "Common.h" #include "Logging.h" const char* const TAG = "Config::RFConfig"; diff --git a/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp b/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp index 2fbdd148..d7456a13 100644 --- a/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp +++ b/src/event_handlers/websocket/local/SetRfTxPinCommand.cpp @@ -2,7 +2,7 @@ #include "CaptivePortal.h" #include "CommandHandler.h" -#include "Constants.h" +#include "Common.h" #include "Logging.h" #include diff --git a/src/http/JsonAPI.cpp b/src/http/JsonAPI.cpp index c8e6b9a9..c85444d4 100644 --- a/src/http/JsonAPI.cpp +++ b/src/http/JsonAPI.cpp @@ -1,6 +1,6 @@ #include "http/JsonAPI.h" -#include "Constants.h" +#include "Common.h" using namespace OpenShock; diff --git a/src/main.cpp b/src/main.cpp index 66569565..d60a5c9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include "CaptivePortal.h" #include "CommandHandler.h" #include "config/Config.h" -#include "Constants.h" +#include "Common.h" #include "EStopManager.h" #include "event_handlers/Init.h" #include "GatewayConnectionManager.h" From ec9c650b2b88cb097e0c321c3cb28b5f328ee7ff Mon Sep 17 00:00:00 2001 From: hhvrc Date: Tue, 9 Jan 2024 07:49:56 +0100 Subject: [PATCH 095/147] Constants.h was moved to Common.h --- src/OtaUpdateManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index a6da621a..2a14fde0 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -1,8 +1,8 @@ #include "OtaUpdateManager.h" #include "CaptivePortal.h" +#include "Common.h" #include "config/Config.h" -#include "Constants.h" #include "GatewayConnectionManager.h" #include "Hashing.h" #include "http/HTTPRequestManager.h" From c83a30b37e80012bd2c8c2b67ba1804594bf580c Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 16:45:58 +0100 Subject: [PATCH 096/147] Improve CI/CD workflows (#180) * Add new workflows * Add RELEASE.md to get-vars output * Remove VERSION * Code abstraction and stuff * More simplification * Fix some stuff and publish on master and develop * Sanitize ref names in semver * Better release notes * Fix typo * Update CHANGELOG.md * Update get-vars.js * Update CHANGELOG.md * Attempt to fix CI/CD tag issue * debug * Fix bug * fix other typo * More simplifications * Finishing touches * Fix dev channel and semver naming * Attempt to fix stuck progress * Scope and clean up variables --- .github/actions/build-firmware/action.yml | 14 +- .github/scripts/.gitignore | 1 + .github/scripts/get-vars.js | 221 ++++++++++++++++++ .github/scripts/package-lock.json | 267 ++++++++++++++++++++++ .github/scripts/package.json | 17 ++ .github/workflows/build-all.yml | 85 +++++++ .github/workflows/ci-build.yml | 103 +++------ .github/workflows/ci-tag.yml | 203 ---------------- .github/workflows/codeql.yml | 25 +- .github/workflows/get-targets.yml | 73 ------ .github/workflows/get-vars.yml | 105 +++++++++ .github/workflows/publish-all.yml | 130 +++++++++++ CHANGELOG.md | 25 ++ RELEASE.md | 2 +- scripts/embed_env_vars.py | 10 +- src/http/HTTPRequestManager.cpp | 2 +- src/serial/SerialInputHandler.cpp | 2 +- 17 files changed, 910 insertions(+), 375 deletions(-) create mode 100644 .github/scripts/.gitignore create mode 100644 .github/scripts/get-vars.js create mode 100644 .github/scripts/package-lock.json create mode 100644 .github/scripts/package.json create mode 100644 .github/workflows/build-all.yml delete mode 100644 .github/workflows/ci-tag.yml delete mode 100644 .github/workflows/get-targets.yml create mode 100644 .github/workflows/get-vars.yml create mode 100644 .github/workflows/publish-all.yml create mode 100644 CHANGELOG.md diff --git a/.github/actions/build-firmware/action.yml b/.github/actions/build-firmware/action.yml index 16bf54d3..47bcd8f7 100644 --- a/.github/actions/build-firmware/action.yml +++ b/.github/actions/build-firmware/action.yml @@ -1,13 +1,15 @@ - name: build-firmware description: Builds the firmware partitions and uploads them as an artifact inputs: python-version: - description: 'Python version to use' required: true + description: 'Python version to use' board: + required: true description: 'Board name to build' + version: required: true + description: 'Current firmware version' skip-checkout: description: 'If true, skips checkout' required: false @@ -30,7 +32,7 @@ runs: - uses: actions/setup-python@v4 with: python-version: ${{ inputs.python-version }} - cache: "pip" + cache: 'pip' - name: Install python dependencies shell: bash @@ -40,6 +42,12 @@ runs: working-directory: . shell: bash run: pio run -e ${{ inputs.board }} + env: + OPENSHOCK_API_DOMAIN: api.openshock.net + OPENSHOCK_FW_VERSION: ${{ inputs.version }} + OPENSHOCK_FW_GIT_REF: ${{ github.ref }} + OPENSHOCK_FW_GIT_COMMIT: ${{ github.sha }} + OPENSHOCK_FW_BUILD_DATE: ${{ github.event.head_commit.timestamp }} - name: Upload build artifacts uses: actions/upload-artifact@v3 diff --git a/.github/scripts/.gitignore b/.github/scripts/.gitignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/.github/scripts/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/.github/scripts/get-vars.js b/.github/scripts/get-vars.js new file mode 100644 index 00000000..38482a49 --- /dev/null +++ b/.github/scripts/get-vars.js @@ -0,0 +1,221 @@ +const fs = require('fs'); +const ini = require('ini'); +const semver = require('semver'); +const core = require('@actions/core'); +const child_process = require('child_process'); + +// Get branch name +const gitRef = process.env.GITHUB_REF; +if (gitRef === undefined) { + core.setFailed('Environment variable "GITHUB_REF" not found'); + process.exit(); +} + +const isGitTag = gitRef.startsWith('refs/tags/'); +const isGitBranch = gitRef.startsWith('refs/heads/'); +const isGitPullRequest = gitRef.startsWith('refs/pull/') && gitRef.endsWith('/merge'); + +if (!isGitTag && !isGitBranch && !isGitPullRequest) { + core.setFailed(`Git ref "${gitRef}" is not a valid branch, tag or pull request`); + process.exit(); +} + +const gitCommitHash = process.env.GITHUB_SHA; +const gitShortCommitHash = child_process.execSync('git rev-parse --short HEAD').toString().trim(); + +if (gitCommitHash === undefined) { + core.setFailed('Environment variable "GITHUB_SHA" not found'); + process.exit(); +} + +const gitHeadRefName = isGitPullRequest ? process.env.GITHUB_HEAD_REF : gitRef.split('/')[2]; +if (gitHeadRefName === undefined) { + core.setFailed('Failed to get git head ref name'); + process.exit(); +} + +const gitTagsList = child_process.execSync('git for-each-ref --sort=-creatordate --format "%(refname:short)" refs/tags').toString().trim(); +if (gitTagsList === undefined) { + core.setFailed('Failed to get latest git tag'); + process.exit(); +} + +function convertGitTagToSemver(tag) { + const parsed = semver.parse(tag === '' ? '0.0.0' : tag); + if (parsed === null || parsed.loose) { + core.setFailed(`Git tag "${tag}" is not a valid semver version`); + process.exit(); + } + + return parsed; +} + +const gitTagsArray = gitTagsList.split('\n').map((tag) => tag.trim()); +const releasesArray = gitTagsArray.map(convertGitTagToSemver); +const latestRelease = isGitTag ? convertGitTagToSemver(gitRef.split('/')[2]) : releasesArray[0]; + +const stableReleasesArray = releasesArray.filter((release) => release.prerelease.length === 0 || release.prerelease[0] === 'stable'); +const betaReleasesArray = releasesArray.filter((release) => release.prerelease.length > 0 && ['rc', 'beta'].includes(release.prerelease[0])); +const devReleasesArray = releasesArray.filter((release) => release.prerelease.length > 0 && ['dev', 'develop'].includes(release.prerelease[0])); + +// Build version string +let currentVersion = `${latestRelease.major}.${latestRelease.minor}.${latestRelease.patch}`; +if (!isGitTag) { + // Get last part of branch name and replace all non-alphanumeric characters with dashes + let sanitizedGitHeadRefName = gitHeadRefName + .split('/') + .pop() + .replace(/[^a-zA-Z0-9-]/g, '-'); + + // Remove leading and trailing dashes + sanitizedGitHeadRefName = sanitizedGitHeadRefName.replace(/^\-+|\-+$/g, ''); + + if (sanitizedGitHeadRefName.length > 0) { + currentVersion += `-${sanitizedGitHeadRefName}`; + } + + // Add the git commit hash to the version string + currentVersion += `+${gitShortCommitHash}`; +} + +// Get the channel to deploy to +let currentChannel; +if (gitHeadRefName === 'master') { + currentChannel = 'stable'; +} else if (gitHeadRefName === 'develop') { + currentChannel = 'develop'; +} else if (gitHeadRefName === 'beta') { + currentChannel = 'beta'; +} else { + currentChannel = gitHeadRefName.replace(/[^a-zA-Z0-9-]/g, '-').replace(/^\-+|\-+$/g, ''); +} + +function getVersionChangeLog(lines) { + const emptyChangelog = lines.length === 0; + + // Enforce that the changelog is not empty if we are on the master branch + if (isGitTag && emptyChangelog) { + core.setFailed('File "CHANGELOG.md" is empty, this must be populated in the master branch'); + process.exit(); + } + + if (emptyChangelog) { + return ''; + } + + // Simple validation of the changelog + if (!lines[0].startsWith('# Version ')) { + core.setFailed('File "CHANGELOG.md" must start with "# Version " followed by a changelog entry'); + process.exit(); + } + + // Get the start of the entry + const changeLogBegin = lines.findIndex((line) => line.startsWith(`# Version ${currentVersion}`)); + if (isGitTag && changeLogBegin === -1) { + core.setFailed(`File "CHANGELOG.md" does not contain a changelog entry for version "${currentVersion}", this must be added in the master branch`); + process.exit(); + } + + // Enforce that the changelog entry is at the top of the file if we are on the master branch + if (isGitTag && changeLogBegin !== 0) { + core.setFailed(`Changelog entry for version "${currentVersion}" is not at the top of the file, you tag is either out of date or you have not updated the changelog`); + process.exit(); + } + + // Get the end of the entry + let changeLogEnd = lines.slice(changeLogBegin + 1).findIndex((line) => line.startsWith('# Version ')); + if (changeLogEnd === -1) { + changeLogEnd = lines.length; + } else { + changeLogEnd += changeLogBegin + 1; + } + + const emptyChangelogEntry = lines.slice(changeLogBegin + 1, changeLogEnd).filter((line) => line.trim() !== '').length === 0; + + // Enforce that the changelog entry is not empty if we are on the master branch + if (isGitTag && emptyChangelogEntry) { + core.setFailed(`Changelog entry for version "${currentVersion}" is empty, this must be populated in the master branch`); + process.exit(); + } + + return lines.slice(changeLogBegin + 1, changeLogEnd).join('\n'); +} + +// Make sure we have all the files we need +for (const file of ['RELEASE.md', 'CHANGELOG.md', 'platformio.ini']) { + if (!fs.existsSync(file)) { + core.setFailed(`File "${file}" not found`); + process.exit(); + } +} + +// Read files +let releaseNotes = fs.readFileSync('RELEASE.md', 'utf8'); +const fullChangelog = fs.readFileSync('CHANGELOG.md', 'utf8').trim(); +const platformioIniStr = fs.readFileSync('platformio.ini', 'utf8').trim(); + +const fullChangelogLines = fullChangelog.split('\n'); + +// Get all versions from the changelog +const changelogVersions = fullChangelogLines.filter((line) => line.startsWith('# Version ')).map((line) => line.substring(10).split(' ')[0].trim()); + +// Get the changelog for the current version +const versionChangeLog = getVersionChangeLog(fullChangelogLines); + +// Enforce that all tags exist in the changelog +let missingTags = []; +for (const tag of gitTagsArray) { + if (!changelogVersions.includes(tag)) { + missingTags.push(tag); + } +} +if (missingTags.length > 0) { + core.setFailed(`Changelog is missing the following tags: ${missingTags.join(', ')}`); + process.exit(); +} + +// Finish building the release string +if (versionChangeLog !== '') { + releaseNotes = `# OpenShock Firmware ${currentVersion}\n\n${versionChangeLog}\n\n${releaseNotes}`.trim(); +} else { + releaseNotes = `# OpenShock Firmware ${currentVersion}\n\n${releaseNotes}`.trim(); +} + +// Parse platformio.ini and extract the different boards +const platformioIni = ini.parse(platformioIniStr); + +// Get every key that starts with "env:", and that isnt "env:fs" (which is the filesystem) +const boards = Object.keys(platformioIni) + .filter((key) => key.startsWith('env:') && key !== 'env:fs') + .reduce((arr, key) => { + arr.push(key.substring(4)); + return arr; + }, []); + +const shouldDeploy = isGitTag || (isGitBranch && gitHeadRefName === 'develop'); + +console.log('Version: ' + currentVersion); +console.log('Channel: ' + currentChannel); +console.log('Boards: ' + boards.join(', ')); +console.log('Deploy: ' + shouldDeploy); +console.log('Tags: ' + gitTagsArray.join(', ')); +console.log('Stable: ' + stableReleasesArray.join(', ')); +console.log('Beta: ' + betaReleasesArray.join(', ')); +console.log('Dev: ' + devReleasesArray.join(', ')); + +// Set outputs +core.setOutput('version', currentVersion); +core.setOutput('changelog', versionChangeLog); +core.setOutput('release-notes', releaseNotes); +core.setOutput('release-channel', currentChannel); +core.setOutput('full-changelog', fullChangelog); +core.setOutput('board-list', boards.join('\n')); +core.setOutput('board-array', JSON.stringify(boards)); +core.setOutput('board-matrix', JSON.stringify({ board: boards })); +core.setOutput('should-deploy', shouldDeploy); +core.setOutput('release-stable-list', stableReleasesArray.join('\n')); +core.setOutput('release-stable-array', JSON.stringify(stableReleasesArray)); +core.setOutput('release-beta-list', betaReleasesArray.join('\n')); +core.setOutput('release-beta-array', JSON.stringify(betaReleasesArray)); +core.setOutput('release-dev-list', devReleasesArray.join('\n')); +core.setOutput('release-dev-array', JSON.stringify(devReleasesArray)); diff --git a/.github/scripts/package-lock.json b/.github/scripts/package-lock.json new file mode 100644 index 00000000..1c71ab3e --- /dev/null +++ b/.github/scripts/package-lock.json @@ -0,0 +1,267 @@ +{ + "name": "get-variables", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "get-variables", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@actions/core": "^1.10.1", + "@actions/github": "^6.0.0", + "ini": "^4.1.1", + "semver": "^7.5.4" + } + }, + "node_modules/@actions/core": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", + "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", + "dependencies": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "node_modules/@actions/github": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz", + "integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==", + "dependencies": { + "@actions/http-client": "^2.2.0", + "@octokit/core": "^5.0.1", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.0.0" + } + }, + "node_modules/@actions/http-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", + "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", + "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "dependencies": { + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "dependencies": { + "@octokit/types": "^12.4.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz", + "integrity": "sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==", + "dependencies": { + "@octokit/types": "^12.3.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/request": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dependencies": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "dependencies": { + "@octokit/openapi-types": "^19.1.0" + } + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/.github/scripts/package.json b/.github/scripts/package.json new file mode 100644 index 00000000..65b9030e --- /dev/null +++ b/.github/scripts/package.json @@ -0,0 +1,17 @@ +{ + "name": "get-variables", + "version": "1.0.0", + "description": "", + "main": "src/index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@actions/core": "^1.10.1", + "@actions/github": "^6.0.0", + "ini": "^4.1.1", + "semver": "^7.5.4" + } +} diff --git a/.github/workflows/build-all.yml b/.github/workflows/build-all.yml new file mode 100644 index 00000000..70dea7b1 --- /dev/null +++ b/.github/workflows/build-all.yml @@ -0,0 +1,85 @@ +name: build-all + +on: + workflow_call: + inputs: + node-version: + type: string + default: '18' + description: 'The version of Node.js to use' + python-version: + type: string + default: '3.12' + description: 'The version of Python to use' + version: + type: string + required: true + description: 'The version of the firmware' + board-matrix: + type: string + required: true + description: 'A JSON matrix of boards to build for' + +jobs: + build-frontend: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + frontend + + - uses: ./.github/actions/build-frontend + with: + node-version: ${{ inputs.node-version }} + + build-staticfs: + runs-on: ubuntu-latest + needs: build-frontend + + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/build-staticfs + with: + python-version: ${{ inputs.python-version }} + skip-checkout: true + + build-firmware: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJSON(inputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/build-firmware + with: + python-version: ${{ inputs.python-version }} + board: ${{ matrix.board }} + version: ${{ inputs.version }} + skip-checkout: true + + merge-partitions: + runs-on: ubuntu-latest + needs: [build-staticfs, build-firmware] + strategy: + fail-fast: false + matrix: ${{ fromJSON(inputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + scripts + boards + chips + + - uses: ./.github/actions/merge-partitions + with: + python-version: ${{ inputs.python-version }} + board: ${{ matrix.board }} + skip-checkout: true diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 4999b859..5b338b31 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -2,95 +2,46 @@ on: push: branches: - master + - beta - develop + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-*' pull_request: branches: + - master + - beta - develop types: [opened, reopened, synchronize] workflow_dispatch: # Manually invoked by user. name: ci-build -env: - NODE_VERSION: 18 - PYTHON_VERSION: 3.12 - OPENSHOCK_API_DOMAIN: api.shocklink.net - # OPENSHOCK_FW_VERSION: - # - If this is branch "master" or "develop", we use "0.0.0-master" or "0.0.0-develop" respectively. - # - All other scenarios we use "0.0.0-unknown", as we cannot guarantee SemVer compliance by accepting any branch name. So this is the safe option. - OPENSHOCK_FW_VERSION: ${{ (contains(fromJSON('["master","develop"]'), github.ref_name) && format('0.0.0-{0}', github.ref_name)) || '0.0.0-unknown' }} - OPENSHOCK_FW_COMMIT: ${{ github.sha }} - jobs: - # Read platformio.ini and extract all specific targets. See the referenced file for more info. - get-targets: - uses: ./.github/workflows/get-targets.yml - - build-frontend: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - frontend + getvars: + uses: ./.github/workflows/get-vars.yml - - uses: ./.github/actions/build-frontend - with: - node-version: ${{ env.NODE_VERSION }} - - build-staticfs: - runs-on: ubuntu-latest - needs: build-frontend - - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/build-staticfs - with: - python-version: ${{ env.PYTHON_VERSION }} - skip-checkout: true - - build-firmware: - runs-on: ubuntu-latest - needs: get-targets - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.get-targets.outputs.matrix) }} - - steps: - - uses: actions/checkout@v4 - - - uses: ./.github/actions/build-firmware - with: - python-version: ${{ env.PYTHON_VERSION }} - board: ${{ matrix.board }} - skip-checkout: true - - merge-partitions: - runs-on: ubuntu-latest - needs: [get-targets, build-staticfs, build-firmware] - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.get-targets.outputs.matrix )}} - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - scripts - boards - chips - - - uses: ./.github/actions/merge-partitions - with: - python-version: ${{ env.PYTHON_VERSION }} - board: ${{ matrix.board }} - skip-checkout: true + build: + needs: getvars + uses: ./.github/workflows/build-all.yml + with: + version: ${{ needs.getvars.outputs.version }} + board-matrix: ${{ needs.getvars.outputs.board-matrix }} checkpoint-build: runs-on: ubuntu-latest - needs: [build-staticfs, merge-partitions] + needs: [getvars, build] steps: - run: echo "Builds checkpoint reached" + + publish: + if: ${{ needs.getvars.outputs.should-deploy == 'true' }} + needs: [getvars, checkpoint-build] + uses: ./.github/workflows/publish-all.yml + with: + version: ${{ needs.getvars.outputs.version }} + release-channel: ${{ needs.getvars.outputs.release-channel }} + is-prerelease: ${{ needs.getvars.outputs.release-channel != 'stable' }} + board-list: ${{ needs.getvars.outputs.board-list }} + board-matrix: ${{ needs.getvars.outputs.board-matrix }} + release-notes: ${{ needs.getvars.outputs.release-notes }} diff --git a/.github/workflows/ci-tag.yml b/.github/workflows/ci-tag.yml deleted file mode 100644 index c4b9cb13..00000000 --- a/.github/workflows/ci-tag.yml +++ /dev/null @@ -1,203 +0,0 @@ -on: - push: - tags: - - '[0-9]+.[0-9]+.[0-9]+' - - '[0-9]+.[0-9]+.[0-9]+-*' - workflow_dispatch: - -name: ci-tag -run-name: 'ci-tag: ${{ github.ref_name }}' - -env: - NODE_VERSION: 18 - PYTHON_VERSION: 3.12 - OPENSHOCK_API_DOMAIN: api.shocklink.net - # OPENSHOCK_FW_VERSION: - # - Since this is a tag push, we can use ref_name to get the tag name. - OPENSHOCK_FW_VERSION: ${{ github.ref_name }} - OPENSHOCK_FW_COMMIT: ${{ github.sha }} - -jobs: - # Read platformio.ini and extract all specific targets. See the referenced file for more info. - get-targets: - uses: ./.github/workflows/get-targets.yml - - build-frontend: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - frontend - - - uses: ./.github/actions/build-frontend - with: - node-version: ${{ env.NODE_VERSION }} - skip-checkout: true - - build-staticfs: - runs-on: ubuntu-latest - needs: build-frontend - - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/build-staticfs - with: - python-version: ${{ env.PYTHON_VERSION }} - skip-checkout: true - - build-firmware: - runs-on: ubuntu-latest - needs: get-targets - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.get-targets.outputs.matrix) }} - - steps: - - uses: actions/checkout@v4 - - - uses: ./.github/actions/build-firmware - with: - python-version: ${{ env.PYTHON_VERSION }} - board: ${{ matrix.board }} - skip-checkout: true - - merge-partitions: - runs-on: ubuntu-latest - needs: [get-targets, build-staticfs, build-firmware] - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.get-targets.outputs.matrix )}} - - steps: - - uses: actions/checkout@v4 - with: - path: . - sparse-checkout: | - .github - scripts - boards - chips - - - name: Merge images - uses: ./.github/actions/merge-partitions - with: - python-version: ${{ env.PYTHON_VERSION }} - board: ${{ matrix.board }} - skip-checkout: true - - checkpoint-build: - runs-on: ubuntu-latest - needs: [build-staticfs, merge-partitions] - steps: - - run: echo "Builds checkpoint reached" - - cdn-upload-firmware: - runs-on: ubuntu-latest - needs: [get-targets, checkpoint-build] - environment: cdn-firmware-r2 - strategy: - fail-fast: true - matrix: ${{ fromJson(needs.get-targets.outputs.matrix )}} - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-upload-firmware - with: - cf-bucket: ${{ vars.S3_BUCKET }} - board: ${{ matrix.board }} - version: ${{ github.ref_name }} - release-channel: ${{ contains(github.ref_name, '-') && 'stable' || 'beta' }} - - cdn-upload-version-info: - runs-on: ubuntu-latest - needs: [get-targets, checkpoint-build] - environment: cdn-firmware-r2 - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-upload-version-info - with: - cf-bucket: ${{ vars.S3_BUCKET }} - version: ${{ github.ref_name }} - boards: ${{ needs.get-targets.outputs.board-list }} - - cdn-bump-version: - runs-on: ubuntu-latest - needs: [cdn-upload-firmware] # only after version is complete - environment: cdn-firmware-r2 - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-bump-version - with: - cf-bucket: ${{ vars.S3_BUCKET }} - version: ${{ github.ref_name }} - release-channel: ${{ !contains(github.ref_name, '-') && 'stable' || 'beta' }} - - checkpoint-cdn: - runs-on: ubuntu-latest - needs: [checkpoint-build, cdn-upload-firmware, cdn-upload-version-info, cdn-bump-version] - steps: - - run: echo "CDN checkpoint reached" - - release: - runs-on: ubuntu-latest - needs: [checkpoint-cdn] - - steps: - - name: Download release notes - uses: actions/checkout@v4 - with: - sparse-checkout: | - RELEASE.md - - - name: Download release artifacts - uses: actions/download-artifact@v4 - - - name: Release - uses: ncipollo/release-action@v1 - with: - artifacts: '**/OpenShock_*.bin' - tag: ${{ github.ref_name }} - prerelease: ${{ contains(github.ref_name, '-') }} - artifactErrorsFailBuild: true - bodyFile: RELEASE.md diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4df561a4..dccdd083 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -9,28 +9,28 @@ on: - cron: '0 6 * * 1' env: - NODE_VERSION: 18 - PYTHON_VERSION: 3.12 OPENSHOCK_API_DOMAIN: api.shocklink.net - # OPENSHOCK_FW_VERSION: - # - If this is branch "master" or "develop", we use "0.0.0-master" or "0.0.0-develop" respectively. - # - All other scenarios we use "0.0.0-unknown", as we cannot guarantee SemVer compliance by accepting any branch name. So this is the safe option. - OPENSHOCK_FW_VERSION: ${{ (contains(fromJSON('["master","develop"]'), github.ref_name) && format('0.0.0-{0}', github.ref_name)) || '0.0.0-unknown' }} - OPENSHOCK_FW_COMMIT: ${{ github.sha }} + OPENSHOCK_FW_GIT_REF: ${{ github.ref }} + OPENSHOCK_FW_GIT_COMMIT: ${{ github.sha }} + OPENSHOCK_FW_BUILD_DATE: ${{ github.event.head_commit.timestamp }} jobs: - get-targets: - uses: ./.github/workflows/get-targets.yml + get-vars: + uses: ./.github/workflows/get-vars.yml analyze-js-py: name: Analyze JS/PY runs-on: 'ubuntu-latest' + needs: get-vars timeout-minutes: 360 permissions: actions: read contents: read security-events: write + env: + OPENSHOCK_FW_VERSION: ${{ needs.get-vars.outputs.version }} + strategy: fail-fast: false matrix: @@ -59,7 +59,7 @@ jobs: analyze-cpp: name: Analyze C/C++ runs-on: 'ubuntu-latest' - needs: [get-targets] + needs: get-vars timeout-minutes: 360 permissions: actions: read @@ -68,11 +68,12 @@ jobs: env: language: 'c-cpp' + OPENSHOCK_FW_VERSION: ${{ needs.get-vars.outputs.version }} strategy: fail-fast: false matrix: - board: ${{ fromJson(needs.get-targets.outputs.board-array) }} + board: ${{ fromJson(needs.get-vars.outputs.board-array) }} steps: - name: Checkout repository @@ -85,7 +86,7 @@ jobs: - uses: ./.github/actions/build-firmware with: - python-version: ${{ env.PYTHON_VERSION }} + python-version: 3.12 board: ${{ matrix.board }} skip-checkout: true diff --git a/.github/workflows/get-targets.yml b/.github/workflows/get-targets.yml deleted file mode 100644 index 6da6a31c..00000000 --- a/.github/workflows/get-targets.yml +++ /dev/null @@ -1,73 +0,0 @@ - -# This is a bit of a silly workflow, but Github Workflow definitions -# do not let us easily reuse the strategy matrix used to trigger jobs -# per-board. This is a workaround to define everything in one file, and -# use the output in the multiple places we need it. -# -# Source: https://github.com/orgs/community/discussions/26284#discussioncomment-6701976 - -on: - workflow_call: - outputs: - board-list: - description: "Newline-separated list of boards" - value: ${{ jobs.get-targets.outputs.board-list }} - board-array: - description: "JSON array of boards" - value: ${{ jobs.get-targets.outputs.board-array }} - matrix: - description: "Strategy matrix with a single key 'board', containing a list of all boards." - value: ${{ jobs.get-targets.outputs.matrix }} - -name: targets - -jobs: - get-targets: - runs-on: ubuntu-latest - outputs: - board-array: ${{ steps.board-array.outputs.array }} - board-list: ${{ steps.board-list.outputs.list }} - matrix: ${{ steps.matrix.outputs.matrix }} - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: platformio.ini - - # There's a lot going on here, so bear with me. - # - # sed: - # -n Suppresses normal output, - # "s/^\[env:\(.*\)]$/\1 Substitutes "[env:...]" with whatever value is at "..." - # /p" Prints out the substituted value (i.e. the value of "...") - # platformio.ini Reading from this file. - # - # jq: - # "--raw-input --slurp" Takes the previous output, - # -c Output in compact mode (no newlines or unnecessary spaces), - # split("\n") Splits it by line, turning it into an array, - # [ .[] | select(length > 0) Filters out empty lines (there is an empty trailing line usually), - # | select(. != "fs") ] Filters out the "fs" entry since that's only for building the static filesystem, - # { board: ... } Wraps the whole thing into a JSON object with only a "board" key - # and the array in question as value. - # - # echo "matrix=$(...)" >> $GITHUB_OUTPUT Sets the value as job output with name "matrix". - # - # Referenced: https://unix.stackexchange.com/a/278377 - # Referenced: https://github.com/jqlang/jq/issues/563 - - name: Extract board array - id: board-array - run: | - echo "array=$(sed -n "s/^\[env:\(.*\)]$/\1/p" platformio.ini | jq --raw-input --slurp -c 'split("\n") | [ .[] | select(length > 0) | select(. != "fs") ]')" >> $GITHUB_OUTPUT - - - name: Build strategy matrix - id: matrix - run: | - echo "matrix=$(echo '${{ steps.board-array.outputs.array }}' | jq -c '{ board: . }')" >> $GITHUB_OUTPUT - - - name: Build board list - id: board-list - run: | - echo "list<> $GITHUB_OUTPUT - echo "$(echo '${{ steps.board-array.outputs.array }}' | jq -r '. | join("\n")' | sed 's|\\n|\n|g')" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT diff --git a/.github/workflows/get-vars.yml b/.github/workflows/get-vars.yml new file mode 100644 index 00000000..5ab44530 --- /dev/null +++ b/.github/workflows/get-vars.yml @@ -0,0 +1,105 @@ +# This is a bit of a silly workflow, but Github Workflow definitions +# do not let us easily reuse the strategy matrix used to trigger jobs +# per-board. This is a workaround to define everything in one file, and +# use the output in the multiple places we need it. +# +# Source: https://github.com/orgs/community/discussions/26284#discussioncomment-6701976 + +on: + workflow_call: + inputs: + node-version: + type: string + default: '18' + description: 'The Node.js version to use' + outputs: + version: + description: 'The current version of the project, e.g. 1.0.0-rc.1+build.1' + value: ${{ jobs.get-vars.outputs.version }} + changelog: + description: 'The changelog for the current version' + value: ${{ jobs.get-vars.outputs.changelog }} + release-notes: + description: 'The release notes for the current version (changelog + contents of RELEASE.md)' + value: ${{ jobs.get-vars.outputs.release-notes }} + release-channel: + description: 'The release channel for the current version (stable, beta, dev)' + value: ${{ jobs.get-vars.outputs.release-channel }} + full-changelog: + description: 'The complete changelog for all versions ever released' + value: ${{ jobs.get-vars.outputs.full-changelog }} + board-list: + description: 'Newline-separated list of boards to build' + value: ${{ jobs.get-vars.outputs.board-list }} + board-array: + description: 'JSON array of boards to build' + value: ${{ jobs.get-vars.outputs.board-array }} + board-matrix: + description: 'JSON matrix of boards to build' + value: ${{ jobs.get-vars.outputs.board-matrix }} + should-deploy: + description: 'Whether to deploy the current version' + value: ${{ jobs.get-vars.outputs.should-deploy }} + release-stable-list: + description: 'Newline-separated list of stable releases' + value: ${{ jobs.get-vars.outputs.release-stable-list }} + release-stable-array: + description: 'JSON array of stable releases' + value: ${{ jobs.get-vars.outputs.release-stable-array }} + release-beta-list: + description: 'Newline-separated list of beta releases' + value: ${{ jobs.get-vars.outputs.release-beta-list }} + release-beta-array: + description: 'JSON array of beta releases' + value: ${{ jobs.get-vars.outputs.release-beta-array }} + release-dev-list: + description: 'Newline-separated list of dev releases' + value: ${{ jobs.get-vars.outputs.release-dev-list }} + release-dev-array: + description: 'JSON array of dev releases' + value: ${{ jobs.get-vars.outputs.release-dev-array }} + +name: get-vars + +jobs: + get-vars: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.get-vars.outputs.version }} + changelog: ${{ steps.get-vars.outputs.changelog }} + release-notes: ${{ steps.get-vars.outputs.release-notes }} + release-channel: ${{ steps.get-vars.outputs.release-channel }} + full-changelog: ${{ steps.get-vars.outputs.full-changelog }} + board-list: ${{ steps.get-vars.outputs.board-list }} + board-array: ${{ steps.get-vars.outputs.board-array }} + board-matrix: ${{ steps.get-vars.outputs.board-matrix }} + should-deploy: ${{ steps.get-vars.outputs.should-deploy }} + release-stable-list: ${{ steps.get-vars.outputs.release-stable-list }} + release-stable-array: ${{ steps.get-vars.outputs.release-stable-array }} + release-beta-list: ${{ steps.get-vars.outputs.release-beta-list }} + release-beta-array: ${{ steps.get-vars.outputs.release-beta-array }} + release-dev-list: ${{ steps.get-vars.outputs.release-dev-list }} + release-dev-array: ${{ steps.get-vars.outputs.release-dev-array }} + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + sparse-checkout: | + .github + + - uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.node-version }} + cache: 'npm' + cache-dependency-path: ./.github/scripts/package-lock.json + + - name: Install dependencies + working-directory: ./.github/scripts + shell: bash + run: npm ci + + - name: Get variables + id: get-vars + shell: bash + run: node ./.github/scripts/get-vars.js diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml new file mode 100644 index 00000000..772966ba --- /dev/null +++ b/.github/workflows/publish-all.yml @@ -0,0 +1,130 @@ +on: + workflow_call: + inputs: + version: + type: string + required: true + description: 'Firmware version to publish' + release-channel: + type: string + required: true + description: 'Release channel to publish to' + is-prerelease: + type: boolean + required: true + description: 'Whether this is a prerelease' + board-list: + type: string + required: true + description: 'JSON list of boards to publish' + board-matrix: + type: string + required: true + description: 'JSON matrix of boards to publish' + release-notes: + type: string + required: true + description: 'Release notes for this release' + +name: Publish release + +jobs: + cdn-upload-firmware: + runs-on: ubuntu-latest + environment: cdn-firmware-r2 + strategy: + fail-fast: true + matrix: ${{ fromJson(inputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-upload-firmware + with: + cf-bucket: ${{ vars.S3_BUCKET }} + board: ${{ matrix.board }} + version: ${{ inputs.version }} + release-channel: ${{ inputs.release-channel }} + + cdn-upload-version-info: + runs-on: ubuntu-latest + environment: cdn-firmware-r2 + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-upload-version-info + with: + cf-bucket: ${{ vars.S3_BUCKET }} + version: ${{ inputs.version }} + boards: ${{ inputs.board-list }} + + cdn-bump-version: + runs-on: ubuntu-latest + needs: [cdn-upload-firmware] # only after version is complete + environment: cdn-firmware-r2 + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-bump-version + with: + cf-bucket: ${{ vars.S3_BUCKET }} + version: ${{ inputs.version }} + release-channel: ${{ inputs.release-channel }} + + checkpoint-cdn: + runs-on: ubuntu-latest + needs: [cdn-upload-firmware, cdn-upload-version-info, cdn-bump-version] + steps: + - run: echo "CDN checkpoint reached" + + release: + runs-on: ubuntu-latest + needs: [checkpoint-cdn] + + steps: + - name: Download release artifacts + uses: actions/download-artifact@v4 + + - name: Release + uses: ncipollo/release-action@v1 + with: + artifacts: '**/OpenShock_*.bin' + tag: ${{ inputs.version }} + prerelease: ${{ inputs.is-prerelease }} + artifactErrorsFailBuild: true + body: ${{ inputs.release-notes }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..cb7b69e7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Version 1.0.0 + +- We now support **six different boards**: + - Pishock (2023) + - Pishock Lite (2021) + - Seeed Xiao ESP32S3 + - Wemos D1 Mini ESP32 + - Wemos Lolin S2 Mini + - Wemos Lolin S3 +- All communication is now **websocket based** and using flatbuffers, allowing for even lower latency between the server and the ESP, with lower resource consumption. +- The **Captive Portal** got a MASSIVE overhaul; +- Serial commands have gotten alot better. +- Improved board stability and configurability. +- Added support for having a E-Stop (emergency stop) connected to ESP as a panic button. Thanks to @nullstalgia ❤️ +- And _much, much_ more behind the scenes, including bugfixes and code cleanup. + +# Version 1.0.0-rc.4 + +# Version 1.0.0-rc.3 + +# Version 1.0.0-rc.2 + +# Version 1.0.0-rc.1 + +# Version v0.8.1 diff --git a/RELEASE.md b/RELEASE.md index de132a1a..fe4b9ade 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,4 +1,4 @@ -# OpenShock Firmware +## Flashing the firmware Download `OpenShock_[board]_[version].bin` and flash it to your microcontroller: diff --git a/scripts/embed_env_vars.py b/scripts/embed_env_vars.py index 2c605e4b..c73ca571 100644 --- a/scripts/embed_env_vars.py +++ b/scripts/embed_env_vars.py @@ -59,7 +59,7 @@ def macroify(s: str) -> str: vars['OPENSHOCK_FW_MODE'] = pio_build_type git_commit = get_git_commit() if git_commit is not None: - vars['OPENSHOCK_FW_COMMIT'] = git_commit + vars['OPENSHOCK_FW_GIT_COMMIT'] = git_commit return vars @@ -92,16 +92,16 @@ def transform_cpp_define_string(k: str, v: str) -> str: if v.startswith('"') and v.endswith('"'): v = v[1:-1] - # Special case for OPENSHOCK_FW_COMMIT. - if k == 'OPENSHOCK_FW_COMMIT' and len(v) > 7: + # Special case for OPENSHOCK_FW_GIT_COMMIT. + if k == 'OPENSHOCK_FW_GIT_COMMIT' and len(v) > 7: v = v[0:7] return env.StringifyMacro(v) def serialize_cpp_define(k: str, v: str | int | bool) -> str | int: - # Special case for OPENSHOCK_FW_COMMIT. - if k == 'OPENSHOCK_FW_COMMIT': + # Special case for OPENSHOCK_FW_GIT_COMMIT. + if k == 'OPENSHOCK_FW_GIT_COMMIT': return transform_cpp_define_string(k, str(v)) try: diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 93220db9..1bc4a22e 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -14,7 +14,7 @@ constexpr std::size_t HTTP_BUFFER_SIZE = 4096LLU; constexpr int HTTP_DOWNLOAD_SIZE_LIMIT = 200 * 1024 * 1024; // 200 MB const char* const TAG = "HTTPRequestManager"; -const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (Espressif; " OPENSHOCK_FW_CHIP "; " OPENSHOCK_FW_BOARD ") " OPENSHOCK_FW_COMMIT; +const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (Espressif; " OPENSHOCK_FW_CHIP "; " OPENSHOCK_FW_BOARD ") " OPENSHOCK_FW_GIT_COMMIT; struct RateLimit { RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() { } diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 27716545..b0500969 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -868,7 +868,7 @@ void SerialInputHandler::PrintVersionInfo() { Serial.print("\ Version: " OPENSHOCK_FW_VERSION "\n\ Build: " OPENSHOCK_FW_MODE "\n\ - Commit: " OPENSHOCK_FW_COMMIT "\n\ + Commit: " OPENSHOCK_FW_GIT_COMMIT "\n\ Board: " OPENSHOCK_FW_BOARD "\n\ Chip: " OPENSHOCK_FW_CHIP "\n\ "); From f99d8b0bb48bb2ef1b14429710c76ec92b1b39a5 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 17:03:59 +0100 Subject: [PATCH 097/147] Fix some CI/CD bugs/lookovers --- .github/actions/cdn-bump-version/action.yml | 11 +++++------ .github/actions/cdn-prepare/action.yml | 2 +- .github/actions/cdn-upload-firmware/action.yml | 10 +++------- .github/actions/cdn-upload-version-info/action.yml | 8 ++++---- .github/actions/merge-partitions/action.yml | 5 ++++- .github/workflows/build-all.yml | 5 +++++ .github/workflows/ci-build.yml | 1 + .github/workflows/publish-all.yml | 5 ++--- 8 files changed, 25 insertions(+), 22 deletions(-) diff --git a/.github/actions/cdn-bump-version/action.yml b/.github/actions/cdn-bump-version/action.yml index ea0effd4..e273fd7f 100644 --- a/.github/actions/cdn-bump-version/action.yml +++ b/.github/actions/cdn-bump-version/action.yml @@ -1,16 +1,15 @@ -name: cnd-bump-version +name: cdn-bump-version description: Uploads version file to CDN inputs: cf-bucket: description: Name of the S3 bucket required: true - version: - description: Version to upload + version-list: + description: 'List of versions, separated by newlines' required: true release-channel: description: 'Release channel that describes this upload' - required: false - default: 'none' + required: true runs: using: composite @@ -20,5 +19,5 @@ runs: shell: bash run: | mkdir upload - echo "${{ inputs.version }}" >> upload/version-${{ inputs.release-channel }}.txt + echo "${{ inputs.version-list }}" >> upload/version-${{ inputs.release-channel }}.txt rclone copy upload cdn:${{ inputs.cf-bucket }}/ diff --git a/.github/actions/cdn-prepare/action.yml b/.github/actions/cdn-prepare/action.yml index 9c3e8d59..3f70b0c1 100644 --- a/.github/actions/cdn-prepare/action.yml +++ b/.github/actions/cdn-prepare/action.yml @@ -1,4 +1,4 @@ -name: cnd-prepare +name: cdn-prepare description: Prepares the CDN for firmware uploads inputs: cf-account-id: diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 1dbdbcb8..3b2d9f81 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -1,16 +1,12 @@ -name: cnd-upload-firmware +name: cdn-upload-firmware description: Uploads firmware partitions and merged binaries to CDN along with SHA256 checksums inputs: cf-bucket: description: Name of the S3 bucket required: true - version: - description: Version to upload - required: true release-channel: description: 'Release channel that describes this upload' - required: false - default: 'none' + required: true board: description: 'Board to upload' required: true @@ -53,4 +49,4 @@ runs: mkdir upload mv *.bin upload/ mv hashes.*.txt upload/ - rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.version }}/${{ inputs.board }}/ + rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/ diff --git a/.github/actions/cdn-upload-version-info/action.yml b/.github/actions/cdn-upload-version-info/action.yml index 5df039f8..65db5699 100644 --- a/.github/actions/cdn-upload-version-info/action.yml +++ b/.github/actions/cdn-upload-version-info/action.yml @@ -1,11 +1,11 @@ -name: cnd-upload-version-info +name: cdn-upload-version-info description: Uploads version specific info to CDN inputs: cf-bucket: description: Name of the S3 bucket required: true - version: - description: Version to upload + release-channel: + description: 'Release channel that describes this upload' required: true boards: description: 'List of boards, separated by newlines' @@ -24,4 +24,4 @@ runs: run: | mkdir upload mv boards.txt upload/ - rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.version }}/${{ inputs.board }}/ + rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/ diff --git a/.github/actions/merge-partitions/action.yml b/.github/actions/merge-partitions/action.yml index 75d279da..6093dde1 100644 --- a/.github/actions/merge-partitions/action.yml +++ b/.github/actions/merge-partitions/action.yml @@ -4,6 +4,9 @@ inputs: python-version: description: 'Python version to use' required: true + release-channel: + description: 'Release channel that describes this upload' + required: true board: description: 'Board name to merge partitions for' required: true @@ -46,7 +49,7 @@ runs: shell: bash run: | python scripts/merge_image.py ${{ inputs.board }} - mv merged.bin OpenShock_${{ inputs.board }}_${{ !contains(github.ref_name, '/') && github.ref_name || 'unknown' }}.bin + mv merged.bin OpenShock_${{ inputs.board }}_${{ inputs.release-channel }}.bin - name: Upload merged firmware binary uses: actions/upload-artifact@v3 diff --git a/.github/workflows/build-all.yml b/.github/workflows/build-all.yml index 70dea7b1..2b1aca27 100644 --- a/.github/workflows/build-all.yml +++ b/.github/workflows/build-all.yml @@ -15,6 +15,10 @@ on: type: string required: true description: 'The version of the firmware' + release-channel: + type: string + required: true + description: 'The release channel to use' board-matrix: type: string required: true @@ -81,5 +85,6 @@ jobs: - uses: ./.github/actions/merge-partitions with: python-version: ${{ inputs.python-version }} + release-channel: ${{ inputs.release-channel }} board: ${{ matrix.board }} skip-checkout: true diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 5b338b31..fcfd0f44 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -26,6 +26,7 @@ jobs: uses: ./.github/workflows/build-all.yml with: version: ${{ needs.getvars.outputs.version }} + release-channel: ${{ needs.getvars.outputs.release-channel }} board-matrix: ${{ needs.getvars.outputs.board-matrix }} checkpoint-build: diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml index 772966ba..3cff39c9 100644 --- a/.github/workflows/publish-all.yml +++ b/.github/workflows/publish-all.yml @@ -53,9 +53,8 @@ jobs: - uses: ./.github/actions/cdn-upload-firmware with: cf-bucket: ${{ vars.S3_BUCKET }} - board: ${{ matrix.board }} - version: ${{ inputs.version }} release-channel: ${{ inputs.release-channel }} + board: ${{ matrix.board }} cdn-upload-version-info: runs-on: ubuntu-latest @@ -78,7 +77,7 @@ jobs: - uses: ./.github/actions/cdn-upload-version-info with: cf-bucket: ${{ vars.S3_BUCKET }} - version: ${{ inputs.version }} + release-channel: ${{ inputs.release-channel }} boards: ${{ inputs.board-list }} cdn-bump-version: From 65150c1e9860be5d72fbe41373d58e491c3f1985 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 17:30:21 +0100 Subject: [PATCH 098/147] Attempt to fix R2 uploads --- .github/actions/cdn-upload-firmware/action.yml | 2 +- .github/actions/cdn-upload-version-info/action.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 3b2d9f81..96b98d66 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -49,4 +49,4 @@ runs: mkdir upload mv *.bin upload/ mv hashes.*.txt upload/ - rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/ + rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' diff --git a/.github/actions/cdn-upload-version-info/action.yml b/.github/actions/cdn-upload-version-info/action.yml index 65db5699..fde44fa7 100644 --- a/.github/actions/cdn-upload-version-info/action.yml +++ b/.github/actions/cdn-upload-version-info/action.yml @@ -24,4 +24,4 @@ runs: run: | mkdir upload mv boards.txt upload/ - rclone copy upload cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/ + rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' From fe01f4ed97f4f58d2004f19288b44b2cccd86032 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 17:52:30 +0100 Subject: [PATCH 099/147] Couple more fixes --- .github/workflows/ci-build.yml | 1 + .github/workflows/publish-all.yml | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index fcfd0f44..39652a74 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -46,3 +46,4 @@ jobs: board-list: ${{ needs.getvars.outputs.board-list }} board-matrix: ${{ needs.getvars.outputs.board-matrix }} release-notes: ${{ needs.getvars.outputs.release-notes }} + secrets: inherit diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml index 3cff39c9..de8e3936 100644 --- a/.github/workflows/publish-all.yml +++ b/.github/workflows/publish-all.yml @@ -25,6 +25,9 @@ on: type: string required: true description: 'Release notes for this release' + secrets: + S3_SECRET_ACCESS_KEY: + required: true name: Publish release @@ -112,6 +115,7 @@ jobs: - run: echo "CDN checkpoint reached" release: + if: (inputs.release-channel == 'stable' || inputs.release-channel == 'beta') runs-on: ubuntu-latest needs: [checkpoint-cdn] From ef774c31d2c4c0695841d58b96fd81a8ac69d44d Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 18:04:54 +0100 Subject: [PATCH 100/147] Fix version upload --- .github/actions/cdn-bump-version/action.yml | 1 - .github/workflows/ci-build.yml | 3 +++ .github/workflows/publish-all.yml | 30 +++++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/.github/actions/cdn-bump-version/action.yml b/.github/actions/cdn-bump-version/action.yml index e273fd7f..57c6bca6 100644 --- a/.github/actions/cdn-bump-version/action.yml +++ b/.github/actions/cdn-bump-version/action.yml @@ -14,7 +14,6 @@ inputs: runs: using: composite steps: - - name: Upload version file shell: bash run: | diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 39652a74..c9a3568e 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -46,4 +46,7 @@ jobs: board-list: ${{ needs.getvars.outputs.board-list }} board-matrix: ${{ needs.getvars.outputs.board-matrix }} release-notes: ${{ needs.getvars.outputs.release-notes }} + release-stable-list: ${{ needs.getvars.outputs.release-stable-list }} + release-beta-list: ${{ needs.getvars.outputs.release-beta-list }} + release-dev-list: ${{ needs.getvars.outputs.release-dev-list }} secrets: inherit diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml index de8e3936..c2ad1dce 100644 --- a/.github/workflows/publish-all.yml +++ b/.github/workflows/publish-all.yml @@ -25,6 +25,18 @@ on: type: string required: true description: 'Release notes for this release' + release-stable-list: + type: string + required: true + description: Newline-separated list of all stable releases + release-beta-list: + type: string + required: true + description: Newline-separated list of all beta releases + release-dev-list: + type: string + required: true + description: Newline-separated list of all dev releases secrets: S3_SECRET_ACCESS_KEY: required: true @@ -105,8 +117,22 @@ jobs: - uses: ./.github/actions/cdn-bump-version with: cf-bucket: ${{ vars.S3_BUCKET }} - version: ${{ inputs.version }} - release-channel: ${{ inputs.release-channel }} + version-list: ${{ inputs.release-stable-list }} + release-channel: stable + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-bump-version + with: + cf-bucket: ${{ vars.S3_BUCKET }} + version-list: ${{ inputs.release-beta-list }} + release-channel: beta + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-bump-version + with: + cf-bucket: ${{ vars.S3_BUCKET }} + version-list: ${{ inputs.release-dev-list }} + release-channel: dev checkpoint-cdn: runs-on: ubuntu-latest From ab619e687424a7df9524f16fdefaac6e4ecfbb31 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 18:06:29 +0100 Subject: [PATCH 101/147] Use md5sum for md5's :eyes: --- .github/actions/cdn-upload-firmware/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 96b98d66..066d7612 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -40,7 +40,7 @@ runs: - name: Generate SHA256 checksums shell: bash run: | - find . -type f -name '*.bin' -exec sha256sum {} \; > hashes.md5.txt + find . -type f -name '*.bin' -exec md5sum {} \; > hashes.md5.txt find . -type f -name '*.bin' -exec sha256sum {} \; > hashes.sha256.txt - name: Upload artifacts to CDN From c447858bfbd46f51574a01b41ed4d917b0ea9b8c Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 18:12:08 +0100 Subject: [PATCH 102/147] Final fix --- .github/actions/cdn-bump-version/action.yml | 2 +- .github/actions/cdn-upload-firmware/action.yml | 2 +- .github/actions/cdn-upload-version-info/action.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/cdn-bump-version/action.yml b/.github/actions/cdn-bump-version/action.yml index 57c6bca6..f343e73c 100644 --- a/.github/actions/cdn-bump-version/action.yml +++ b/.github/actions/cdn-bump-version/action.yml @@ -17,6 +17,6 @@ runs: - name: Upload version file shell: bash run: | - mkdir upload + mkdir -p upload echo "${{ inputs.version-list }}" >> upload/version-${{ inputs.release-channel }}.txt rclone copy upload cdn:${{ inputs.cf-bucket }}/ diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 066d7612..7efe7b2e 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -46,7 +46,7 @@ runs: - name: Upload artifacts to CDN shell: bash run: | - mkdir upload + mkdir -p upload mv *.bin upload/ mv hashes.*.txt upload/ rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' diff --git a/.github/actions/cdn-upload-version-info/action.yml b/.github/actions/cdn-upload-version-info/action.yml index fde44fa7..b5df22fd 100644 --- a/.github/actions/cdn-upload-version-info/action.yml +++ b/.github/actions/cdn-upload-version-info/action.yml @@ -22,6 +22,6 @@ runs: - name: Upload artifacts to CDN shell: bash run: | - mkdir upload + mkdir -p upload mv boards.txt upload/ rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' From 5080066a24ff473ff50593e0459f6c0f31cc3c99 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 18:24:35 +0100 Subject: [PATCH 103/147] Fix secret complaining --- .github/workflows/ci-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index c9a3568e..7ed4795a 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -49,4 +49,5 @@ jobs: release-stable-list: ${{ needs.getvars.outputs.release-stable-list }} release-beta-list: ${{ needs.getvars.outputs.release-beta-list }} release-dev-list: ${{ needs.getvars.outputs.release-dev-list }} - secrets: inherit + secrets: + S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} From 151f83ac9f4f1c47d1cae16d32821e6f986744f0 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Thu, 11 Jan 2024 18:34:05 +0100 Subject: [PATCH 104/147] Revert multiline version.txt --- .github/actions/cdn-bump-version/action.yml | 6 ++--- .github/workflows/ci-build.yml | 3 --- .github/workflows/publish-all.yml | 30 ++------------------- 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/.github/actions/cdn-bump-version/action.yml b/.github/actions/cdn-bump-version/action.yml index f343e73c..6f76f067 100644 --- a/.github/actions/cdn-bump-version/action.yml +++ b/.github/actions/cdn-bump-version/action.yml @@ -4,8 +4,8 @@ inputs: cf-bucket: description: Name of the S3 bucket required: true - version-list: - description: 'List of versions, separated by newlines' + version: + description: 'Version of the release' required: true release-channel: description: 'Release channel that describes this upload' @@ -18,5 +18,5 @@ runs: shell: bash run: | mkdir -p upload - echo "${{ inputs.version-list }}" >> upload/version-${{ inputs.release-channel }}.txt + echo "${{ inputs.version }}" >> upload/version-${{ inputs.release-channel }}.txt rclone copy upload cdn:${{ inputs.cf-bucket }}/ diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 7ed4795a..812d63c5 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -46,8 +46,5 @@ jobs: board-list: ${{ needs.getvars.outputs.board-list }} board-matrix: ${{ needs.getvars.outputs.board-matrix }} release-notes: ${{ needs.getvars.outputs.release-notes }} - release-stable-list: ${{ needs.getvars.outputs.release-stable-list }} - release-beta-list: ${{ needs.getvars.outputs.release-beta-list }} - release-dev-list: ${{ needs.getvars.outputs.release-dev-list }} secrets: S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml index c2ad1dce..de8e3936 100644 --- a/.github/workflows/publish-all.yml +++ b/.github/workflows/publish-all.yml @@ -25,18 +25,6 @@ on: type: string required: true description: 'Release notes for this release' - release-stable-list: - type: string - required: true - description: Newline-separated list of all stable releases - release-beta-list: - type: string - required: true - description: Newline-separated list of all beta releases - release-dev-list: - type: string - required: true - description: Newline-separated list of all dev releases secrets: S3_SECRET_ACCESS_KEY: required: true @@ -117,22 +105,8 @@ jobs: - uses: ./.github/actions/cdn-bump-version with: cf-bucket: ${{ vars.S3_BUCKET }} - version-list: ${{ inputs.release-stable-list }} - release-channel: stable - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-bump-version - with: - cf-bucket: ${{ vars.S3_BUCKET }} - version-list: ${{ inputs.release-beta-list }} - release-channel: beta - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-bump-version - with: - cf-bucket: ${{ vars.S3_BUCKET }} - version-list: ${{ inputs.release-dev-list }} - release-channel: dev + version: ${{ inputs.version }} + release-channel: ${{ inputs.release-channel }} checkpoint-cdn: runs-on: ubuntu-latest From 6204b75fdb1954057e38d70bad391cbcecf75cd9 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 12 Jan 2024 17:08:37 +0100 Subject: [PATCH 105/147] Fix remaining problems with cicd pipeline --- .github/actions/build-firmware/action.yml | 2 +- .github/actions/build-frontend/action.yml | 2 +- .github/actions/build-staticfs/action.yml | 4 +- .../actions/cdn-upload-firmware/action.yml | 6 +- .github/actions/merge-partitions/action.yml | 6 +- .github/scripts/get-vars.js | 31 ++- .github/workflows/build-all.yml | 90 -------- .github/workflows/ci-build.yml | 192 ++++++++++++++++-- .github/workflows/publish-all.yml | 133 ------------ 9 files changed, 207 insertions(+), 259 deletions(-) delete mode 100644 .github/workflows/build-all.yml delete mode 100644 .github/workflows/publish-all.yml diff --git a/.github/actions/build-firmware/action.yml b/.github/actions/build-firmware/action.yml index 47bcd8f7..8d70b167 100644 --- a/.github/actions/build-firmware/action.yml +++ b/.github/actions/build-firmware/action.yml @@ -50,7 +50,7 @@ runs: OPENSHOCK_FW_BUILD_DATE: ${{ github.event.head_commit.timestamp }} - name: Upload build artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: firmware_build_${{ inputs.board }} path: .pio/build/${{ inputs.board }}/*.bin diff --git a/.github/actions/build-frontend/action.yml b/.github/actions/build-frontend/action.yml index dbab2ce2..d1b2e2ac 100644 --- a/.github/actions/build-frontend/action.yml +++ b/.github/actions/build-frontend/action.yml @@ -35,7 +35,7 @@ runs: run: npm run build - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: frontend path: frontend/build/* diff --git a/.github/actions/build-staticfs/action.yml b/.github/actions/build-staticfs/action.yml index 5f9d1791..7e0b9a55 100644 --- a/.github/actions/build-staticfs/action.yml +++ b/.github/actions/build-staticfs/action.yml @@ -33,7 +33,7 @@ runs: run: pip install -r requirements.txt - name: Download built frontend - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: frontend path: frontend/build/ @@ -47,7 +47,7 @@ runs: run: mv .pio/build/fs/littlefs.bin staticfs.bin - name: Upload internal filesystem artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: firmware_staticfs path: staticfs.bin diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 7efe7b2e..3d01c485 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -15,19 +15,19 @@ runs: using: composite steps: - name: Download static filesystem partition - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: firmware_staticfs path: . - name: Download firmware partitions - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: firmware_build_${{ inputs.board }} path: . - name: Download merged firmware binary - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: firmware_merged_${{ inputs.board }} path: . diff --git a/.github/actions/merge-partitions/action.yml b/.github/actions/merge-partitions/action.yml index 6093dde1..6ec3fc03 100644 --- a/.github/actions/merge-partitions/action.yml +++ b/.github/actions/merge-partitions/action.yml @@ -36,12 +36,12 @@ runs: run: pip install esptool - name: Download static filesystem partition - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: firmware_staticfs - name: Download firmware partitions - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: firmware_build_${{ inputs.board }} @@ -52,7 +52,7 @@ runs: mv merged.bin OpenShock_${{ inputs.board }}_${{ inputs.release-channel }}.bin - name: Upload merged firmware binary - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: firmware_merged_${{ inputs.board }} path: OpenShock_${{ inputs.board }}_*.bin diff --git a/.github/scripts/get-vars.js b/.github/scripts/get-vars.js index 38482a49..90cb22f2 100644 --- a/.github/scripts/get-vars.js +++ b/.github/scripts/get-vars.js @@ -54,9 +54,19 @@ const gitTagsArray = gitTagsList.split('\n').map((tag) => tag.trim()); const releasesArray = gitTagsArray.map(convertGitTagToSemver); const latestRelease = isGitTag ? convertGitTagToSemver(gitRef.split('/')[2]) : releasesArray[0]; -const stableReleasesArray = releasesArray.filter((release) => release.prerelease.length === 0 || release.prerelease[0] === 'stable'); -const betaReleasesArray = releasesArray.filter((release) => release.prerelease.length > 0 && ['rc', 'beta'].includes(release.prerelease[0])); -const devReleasesArray = releasesArray.filter((release) => release.prerelease.length > 0 && ['dev', 'develop'].includes(release.prerelease[0])); +function isStableRelease(release) { + return release.prerelease.length === 0 || release.prerelease[0] === 'stable'; +} +function isBetaRelease(release) { + return release.prerelease.length > 0 && ['rc', 'beta'].includes(release.prerelease[0]); +} +function isDevRelease(release) { + return release.prerelease.length > 0 && ['dev', 'develop'].includes(release.prerelease[0]); +} + +const stableReleasesArray = releasesArray.filter(isStableRelease); +const betaReleasesArray = releasesArray.filter(isBetaRelease); +const devReleasesArray = releasesArray.filter(isDevRelease); // Build version string let currentVersion = `${latestRelease.major}.${latestRelease.minor}.${latestRelease.patch}`; @@ -76,16 +86,23 @@ if (!isGitTag) { // Add the git commit hash to the version string currentVersion += `+${gitShortCommitHash}`; +} else { + if (latestRelease.prerelease.length > 0) { + currentVersion += `-${latestRelease.prerelease.join('.')}`; + } + if (latestRelease.build.length > 0) { + currentVersion += `+${latestRelease.build.join('.')}`; + } } // Get the channel to deploy to let currentChannel; -if (gitHeadRefName === 'master') { +if (gitHeadRefName === 'master' || (isGitTag && isStableRelease(latestRelease))) { currentChannel = 'stable'; -} else if (gitHeadRefName === 'develop') { - currentChannel = 'develop'; -} else if (gitHeadRefName === 'beta') { +} else if (gitHeadRefName === 'beta' || (isGitTag && isBetaRelease(latestRelease))) { currentChannel = 'beta'; +} else if (gitHeadRefName === 'develop' || (isGitTag && isDevRelease(latestRelease))) { + currentChannel = 'develop'; } else { currentChannel = gitHeadRefName.replace(/[^a-zA-Z0-9-]/g, '-').replace(/^\-+|\-+$/g, ''); } diff --git a/.github/workflows/build-all.yml b/.github/workflows/build-all.yml deleted file mode 100644 index 2b1aca27..00000000 --- a/.github/workflows/build-all.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: build-all - -on: - workflow_call: - inputs: - node-version: - type: string - default: '18' - description: 'The version of Node.js to use' - python-version: - type: string - default: '3.12' - description: 'The version of Python to use' - version: - type: string - required: true - description: 'The version of the firmware' - release-channel: - type: string - required: true - description: 'The release channel to use' - board-matrix: - type: string - required: true - description: 'A JSON matrix of boards to build for' - -jobs: - build-frontend: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - frontend - - - uses: ./.github/actions/build-frontend - with: - node-version: ${{ inputs.node-version }} - - build-staticfs: - runs-on: ubuntu-latest - needs: build-frontend - - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/build-staticfs - with: - python-version: ${{ inputs.python-version }} - skip-checkout: true - - build-firmware: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: ${{ fromJSON(inputs.board-matrix) }} - - steps: - - uses: actions/checkout@v4 - - - uses: ./.github/actions/build-firmware - with: - python-version: ${{ inputs.python-version }} - board: ${{ matrix.board }} - version: ${{ inputs.version }} - skip-checkout: true - - merge-partitions: - runs-on: ubuntu-latest - needs: [build-staticfs, build-firmware] - strategy: - fail-fast: false - matrix: ${{ fromJSON(inputs.board-matrix) }} - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - scripts - boards - chips - - - uses: ./.github/actions/merge-partitions - with: - python-version: ${{ inputs.python-version }} - release-channel: ${{ inputs.release-channel }} - board: ${{ matrix.board }} - skip-checkout: true diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 812d63c5..8e5584a4 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -17,34 +17,188 @@ on: name: ci-build +env: + NODE_VERSION: 18 + PYTHON_VERSION: 3.12 + jobs: getvars: uses: ./.github/workflows/get-vars.yml - build: - needs: getvars - uses: ./.github/workflows/build-all.yml - with: - version: ${{ needs.getvars.outputs.version }} - release-channel: ${{ needs.getvars.outputs.release-channel }} - board-matrix: ${{ needs.getvars.outputs.board-matrix }} + build-frontend: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + frontend + + - uses: ./.github/actions/build-frontend + with: + node-version: ${{ env.NODE_VERSION }} + + build-staticfs: + runs-on: ubuntu-latest + needs: build-frontend + + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/build-staticfs + with: + python-version: ${{ env.PYTHON_VERSION }} + skip-checkout: true + + build-firmware: + needs: [getvars] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.getvars.outputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/build-firmware + with: + python-version: ${{ env.PYTHON_VERSION }} + board: ${{ matrix.board }} + version: ${{ needs.getvars.outputs.version }} + skip-checkout: true + + merge-partitions: + needs: [getvars, build-staticfs, build-firmware] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.getvars.outputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + scripts + boards + chips + + - uses: ./.github/actions/merge-partitions + with: + python-version: ${{ env.PYTHON_VERSION }} + release-channel: ${{ needs.getvars.outputs.release-channel }} + board: ${{ matrix.board }} + skip-checkout: true checkpoint-build: runs-on: ubuntu-latest - needs: [getvars, build] + needs: [merge-partitions] steps: - run: echo "Builds checkpoint reached" - publish: + cdn-upload-firmware: + needs: [getvars, checkpoint-build] if: ${{ needs.getvars.outputs.should-deploy == 'true' }} + runs-on: ubuntu-latest + environment: cdn-firmware-r2 + strategy: + fail-fast: true + matrix: ${{ fromJson(needs.getvars.outputs.board-matrix) }} + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-upload-firmware + with: + cf-bucket: ${{ vars.S3_BUCKET }} + release-channel: ${{ inputs.release-channel }} + board: ${{ matrix.board }} + + cdn-upload-version-info: needs: [getvars, checkpoint-build] - uses: ./.github/workflows/publish-all.yml - with: - version: ${{ needs.getvars.outputs.version }} - release-channel: ${{ needs.getvars.outputs.release-channel }} - is-prerelease: ${{ needs.getvars.outputs.release-channel != 'stable' }} - board-list: ${{ needs.getvars.outputs.board-list }} - board-matrix: ${{ needs.getvars.outputs.board-matrix }} - release-notes: ${{ needs.getvars.outputs.release-notes }} - secrets: - S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} + if: ${{ needs.getvars.outputs.should-deploy == 'true' }} + runs-on: ubuntu-latest + environment: cdn-firmware-r2 + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-upload-version-info + with: + cf-bucket: ${{ vars.S3_BUCKET }} + release-channel: ${{ needs.getvars.outputs.release-channel }} + boards: ${{ needs.getvars.outputs.board-list }} + + cdn-bump-version: + runs-on: ubuntu-latest + needs: [getvars, cdn-upload-firmware] # only after version is complete + environment: cdn-firmware-r2 + + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + + # Set up rclone for CDN uploads. + - uses: ./.github/actions/cdn-prepare + with: + cf-account-id: ${{ vars.S3_ACCOUNT_ID }} + cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} + cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} + + # Upload firmware to CDN. + - uses: ./.github/actions/cdn-bump-version + with: + cf-bucket: ${{ vars.S3_BUCKET }} + version: ${{ needs.getvars.outputs.version }} + release-channel: ${{ needs.getvars.outputs.release-channel }} + + checkpoint-cdn: + runs-on: ubuntu-latest + needs: [cdn-upload-firmware, cdn-upload-version-info, cdn-bump-version] + steps: + - run: echo "CDN checkpoint reached" + + release: + needs: [getvars, checkpoint-cdn] + if: (needs.getvars.outputs.release-channel == 'stable' || needs.getvars.outputs.release-channel == 'beta') + runs-on: ubuntu-latest + + steps: + - name: Download release artifacts + uses: actions/download-artifact@v4 + + - name: Display artifacts + run: ls -R + + - name: Release + uses: ncipollo/release-action@v1 + with: + artifacts: '**/OpenShock_*.bin' + tag: ${{ needs.getvars.outputs.version }} + prerelease: ${{ needs.getvars.outputs.is-prerelease }} + artifactErrorsFailBuild: true + body: ${{ needs.getvars.outputs.release-notes }} diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish-all.yml deleted file mode 100644 index de8e3936..00000000 --- a/.github/workflows/publish-all.yml +++ /dev/null @@ -1,133 +0,0 @@ -on: - workflow_call: - inputs: - version: - type: string - required: true - description: 'Firmware version to publish' - release-channel: - type: string - required: true - description: 'Release channel to publish to' - is-prerelease: - type: boolean - required: true - description: 'Whether this is a prerelease' - board-list: - type: string - required: true - description: 'JSON list of boards to publish' - board-matrix: - type: string - required: true - description: 'JSON matrix of boards to publish' - release-notes: - type: string - required: true - description: 'Release notes for this release' - secrets: - S3_SECRET_ACCESS_KEY: - required: true - -name: Publish release - -jobs: - cdn-upload-firmware: - runs-on: ubuntu-latest - environment: cdn-firmware-r2 - strategy: - fail-fast: true - matrix: ${{ fromJson(inputs.board-matrix) }} - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-upload-firmware - with: - cf-bucket: ${{ vars.S3_BUCKET }} - release-channel: ${{ inputs.release-channel }} - board: ${{ matrix.board }} - - cdn-upload-version-info: - runs-on: ubuntu-latest - environment: cdn-firmware-r2 - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-upload-version-info - with: - cf-bucket: ${{ vars.S3_BUCKET }} - release-channel: ${{ inputs.release-channel }} - boards: ${{ inputs.board-list }} - - cdn-bump-version: - runs-on: ubuntu-latest - needs: [cdn-upload-firmware] # only after version is complete - environment: cdn-firmware-r2 - - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - - # Set up rclone for CDN uploads. - - uses: ./.github/actions/cdn-prepare - with: - cf-account-id: ${{ vars.S3_ACCOUNT_ID }} - cf-access-key-id: ${{ vars.S3_ACCESS_KEY_ID }} - cf-secret-access-key: ${{ secrets.S3_SECRET_ACCESS_KEY }} - - # Upload firmware to CDN. - - uses: ./.github/actions/cdn-bump-version - with: - cf-bucket: ${{ vars.S3_BUCKET }} - version: ${{ inputs.version }} - release-channel: ${{ inputs.release-channel }} - - checkpoint-cdn: - runs-on: ubuntu-latest - needs: [cdn-upload-firmware, cdn-upload-version-info, cdn-bump-version] - steps: - - run: echo "CDN checkpoint reached" - - release: - if: (inputs.release-channel == 'stable' || inputs.release-channel == 'beta') - runs-on: ubuntu-latest - needs: [checkpoint-cdn] - - steps: - - name: Download release artifacts - uses: actions/download-artifact@v4 - - - name: Release - uses: ncipollo/release-action@v1 - with: - artifacts: '**/OpenShock_*.bin' - tag: ${{ inputs.version }} - prerelease: ${{ inputs.is-prerelease }} - artifactErrorsFailBuild: true - body: ${{ inputs.release-notes }} From a256eee1c4247b320b72f097c8f87a7e93aadc17 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Fri, 12 Jan 2024 17:33:29 +0100 Subject: [PATCH 106/147] Fix prerelease and release-channel vars --- .github/workflows/ci-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 8e5584a4..4282e924 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -122,7 +122,7 @@ jobs: - uses: ./.github/actions/cdn-upload-firmware with: cf-bucket: ${{ vars.S3_BUCKET }} - release-channel: ${{ inputs.release-channel }} + release-channel: ${{ needs.getvars.outputs.release-channel }} board: ${{ matrix.board }} cdn-upload-version-info: @@ -199,6 +199,6 @@ jobs: with: artifacts: '**/OpenShock_*.bin' tag: ${{ needs.getvars.outputs.version }} - prerelease: ${{ needs.getvars.outputs.is-prerelease }} + prerelease: ${{ needs.getvars.outputs.release-channel != 'stable' }} artifactErrorsFailBuild: true body: ${{ needs.getvars.outputs.release-notes }} From eda98843e92ebf6d0cfc2ac2d56cf8f7a41c5e94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:34:34 +0000 Subject: [PATCH 107/147] build(deps): Bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/get-vars.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/get-vars.yml b/.github/workflows/get-vars.yml index 5ab44530..857b0452 100644 --- a/.github/workflows/get-vars.yml +++ b/.github/workflows/get-vars.yml @@ -88,7 +88,7 @@ jobs: sparse-checkout: | .github - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} cache: 'npm' From a2d27b80ea056f08d2d3d6dfc82e77b17ef3e38f Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Sun, 14 Jan 2024 07:23:33 -0800 Subject: [PATCH 108/147] Fix everything (#182) * Correct User-Agent format * Add all OtaUpdateConfig fields on fbs serialize * Don't null check a enum lmao --- frontend/src/lib/mappers/ConfigMapper.ts | 1 - src/config/OtaUpdateConfig.cpp | 2 +- src/http/HTTPRequestManager.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/mappers/ConfigMapper.ts b/frontend/src/lib/mappers/ConfigMapper.ts index 1c7a4ec8..2263d1f6 100644 --- a/frontend/src/lib/mappers/ConfigMapper.ts +++ b/frontend/src/lib/mappers/ConfigMapper.ts @@ -153,7 +153,6 @@ function mapOtaUpdateConfig(fbsConfig: FbsConfig): OtaUpdateConfig { const requireManualApproval = otaUpdate.requireManualApproval(); if (!cdnDomain) throw new Error('otaUpdate.cdnDomain is null'); - if (!updateChannel) throw new Error('otaUpdate.updateChannel is null'); return { isEnabled, diff --git a/src/config/OtaUpdateConfig.cpp b/src/config/OtaUpdateConfig.cpp index af8d8acf..35383d3f 100644 --- a/src/config/OtaUpdateConfig.cpp +++ b/src/config/OtaUpdateConfig.cpp @@ -69,7 +69,7 @@ bool OtaUpdateConfig::FromFlatbuffers(const Serialization::Configuration::OtaUpd } flatbuffers::Offset OtaUpdateConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { - return Serialization::Configuration::CreateOtaUpdateConfig(builder, isEnabled, builder.CreateString(cdnDomain), updateChannel, checkPeriodically, checkInterval, allowBackendManagement, requireManualApproval); + return Serialization::Configuration::CreateOtaUpdateConfig(builder, isEnabled, builder.CreateString(cdnDomain), updateChannel, checkOnStartup, checkPeriodically, checkInterval, allowBackendManagement, requireManualApproval, updateId, bootType); } bool OtaUpdateConfig::FromJSON(const cJSON* json) { diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 1bc4a22e..8f75f6d4 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -14,7 +14,7 @@ constexpr std::size_t HTTP_BUFFER_SIZE = 4096LLU; constexpr int HTTP_DOWNLOAD_SIZE_LIMIT = 200 * 1024 * 1024; // 200 MB const char* const TAG = "HTTPRequestManager"; -const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (Espressif; " OPENSHOCK_FW_CHIP "; " OPENSHOCK_FW_BOARD ") " OPENSHOCK_FW_GIT_COMMIT; +const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (" OPENSHOCK_FW_BOARD "; " OPENSHOCK_FW_CHIP "; Espressif) " OPENSHOCK_FW_GIT_COMMIT; struct RateLimit { RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() { } From ea4e2b4266c94810538677ee05b4bb288afccc7c Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sun, 14 Jan 2024 16:26:39 +0100 Subject: [PATCH 109/147] maybe fix --- .github/actions/build-frontend/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/build-frontend/action.yml b/.github/actions/build-frontend/action.yml index d1b2e2ac..b7a9be66 100644 --- a/.github/actions/build-frontend/action.yml +++ b/.github/actions/build-frontend/action.yml @@ -18,7 +18,7 @@ runs: frontend path: ${{ github.repository }} - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} cache: 'npm' From 98a9012339b4766daae151c0ddf154c8e12d5ad0 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sun, 14 Jan 2024 19:07:40 +0100 Subject: [PATCH 110/147] Upload firmware to version bucket --- .github/actions/cdn-upload-firmware/action.yml | 6 +++--- .github/actions/cdn-upload-version-info/action.yml | 5 ++++- .github/workflows/ci-build.yml | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/actions/cdn-upload-firmware/action.yml b/.github/actions/cdn-upload-firmware/action.yml index 3d01c485..eb591ee4 100644 --- a/.github/actions/cdn-upload-firmware/action.yml +++ b/.github/actions/cdn-upload-firmware/action.yml @@ -4,8 +4,8 @@ inputs: cf-bucket: description: Name of the S3 bucket required: true - release-channel: - description: 'Release channel that describes this upload' + fw-version: + description: Firmware version required: true board: description: 'Board to upload' @@ -49,4 +49,4 @@ runs: mkdir -p upload mv *.bin upload/ mv hashes.*.txt upload/ - rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' + rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.fw-version }}/${{ inputs.board }}/' diff --git a/.github/actions/cdn-upload-version-info/action.yml b/.github/actions/cdn-upload-version-info/action.yml index b5df22fd..9c8aa569 100644 --- a/.github/actions/cdn-upload-version-info/action.yml +++ b/.github/actions/cdn-upload-version-info/action.yml @@ -4,6 +4,9 @@ inputs: cf-bucket: description: Name of the S3 bucket required: true + fw-version: + description: Firmware version + required: true release-channel: description: 'Release channel that describes this upload' required: true @@ -24,4 +27,4 @@ runs: run: | mkdir -p upload mv boards.txt upload/ - rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.release-channel }}/${{ inputs.board }}/' + rclone copy upload 'cdn:${{ inputs.cf-bucket }}/${{ inputs.fw-version }}/${{ inputs.board }}/' diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 4282e924..24921a1e 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -122,7 +122,7 @@ jobs: - uses: ./.github/actions/cdn-upload-firmware with: cf-bucket: ${{ vars.S3_BUCKET }} - release-channel: ${{ needs.getvars.outputs.release-channel }} + fw-version: ${{ needs.getvars.outputs.version }} board: ${{ matrix.board }} cdn-upload-version-info: @@ -148,6 +148,7 @@ jobs: - uses: ./.github/actions/cdn-upload-version-info with: cf-bucket: ${{ vars.S3_BUCKET }} + fw-version: ${{ needs.getvars.outputs.version }} release-channel: ${{ needs.getvars.outputs.release-channel }} boards: ${{ needs.getvars.outputs.board-list }} From 7d217495bc692d8d426469f36b57b26051c85ae5 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sun, 14 Jan 2024 19:19:41 +0100 Subject: [PATCH 111/147] Stop spamming console with logs --- src/GatewayConnectionManager.cpp | 9 +++++++++ src/http/HTTPRequestManager.cpp | 4 ---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index cd8c4471..52b0954f 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -83,6 +83,9 @@ AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { auto response = HTTP::JsonAPI::LinkAccount(linkCode); + if (response.result == HTTP::RequestResult::RateLimited) { + return false; // Just return false, don't spam the console with errors + } if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); return AccountLinkResultCode::InternalError; @@ -144,6 +147,9 @@ bool FetchDeviceInfo(const String& authToken) { auto response = HTTP::JsonAPI::GetDeviceInfo(authToken); + if (response.result == HTTP::RequestResult::RateLimited) { + return false; // Just return false, don't spam the console with errors + } if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while fetching device info: %d %d", response.result, response.code); return false; @@ -206,6 +212,9 @@ bool ConnectToLCG() { auto response = HTTP::JsonAPI::AssignLcg(authToken.c_str()); + if (response.result == HTTP::RequestResult::RateLimited) { + return false; // Just return false, don't spam the console with errors + } if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while fetching LCG endpoint: %d %d", response.result, response.code); return false; diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 8f75f6d4..4fe2b676 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -29,7 +29,6 @@ struct RateLimit { std::int64_t now = OpenShock::millis(); if (m_blockUntilMs > now) { - ESP_LOGW(TAG, "Rate limited for %lld more milliseconds", m_blockUntilMs - now); return false; } @@ -42,7 +41,6 @@ struct RateLimit { auto it = std::find_if(m_limits.begin(), m_limits.end(), [this](const RateLimit::Limit& limit) { return m_requests.size() >= limit.count; }); if (it != m_limits.end()) { m_blockUntilMs = now + it->durationMs; - ESP_LOGW(TAG, "Rate limited for %lld milliseconds", it->durationMs); return false; } @@ -117,8 +115,6 @@ std::shared_ptr _getRateLimiter(StringView url) { return nullptr; } - ESP_LOGI(TAG, "Getting rate limiter for domain: %s", domain.c_str()); - auto it = s_rateLimits.find(domain); if (it == s_rateLimits.end()) { s_rateLimits.emplace(domain, _rateLimitFactory(domain)); From b9c5e17f50571a6c698305b14daa47e587a70530 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sun, 14 Jan 2024 19:22:13 +0100 Subject: [PATCH 112/147] oops --- src/GatewayConnectionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 52b0954f..a7b1da63 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -84,7 +84,7 @@ AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { auto response = HTTP::JsonAPI::LinkAccount(linkCode); if (response.result == HTTP::RequestResult::RateLimited) { - return false; // Just return false, don't spam the console with errors + return AccountLinkResultCode::InternalError; // Just return false, don't spam the console with errors } if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); From 78f5efa1e170b8bccbe1a60cb03bd16db176d4c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 06:56:48 +0000 Subject: [PATCH 113/147] build(deps-dev): Bump the npm-dependencies group Bumps the npm-dependencies group in /frontend with 5 updates: | Package | From | To | | --- | --- | --- | | [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) | `2.1.0` | `2.3.2` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `20.10.7` | `20.11.1` | | [prettier](https://github.com/prettier/prettier) | `3.1.1` | `3.2.2` | | [svelte-check](https://github.com/sveltejs/language-tools) | `3.6.2` | `3.6.3` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `1.1.3` | `1.2.0` | Updates `@sveltejs/kit` from 2.1.0 to 2.3.2 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.3.2/packages/kit) Updates `@types/node` from 20.10.7 to 20.11.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `prettier` from 3.1.1 to 3.2.2 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.1.1...3.2.2) Updates `svelte-check` from 3.6.2 to 3.6.3 - [Release notes](https://github.com/sveltejs/language-tools/releases) - [Commits](https://github.com/sveltejs/language-tools/compare/svelte-check-3.6.2...svelte-check-3.6.3) Updates `vitest` from 1.1.3 to 1.2.0 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.2.0/packages/vitest) --- updated-dependencies: - dependency-name: "@sveltejs/kit" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies - dependency-name: svelte-check dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-dependencies - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-dependencies ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 100 ++++++++++++++++++------------------- frontend/package.json | 10 ++-- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c14331fa..fa9cfb62 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,11 +15,11 @@ "@skeletonlabs/skeleton": "2.7.0", "@skeletonlabs/tw-plugin": "0.3.1", "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/kit": "2.1.0", + "@sveltejs/kit": "2.3.2", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.7", + "@types/node": "20.11.1", "@typescript-eslint/eslint-plugin": "6.18.1", "@typescript-eslint/parser": "6.18.1", "autoprefixer": "10.4.16", @@ -28,16 +28,16 @@ "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", "postcss": "8.4.33", - "prettier": "3.1.1", + "prettier": "3.2.2", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", - "svelte-check": "3.6.2", + "svelte-check": "3.6.3", "tailwindcss": "3.4.1", "tslib": "2.6.2", "typescript": "5.3.3", "vite": "^5.0.11", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.3" + "vitest": "1.2.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -859,9 +859,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.1.0.tgz", - "integrity": "sha512-XSIjk9uY705VRpLapfScvOI3bKTfPXntLCdWVsQHhLvkTD7TPNHWh45/6nTT1vQ8rJwWzzA5sLide2YLT4FMsg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.3.2.tgz", + "integrity": "sha512-AzGWV1TyUSkBuciy06E5NegXndIEgTthDtllv80qynEJFh8bZD62ZxLajiQLOsKGqRDilEQyshDARQxjIqiaqg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -975,9 +975,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.7.tgz", - "integrity": "sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==", + "version": "20.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.1.tgz", + "integrity": "sha512-DsXojJUES2M+FE8CpptJTKpg+r54moV9ZEncPstni1WHFmTcCzeFLnMFfyhCVS8XNOy/OQG+8lVxRLRrVHmV5A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1216,13 +1216,13 @@ "dev": true }, "node_modules/@vitest/expect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.3.tgz", - "integrity": "sha512-MnJqsKc1Ko04lksF9XoRJza0bGGwTtqfbyrsYv5on4rcEkdo+QgUdITenBQBUltKzdxW7K3rWh+nXRULwsdaVg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.2.0.tgz", + "integrity": "sha512-H+2bHzhyvgp32o7Pgj2h9RTHN0pgYaoi26Oo3mE+dCi1PAqV31kIIVfTbqMO3Bvshd5mIrJLc73EwSRrbol9Lw==", "dev": true, "dependencies": { - "@vitest/spy": "1.1.3", - "@vitest/utils": "1.1.3", + "@vitest/spy": "1.2.0", + "@vitest/utils": "1.2.0", "chai": "^4.3.10" }, "funding": { @@ -1230,12 +1230,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.3.tgz", - "integrity": "sha512-Va2XbWMnhSdDEh/OFxyUltgQuuDRxnarK1hW5QNN4URpQrqq6jtt8cfww/pQQ4i0LjoYxh/3bYWvDFlR9tU73g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.2.0.tgz", + "integrity": "sha512-vaJkDoQaNUTroT70OhM0NPznP7H3WyRwt4LvGwCVYs/llLaqhoSLnlIhUClZpbF5RgAee29KRcNz0FEhYcgxqA==", "dev": true, "dependencies": { - "@vitest/utils": "1.1.3", + "@vitest/utils": "1.2.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -1271,9 +1271,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.3.tgz", - "integrity": "sha512-U0r8pRXsLAdxSVAyGNcqOU2H3Z4Y2dAAGGelL50O0QRMdi1WWeYHdrH/QWpN1e8juWfVKsb8B+pyJwTC+4Gy9w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.0.tgz", + "integrity": "sha512-P33EE7TrVgB3HDLllrjK/GG6WSnmUtWohbwcQqmm7TAk9AVHpdgf7M3F3qRHKm6vhr7x3eGIln7VH052Smo6Kw==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -1285,9 +1285,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.3.tgz", - "integrity": "sha512-Ec0qWyGS5LhATFQtldvChPTAHv08yHIOZfiNcjwRQbFPHpkih0md9KAbs7TfeIfL7OFKoe7B/6ukBTqByubXkQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.2.0.tgz", + "integrity": "sha512-MNxSAfxUaCeowqyyGwC293yZgk7cECZU9wGb8N1pYQ0yOn/SIr8t0l9XnGRdQZvNV/ZHBYu6GO/W3tj5K3VN1Q==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -1297,9 +1297,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.3.tgz", - "integrity": "sha512-Dyt3UMcdElTll2H75vhxfpZu03uFpXRCHxWnzcrFjZxT1kTbq8ALUYIeBgGolo1gldVdI0YSlQRacsqxTwNqwg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-FyD5bpugsXlwVpTcGLDf3wSPYy8g541fQt14qtzo8mJ4LdEpDKZ9mQy2+qdJm2TZRpjY5JLXihXCgIxiRJgi5g==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -1611,9 +1611,9 @@ ] }, "node_modules/chai": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.0.tgz", - "integrity": "sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", @@ -3525,9 +3525,9 @@ } }, "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", + "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -4104,9 +4104,9 @@ } }, "node_modules/svelte-check": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.2.tgz", - "integrity": "sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.3.tgz", + "integrity": "sha512-Q2nGnoysxUnB9KjnjpQLZwdjK62DHyW6nuH/gm2qteFnDk0lCehe/6z8TsIvYeKjC6luKaWxiNGyOcWiLLPSwA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -4606,9 +4606,9 @@ } }, "node_modules/vite-node": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.3.tgz", - "integrity": "sha512-BLSO72YAkIUuNrOx+8uznYICJfTEbvBAmWClY3hpath5+h1mbPS5OMn42lrTxXuyCazVyZoDkSRnju78GiVCqA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.0.tgz", + "integrity": "sha512-ETnQTHeAbbOxl7/pyBck9oAPZZZo+kYnFt1uQDD+hPReOc+wCjXw4r4jHriBRuVDB5isHmPXxrfc1yJnfBERqg==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -4669,16 +4669,16 @@ } }, "node_modules/vitest": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.3.tgz", - "integrity": "sha512-2l8om1NOkiA90/Y207PsEvJLYygddsOyr81wLQ20Ra8IlLKbyQncWsGZjnbkyG2KwwuTXLQjEPOJuxGMG8qJBQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.2.0.tgz", + "integrity": "sha512-Ixs5m7BjqvLHXcibkzKRQUvD/XLw0E3rvqaCMlrm/0LMsA0309ZqYvTlPzkhh81VlEyVZXFlwWnkhb6/UMtcaQ==", "dev": true, "dependencies": { - "@vitest/expect": "1.1.3", - "@vitest/runner": "1.1.3", - "@vitest/snapshot": "1.1.3", - "@vitest/spy": "1.1.3", - "@vitest/utils": "1.1.3", + "@vitest/expect": "1.2.0", + "@vitest/runner": "1.2.0", + "@vitest/snapshot": "1.2.0", + "@vitest/spy": "1.2.0", + "@vitest/utils": "1.2.0", "acorn-walk": "^8.3.1", "cac": "^6.7.14", "chai": "^4.3.10", @@ -4693,7 +4693,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.1", "vite": "^5.0.0", - "vite-node": "1.1.3", + "vite-node": "1.2.0", "why-is-node-running": "^2.2.2" }, "bin": { diff --git a/frontend/package.json b/frontend/package.json index f6f23dc3..4d6c42a5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,11 +19,11 @@ "@skeletonlabs/skeleton": "2.7.0", "@skeletonlabs/tw-plugin": "0.3.1", "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/kit": "2.1.0", + "@sveltejs/kit": "2.3.2", "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tailwindcss/forms": "0.5.7", "@tailwindcss/typography": "0.5.10", - "@types/node": "20.10.7", + "@types/node": "20.11.1", "@typescript-eslint/eslint-plugin": "6.18.1", "@typescript-eslint/parser": "6.18.1", "autoprefixer": "10.4.16", @@ -32,16 +32,16 @@ "eslint-plugin-svelte": "2.35.1", "flatbuffers": "23.5.26", "postcss": "8.4.33", - "prettier": "3.1.1", + "prettier": "3.2.2", "prettier-plugin-svelte": "3.1.2", "svelte": "4.2.8", - "svelte-check": "3.6.2", + "svelte-check": "3.6.3", "tailwindcss": "3.4.1", "tslib": "2.6.2", "typescript": "5.3.3", "vite": "^5.0.11", "vite-plugin-tailwind-purgecss": "^0.2.0", - "vitest": "1.1.3" + "vitest": "1.2.0" }, "type": "module", "dependencies": { From 7471474ef0c413fdd5c30498d796fcacbfed4513 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Tue, 16 Jan 2024 13:09:39 +0100 Subject: [PATCH 114/147] Fix some definitions and checks for gpio --- include/Common.h | 11 ++++++++--- src/wifi/WiFiManager.cpp | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/include/Common.h b/include/Common.h index 5a487fae..e842e4cb 100644 --- a/include/Common.h +++ b/include/Common.h @@ -31,12 +31,17 @@ #error "OPENSHOCK_FW_VERSION must be defined" #endif +#ifndef OPENSHOCK_GPIO_INVALID +#define OPENSHOCK_GPIO_INVALID 0 +#endif + #ifndef OPENSHOCK_RF_TX_GPIO -#warning "OPENSHOCK_RF_TX_GPIO is not defined, using default value of UINT8_MAX" -#define OPENSHOCK_RF_TX_GPIO UINT8_MAX +#warning "OPENSHOCK_RF_TX_GPIO is not defined, setting to OPENSHOCK_GPIO_INVALID" +#define OPENSHOCK_RF_TX_GPIO OPENSHOCK_GPIO_INVALID #endif namespace OpenShock::Constants { - constexpr std::uint8_t GPIO_INVALID = UINT8_MAX; + constexpr std::uint8_t GPIO_INVALID = OPENSHOCK_GPIO_INVALID; constexpr std::uint8_t GPIO_RF_TX = OPENSHOCK_RF_TX_GPIO; } // namespace OpenShock::Constants + diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index b086641c..84857ff2 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -441,7 +441,7 @@ bool WiFiManager::GetConnectedNetwork(OpenShock::WiFiNetwork& network) { if (s_connectedCredentialsID == 0) { if (IsConnected()) { // We connected without a scan, so populate the network with the current connection info manually - network.credentialsID = 255; + network.credentialsID = 0; memcpy(network.ssid, WiFi.SSID().c_str(), WiFi.SSID().length() + 1); memcpy(network.bssid, WiFi.BSSID(), sizeof(network.bssid)); network.channel = WiFi.channel(); From fe5ef521d2b79402ae9d5f4b489b7724eeab1184 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 11:27:25 +0100 Subject: [PATCH 115/147] Fix invalid GPIO checks --- src/CompatibilityChecks.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CompatibilityChecks.cpp b/src/CompatibilityChecks.cpp index 7d06a571..87ae9385 100644 --- a/src/CompatibilityChecks.cpp +++ b/src/CompatibilityChecks.cpp @@ -1,8 +1,8 @@ #include "Common.h" #include "Chipset.h" -constexpr bool kIsValidRfTxPin = OpenShock::IsValidOutputPin(OPENSHOCK_RF_TX_GPIO) || OPENSHOCK_RF_TX_GPIO == UINT8_MAX; -static_assert(kIsValidRfTxPin , "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); +constexpr bool kIsValidOrUndefinedRfTxPin = OpenShock::IsValidOutputPin(OpenShock::Constants::GPIO_RF_TX) || OpenShock::Constants::GPIO_RF_TX == OpenShock::Constants::GPIO_INVALID; +static_assert(kIsValidOrUndefinedRfTxPin , "OPENSHOCK_RF_TX_GPIO is not a valid output GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); #ifdef OPENSHOCK_ESTOP_PIN static_assert(OpenShock::IsValidInputPin(OPENSHOCK_ESTOP_PIN), "OPENSHOCK_ESTOP_PIN is not a valid input GPIO, and is not declared as bypassed by board specific definitions, refusing to compile"); From d98c6156837101b545a8116fdedec75ac42f379e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 02:33:27 -0800 Subject: [PATCH 116/147] Hardcode DNS servers (#184) * Add hardcoded DNS servers * Fix build issues --- src/wifi/WiFiManager.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 84857ff2..414ff229 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -289,6 +289,8 @@ void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { s_wifiNetworks.insert(std::lower_bound(s_wifiNetworks.begin(), s_wifiNetworks.end(), network, [](const WiFiNetwork& a, const WiFiNetwork& b) { return a.rssi > b.rssi; }), std::move(network)); } +esp_err_t set_esp_interface_dns(esp_interface_t interface, IPAddress main_dns, IPAddress backup_dns, IPAddress fallback_dns); + bool WiFiManager::Init() { WiFi.onEvent(_evWiFiConnected, ARDUINO_EVENT_WIFI_STA_CONNECTED); WiFi.onEvent(_evWiFiGotIP, ARDUINO_EVENT_WIFI_STA_GOT_IP); @@ -317,6 +319,12 @@ bool WiFiManager::Init() { } } + + if (set_esp_interface_dns(ESP_IF_WIFI_STA, IPAddress(1,1,1,1), IPAddress(8,8,8,8), IPAddress(9,9,9,9)) != ESP_OK) { + ESP_LOGE(TAG, "Failed to set DNS servers"); + return false; + } + return true; } From 2c3b266a78d9c8f69a4cc6023aaa7a24d8f899d0 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 11:34:18 +0100 Subject: [PATCH 117/147] Remove log spam --- src/OtaUpdateManager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index 2a14fde0..03f5be07 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -244,7 +244,6 @@ void _otaUpdateTask(void* arg) { // If we're not connected, continue. if (!connected) { - ESP_LOGD(TAG, "Not connected, skipping update check"); continue; } From a18fb1eba163cabfe63e8de17fc5cf4a617a522c Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 11:57:19 +0100 Subject: [PATCH 118/147] Reduce overhead on OTA Progress message --- src/serialization/WSGateway.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serialization/WSGateway.cpp b/src/serialization/WSGateway.cpp index 5fec63f1..2bfefcc0 100644 --- a/src/serialization/WSGateway.cpp +++ b/src/serialization/WSGateway.cpp @@ -62,7 +62,7 @@ bool Gateway::SerializeOtaInstallStartedMessage(std::int32_t updateId, const Ope } bool Gateway::SerializeOtaInstallProgressMessage(std::int32_t updateId, Gateway::OtaInstallProgressTask task, float progress, Common::SerializationCallbackFn callback) { - flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + flatbuffers::FlatBufferBuilder builder(64); // TODO: Profile this and adjust the size accordingly auto otaInstallProgressOffset = Gateway::CreateOtaInstallProgress(builder, updateId, task, progress); From fa8993ca914544b33c1d8742a514d619a0fbd351 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 12:17:55 +0100 Subject: [PATCH 119/147] Remove unnecessary check --- src/wifi/WiFiScanManager.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index 2f036ef2..f757fc59 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -29,10 +29,7 @@ static std::map s_statusCh static std::map s_networkDiscoveredHandlers; bool _notifyTask(WiFiScanTaskNotificationFlags flags) { - if (xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY) != pdTRUE) { - ESP_LOGE(TAG, "Failed to take scan task mutex"); - return false; - } + xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY); bool success = false; From d4727a292c3c883a3933968f9214aa0174b46a48 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 13:16:55 +0100 Subject: [PATCH 120/147] Make HTTPRequestManager thread safe --- src/http/HTTPRequestManager.cpp | 43 +++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 4fe2b676..c6692c56 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -17,18 +17,31 @@ const char* const TAG = "HTTPRequestManager"; const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (" OPENSHOCK_FW_BOARD "; " OPENSHOCK_FW_CHIP "; Espressif) " OPENSHOCK_FW_GIT_COMMIT; struct RateLimit { - RateLimit() : m_blockUntilMs(0), m_limits(), m_requests() { } + RateLimit() : m_mutex(xSemaphoreCreateMutex()), m_blockUntilMs(0), m_limits(), m_requests() { } void addLimit(std::uint32_t durationMs, std::uint16_t count) { + xSemaphoreTake(m_mutex, portMAX_DELAY); + // Insert sorted m_limits.insert(std::upper_bound(m_limits.begin(), m_limits.end(), durationMs, [](std::int64_t durationMs, const Limit& limit) { return durationMs > limit.durationMs; }), {durationMs, count}); + + xSemaphoreGive(m_mutex); + } + void clearLimits() { + xSemaphoreTake(m_mutex, portMAX_DELAY); + + m_limits.clear(); + + xSemaphoreGive(m_mutex); } - void clearLimits() { m_limits.clear(); } bool tryRequest() { std::int64_t now = OpenShock::millis(); + xSemaphoreTake(m_mutex, portMAX_DELAY); + if (m_blockUntilMs > now) { + xSemaphoreGive(m_mutex); return false; } @@ -41,20 +54,34 @@ struct RateLimit { auto it = std::find_if(m_limits.begin(), m_limits.end(), [this](const RateLimit::Limit& limit) { return m_requests.size() >= limit.count; }); if (it != m_limits.end()) { m_blockUntilMs = now + it->durationMs; + xSemaphoreGive(m_mutex); return false; } // Add the request m_requests.push_back(now); + xSemaphoreGive(m_mutex); + return true; } - void clearRequests() { m_requests.clear(); } + void clearRequests() { + xSemaphoreTake(m_mutex, portMAX_DELAY); + m_requests.clear(); + xSemaphoreGive(m_mutex); + } - void blockUntil(std::int64_t blockUntilMs) { m_blockUntilMs = blockUntilMs; } + void blockUntil(std::int64_t blockUntilMs) { + xSemaphoreTake(m_mutex, portMAX_DELAY); + m_blockUntilMs = blockUntilMs; + xSemaphoreGive(m_mutex); + } std::uint32_t requestsSince(std::int64_t sinceMs) { - return std::count_if(m_requests.begin(), m_requests.end(), [sinceMs](std::int64_t requestMs) { return requestMs >= sinceMs; }); + xSemaphoreTake(m_mutex, portMAX_DELAY); + std::uint32_t result = std::count_if(m_requests.begin(), m_requests.end(), [sinceMs](std::int64_t requestMs) { return requestMs >= sinceMs; }); + xSemaphoreGive(m_mutex); + return result; } private: @@ -63,11 +90,13 @@ struct RateLimit { std::uint16_t count; }; + SemaphoreHandle_t m_mutex; std::int64_t m_blockUntilMs; std::vector m_limits; std::vector m_requests; }; +SemaphoreHandle_t s_rateLimitsMutex = xSemaphoreCreateMutex(); std::unordered_map> s_rateLimits; using namespace OpenShock; @@ -115,12 +144,16 @@ std::shared_ptr _getRateLimiter(StringView url) { return nullptr; } + xSemaphoreTake(s_rateLimitsMutex, portMAX_DELAY); + auto it = s_rateLimits.find(domain); if (it == s_rateLimits.end()) { s_rateLimits.emplace(domain, _rateLimitFactory(domain)); it = s_rateLimits.find(domain); } + xSemaphoreGive(s_rateLimitsMutex); + return it->second; } From 730c27c9bb117f2d2a362fcff24b59b517dfd6dd Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 14:05:31 +0100 Subject: [PATCH 121/147] fix error checking in frontend --- frontend/src/lib/mappers/ConfigMapper.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/mappers/ConfigMapper.ts b/frontend/src/lib/mappers/ConfigMapper.ts index 2263d1f6..45e4f773 100644 --- a/frontend/src/lib/mappers/ConfigMapper.ts +++ b/frontend/src/lib/mappers/ConfigMapper.ts @@ -1,6 +1,8 @@ import type { OtaUpdateChannel } from '$lib/_fbs/open-shock/serialization/configuration'; import { Config as FbsConfig } from '$lib/_fbs/open-shock/serialization/configuration/config'; +// TODO: Update these configs and ensure that typescript enforces them to be up to date + export interface RFConfig { txPin: number; keepaliveEnabled: boolean; @@ -57,8 +59,6 @@ function mapRfConfig(fbsConfig: FbsConfig): RFConfig { const txPin = rf.txPin(); const keepaliveEnabled = rf.keepaliveEnabled(); - if (!txPin) throw new Error('rf.txPin is null'); - return { txPin, keepaliveEnabled, From 1d2fc3864c6171ef55e87f139a81164f13fdf05e Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 14:15:53 +0100 Subject: [PATCH 122/147] Disconnect and forget cached WiFi before OTA restart --- src/OtaUpdateManager.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index 03f5be07..4e196167 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -367,16 +367,19 @@ void _otaUpdateTask(void* arg) { continue; } + // Disconnect from WiFi. + WiFi.disconnect(true, true); + // Send reboot message. _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::Rebooting, 0.0f); - // Restart. - ESP_LOGI(TAG, "Restarting in 1 seconds..."); - vTaskDelay(pdMS_TO_TICKS(1000)); - esp_restart(); - - _sendFailureMessage("Well, this is awkward..."); + // Reboot into new firmware. + ESP_LOGI(TAG, "Restarting into new firmware"); + break; } + + // Restart. + esp_restart(); } bool _tryGetStringList(StringView url, std::vector& list) { From 1f25b19d259b5a1598d70040bf3e7b6c5cb48e1a Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 14:41:14 +0100 Subject: [PATCH 123/147] Undo wifi disconnect before OTA restart --- src/OtaUpdateManager.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index 4e196167..b404d140 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -367,9 +367,6 @@ void _otaUpdateTask(void* arg) { continue; } - // Disconnect from WiFi. - WiFi.disconnect(true, true); - // Send reboot message. _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::Rebooting, 0.0f); From 344cae06aecdad011ed9edb0786142701b557f01 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 15:14:03 +0100 Subject: [PATCH 124/147] Pin espressif32 version --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5d468eef..acdb97fd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [env] -platform = espressif32 +platform = espressif32 @ ^6.5.0 board = az-delivery-devkit-v4 ; Overridden per board framework = arduino build_flags = From 8b7a1f69ae62ececa282c4893267bc27e6a2e2b1 Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 15:50:39 +0100 Subject: [PATCH 125/147] Add .gitattributes --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..c4c1ab34 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto eol=lf +*.txt text eol=lf From 7b03827f9f066a5de0c024895b1d485104d93dec Mon Sep 17 00:00:00 2001 From: HentaiHeavenVR Date: Wed, 17 Jan 2024 15:50:50 +0100 Subject: [PATCH 126/147] Freeze python requirements --- requirements.txt | Bin 32 -> 112 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 65ecf745630bc3fdc8a1e461798d299dca860ba4..556c1cbaeabaeebde4a35867348b0d69bdd394cc 100644 GIT binary patch literal 112 zcmXYpOA3H63`F0$hmnd!S01K_Kd7{*8!xYpL53kAZ!*taNJLI1GCLcqW-ql=)aC}q g$U#vmOUZZ;>truF==1vdtUYR9boqLMwRlTAUfhBcKL7v# literal 32 lcmXTONi0drFUrl#=SnRuD9O*y;Yu#51TxZ#5(_daxd78S42}Q* From f707f0acd75a88acb6dc6bfddec2ab5f1137963a Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 17 Jan 2024 17:58:07 +0100 Subject: [PATCH 127/147] :) --- .github/actions/build-firmware/action.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/build-firmware/action.yml b/.github/actions/build-firmware/action.yml index 8d70b167..35029661 100644 --- a/.github/actions/build-firmware/action.yml +++ b/.github/actions/build-firmware/action.yml @@ -43,7 +43,6 @@ runs: shell: bash run: pio run -e ${{ inputs.board }} env: - OPENSHOCK_API_DOMAIN: api.openshock.net OPENSHOCK_FW_VERSION: ${{ inputs.version }} OPENSHOCK_FW_GIT_REF: ${{ github.ref }} OPENSHOCK_FW_GIT_COMMIT: ${{ github.sha }} From 52405d37b5dd0ba492c13c8c6027bcc5f6b68888 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 17 Jan 2024 18:28:12 +0100 Subject: [PATCH 128/147] Add 1.1.0-rc.1 to changelog --- CHANGELOG.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb7b69e7..ebfdcf54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,74 @@ +# Version 1.1.0-rc.1 Release Notes + +It's been a while, and we think it's time for another beta release :smile: + +This is the RC (Release Candidate) 1 for version 1.1.0, hence the naming: 1.1.0-rc.1 + +This update is packed with some major enhancements and numerous improvements that we believe will improve your experience using your device. + +From introducing seamless Over-The-Air updates, adding support for new hardware, to enhancing the overall functionality and stability of the system, we've worked hard to improve upon our last release. + +We've also squashed some pesky bugs and made various minor updates to streamline and optimize your experience. + +Here’s what’s new: + +## Major Updates + +- **OTA (Over-The-Air) Updates**: + - Introduced a seamless OTA update capability, device can now be updated with the click of a button. + - Features: + - Updates can be triggered remotely via the OpenShock website. + - Device can automatically check for updates at a configured interval. + - Update state will be streamed back to frontend so you can see the status of your device in real time. + - Provided an option to deactivate each of these features individually through the Captive Portal for users preferring manual control. +- **Support for OpenShock Core V1**: Added support for @nullstalgia custom PCB, which is [fully open-source](https://github.com/nullstalgia/OpenShock-Hardware/tree/main/Core). +- **Captive Behavior Enhancement**: Phones and PC's now prompt the user with the Captive Portal upon WiFi connection. +- **More serial commands**: + - Read/Write configuration in JSON or raw binary format. + - Shocker command execution via serial. + - GPIO pin listing, excluding reserved pins. + - Serial command echo support for terminals lacking this feature. +- **Reworked partitions:** Moved configuration into its own partition, ensuring it persists across updates +- **Reserved pins**: + - Added support for reserved pins so users can no longer use reserved pins that might lead to ESP instability. + - User will now receive an error upon trying to set anything to use these pins. + - The available pins can be listed via the `AvailGPIO` serial command. +- **Shocker keepalive**: + - Improved shocker responsiveness by sending keepalive messages to them at a interval. + - This will prevent the shockers from entering sleep mode. + - Has option to be disabled via the `keepalive` serial command. +- **Config Handler Overhaul**: + - Rewrote config handler to be more modular and make it easier to expand upon the code base. + - Each config section is now seperated into its own file and class. + +## Minor Updates + +- Firmware upload now includes an MD5 sum. +- Enhanced reliability of WiFi scanning. +- Status LEDs: + - Reworked some code for LED pattern and state management. + - Added support for WS2812B RGB (Gamer :sunglasses:) LEDs. +- Improved WiFi connectivity speed post-setup. +- Updated Captive Portal color palette. +- Dependency cleanup: + - Removed ArduinoJSON + - Removed nonstd/span +- Removed Arduino-style loop behaviors, replaced with freeRTOS tasks. +- Improved FreeRTOS task management. +- Implemented self-ratelimiting on httpclient. +- Enhanced error checking in captive portal and firmware. +- CodeQL code quality checks integrated into CI/CD pipeline. +- Utilized filesystem partition hash as ETag for content caching. +- Improved logs to be more consise and verbose. +- Miscellaneous code cleanup, refactoring, and optimizations. + +## Bug Fixes + +- Resolved issue with WiFi scans getting stuck. +- Fixed connection problems with unsecured networks. +- Altered CommandHandler to use a queue kill message, preventing panic when deleting a mid-listening queue. +- Fixed ESP becoming unresponsive when the looptask would get deleted by captive portal deconstructor due to a missing null check. + # Version 1.0.0 - We now support **six different boards**: From 30fc578cb8cc16cbff83038656a284ea95dcd075 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 17 Jan 2024 23:04:15 +0100 Subject: [PATCH 129/147] Fix User-Agent reported --- include/Chipset.h | 26 +++++++++++++------------- include/Common.h | 32 ++++++++++++++++---------------- platformio.ini | 2 +- scripts/embed_env_vars.py | 2 +- src/GatewayClient.cpp | 2 ++ src/http/HTTPRequestManager.cpp | 6 +++--- 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/include/Chipset.h b/include/Chipset.h index 1e47ae29..9ec604e5 100644 --- a/include/Chipset.h +++ b/include/Chipset.h @@ -15,7 +15,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP8266EX -#define OPENSHOCK_FW_CHIP_NAME "ESP8266EX" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. #define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_15) @@ -27,7 +27,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/0a-esp8285_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP8285 -#define OPENSHOCK_FW_CHIP_NAME "ESP8285" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO0, GPIO2, and GPIO15 are used for boot mode and SDIO slave timing selection. #define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_0 || (pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_15) @@ -40,7 +40,7 @@ // Docs: https://www.espressif.com/sites/default/files/documentation/esp8684_datasheet_en.pdf // Docs: https://www.espressif.com/sites/default/files/documentation/esp8684_technical_reference_manual_en.pdf#bootctrl #ifdef OPENSHOCK_FW_CHIP_ESP8684 -#define OPENSHOCK_FW_CHIP_NAME "ESP8684" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO8, GPIO9 are strapping pins used to control the boot mode adn ROM code printing #define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_1 || (pin) == GPIO_NUM_3 || (pin) == GPIO_NUM_8 || (pin) == GPIO_NUM_9) @@ -52,7 +52,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp8685_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP8685 -#define OPENSHOCK_FW_CHIP_NAME "ESP8685" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO20, GPIO21 is used for UART0 RXD/TXD. // GPIO2, GPIO8, GPIO9 are strapping pins. #define CHIP_UNSAFE_GPIO(pin) ((pin) == GPIO_NUM_2 || (pin) == GPIO_NUM_8 || (pin) == GPIO_NUM_9 || (pin) == GPIO_NUM_20 || (pin) == GPIO_NUM_21) @@ -64,7 +64,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32 -#define OPENSHOCK_FW_CHIP_NAME "ESP32" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO1, GPIO3 is used for UART0 RXD/TXD. // GPIO0, GPIO2 is used to control the boot mode of the chip. @@ -84,7 +84,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-pico_series_datasheet_en.pdf (Section 2.1.2 - 2.1.3 Pin Description and Pin Mapping between ESP and Flash/PSRAM) #ifdef OPENSHOCK_FW_CHIP_ESP32PICOD4 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-PICO-D4" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO25, GPIO27, GPIO29, GPIO30, GPIO31, GPIO32, GPIO33 is used for SPI flash connection. (DO NOT TOUCH) // GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. @@ -97,7 +97,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-pico_series_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32PICOV3 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-PICO-V3" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO3, GPIO1 is used for UART0 RXD/TXD. // GPIO6, GPIO11, GPIO9, GPIO10 is used for SPI flash connection. (DO NOT TOUCH) // GPIO12, GPIO0, GPIO2, GPIO15, and GPIO5 are used for boot mode and SDIO slave timing selection. @@ -110,7 +110,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32S2 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-S2" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO44, GPIO43 is used for UART0 RXD/TXD. // GPIO29, GPIO26, GPIO32, GPIO31, GPIO30, GPIO28, GPIO27 is used for SPI flash connection. (DO NOT TOUCH) // GPIO0, GPIO45, GPIO46 is strapping pins used to control the boot mode and misc. functions. @@ -123,7 +123,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32S3 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-S3" +#define OPENSHOCK_FW_CHIP_DEFINED // GPIO44, GPIO43 is used for UART0 RXD/TXD. // GPIO19, GPIO20 is used for USB serial, flashing, and debugging. // GPIO30, GPIO29, GPIO26, GPIO32, GPIO31, GPIO28, GPIO27, GPIO33, GPIO34, GPIO35, GPIO36, GPIO37 is used for SPI flash connection. (DO NOT TOUCH) @@ -137,7 +137,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-s3-pico-1_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32S3PICO1 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-S3-PICO-1" +#define OPENSHOCK_FW_CHIP_DEFINED #error "ESP32-S3-PICO-1 is not supported yet." #endif @@ -147,7 +147,7 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32C3 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-C3" +#define OPENSHOCK_FW_CHIP_DEFINED #error "ESP32-C3 is not supported yet." #endif @@ -157,11 +157,11 @@ // // Docs: https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf #ifdef OPENSHOCK_FW_CHIP_ESP32C6 -#define OPENSHOCK_FW_CHIP_NAME "ESP32-C6" +#define OPENSHOCK_FW_CHIP_DEFINED #error "ESP32-C6 is not supported yet." #endif -#ifndef OPENSHOCK_FW_CHIP_NAME +#ifndef OPENSHOCK_FW_CHIP_DEFINED #error "Selected chipset is misspelled or not supported by OpenShock." #endif diff --git a/include/Common.h b/include/Common.h index e842e4cb..6ef50aad 100644 --- a/include/Common.h +++ b/include/Common.h @@ -13,35 +13,35 @@ #ifndef OPENSHOCK_API_DOMAIN #error "OPENSHOCK_API_DOMAIN must be defined" #endif -#ifndef OPENSHOCK_API_BASE_URL -#define OPENSHOCK_API_BASE_URL "https://" OPENSHOCK_API_DOMAIN -#endif - #ifndef OPENSHOCK_FW_CDN_DOMAIN #error "OPENSHOCK_FW_CDN_DOMAIN must be defined" #endif -#ifndef OPENSHOCK_FW_CDN_BASE_URL -#define OPENSHOCK_FW_CDN_BASE_URL "https://" OPENSHOCK_FW_CDN_DOMAIN -#endif - -#define OPENSHOCK_API_URL(path) OPENSHOCK_API_BASE_URL path -#define OPENSHOCK_FW_CDN_URL(path) OPENSHOCK_FW_CDN_BASE_URL path - #ifndef OPENSHOCK_FW_VERSION #error "OPENSHOCK_FW_VERSION must be defined" #endif -#ifndef OPENSHOCK_GPIO_INVALID +#define OPENSHOCK_API_URL(path) "https://" OPENSHOCK_API_DOMAIN path +#define OPENSHOCK_FW_CDN_URL(path) "https://" OPENSHOCK_FW_CDN_DOMAIN path + #define OPENSHOCK_GPIO_INVALID 0 -#endif #ifndef OPENSHOCK_RF_TX_GPIO #warning "OPENSHOCK_RF_TX_GPIO is not defined, setting to OPENSHOCK_GPIO_INVALID" #define OPENSHOCK_RF_TX_GPIO OPENSHOCK_GPIO_INVALID #endif +// Check if OPENSHOCK_FW_USERAGENT is overridden trough compiler flags, if not, generate a default useragent. +#ifndef OPENSHOCK_FW_USERAGENT +#define OPENSHOCK_FW_USERAGENT OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (arduino-esp32; " OPENSHOCK_FW_BOARD "; " OPENSHOCK_FW_CHIP "; Espressif)" +#endif + +// Check if Arduino.h exists, if not instruct the developer to remove "arduino-esp32" from the useragent and replace it with "ESP-IDF", after which the developer may remove this warning. +#if defined(__has_include) && !__has_include("Arduino.h") +#warning "Let it be known that Arduino hath finally been cast aside in favor of the noble ESP-IDF! I beseech thee, kind sir or madam, wouldst thou kindly partake in the honors of expunging 'arduino-esp32' from yonder useragent aloft, and in its stead, bestow the illustrious 'ESP-IDF'?" +#endif + namespace OpenShock::Constants { - constexpr std::uint8_t GPIO_INVALID = OPENSHOCK_GPIO_INVALID; - constexpr std::uint8_t GPIO_RF_TX = OPENSHOCK_RF_TX_GPIO; + const std::uint8_t GPIO_INVALID = OPENSHOCK_GPIO_INVALID; + const std::uint8_t GPIO_RF_TX = OPENSHOCK_RF_TX_GPIO; + const char* const FW_USERAGENT = OPENSHOCK_FW_USERAGENT; } // namespace OpenShock::Constants - diff --git a/platformio.ini b/platformio.ini index acdb97fd..103e50f4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,7 +19,7 @@ build_unflags = lib_deps = https://github.com/OpenShock/flatbuffers https://github.com/OpenShock/ESPAsyncWebServer - https://github.com/Links2004/arduinoWebSockets + https://github.com/OpenShock/BadWebSockets custom_openshock.flash_size = 4MB; Can be overridden per board board_build.filesystem = littlefs board_build.embed_files = certificates/x509_crt_bundle diff --git a/scripts/embed_env_vars.py b/scripts/embed_env_vars.py index c73ca571..9d8564be 100644 --- a/scripts/embed_env_vars.py +++ b/scripts/embed_env_vars.py @@ -54,7 +54,7 @@ def macroify(s: str) -> str: vars = {} vars['OPENSHOCK_FW_BOARD'] = fw_board vars['OPENSHOCK_FW_BOARD_' + macroify(fw_board)] = True # Used for conditional compilation. - vars['OPENSHOCK_FW_CHIP'] = fw_chip + vars['OPENSHOCK_FW_CHIP'] = fw_chip.upper() vars['OPENSHOCK_FW_CHIP_' + macroify(fw_chip)] = True # Used for conditional compilation. vars['OPENSHOCK_FW_MODE'] = pio_build_type git_commit = get_git_commit() diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index 2e9d7303..c7836283 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -1,5 +1,6 @@ #include "GatewayClient.h" +#include "Common.h" #include "config/Config.h" #include "event_handlers/WebSocket.h" #include "Logging.h" @@ -20,6 +21,7 @@ GatewayClient::GatewayClient(const std::string& authToken) : m_webSocket(), m_la "Device-Token: " + authToken; + m_webSocket.setUserAgent(OpenShock::Constants::FW_USERAGENT); m_webSocket.setExtraHeaders(headers.c_str()); m_webSocket.onEvent(std::bind(&GatewayClient::_handleEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); } diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index c6692c56..22c22cc9 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -1,5 +1,6 @@ #include "http/HTTPRequestManager.h" +#include "Common.h" #include "Time.h" #include @@ -13,8 +14,7 @@ constexpr std::size_t HTTP_BUFFER_SIZE = 4096LLU; constexpr int HTTP_DOWNLOAD_SIZE_LIMIT = 200 * 1024 * 1024; // 200 MB -const char* const TAG = "HTTPRequestManager"; -const char* const OPENSHOCK_FW_USERAGENT = OPENSHOCK_FW_HOSTNAME "/" OPENSHOCK_FW_VERSION " (" OPENSHOCK_FW_BOARD "; " OPENSHOCK_FW_CHIP "; Espressif) " OPENSHOCK_FW_GIT_COMMIT; +const char* const TAG = "HTTPRequestManager"; struct RateLimit { RateLimit() : m_mutex(xSemaphoreCreateMutex()), m_blockUntilMs(0), m_limits(), m_requests() { } @@ -158,7 +158,7 @@ std::shared_ptr _getRateLimiter(StringView url) { } void _setupClient(HTTPClient& client) { - client.setUserAgent(OPENSHOCK_FW_USERAGENT); + client.setUserAgent(OpenShock::Constants::FW_USERAGENT); } struct StreamReaderResult { From 27677538b72ffb1769c39baaef70511c1e46f5d1 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Thu, 18 Jan 2024 06:20:44 -0800 Subject: [PATCH 130/147] Captive Portal: Don't try to connect to secured WiFi without a password --- frontend/src/lib/components/WiFiList.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/lib/components/WiFiList.svelte b/frontend/src/lib/components/WiFiList.svelte index 7cb63b38..0a625955 100644 --- a/frontend/src/lib/components/WiFiList.svelte +++ b/frontend/src/lib/components/WiFiList.svelte @@ -35,6 +35,7 @@ value: '', valueAttr: { type: 'password', minlength: 1, maxlength: 63, required: true }, response: (password: string) => { + if (!password) return; const data = SerializeWifiNetworkSaveCommand(item.ssid, password, true); WebSocketClient.Instance.Send(data); }, From 434ab68eab7038daddb1d13703321bb63b619a84 Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Thu, 18 Jan 2024 06:36:57 -0800 Subject: [PATCH 131/147] Account Link Code: Check Length, fix not returning InvalidCode --- src/GatewayConnectionManager.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index a7b1da63..a55e6c39 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -31,6 +31,8 @@ constexpr std::uint8_t FLAG_NONE = 0; constexpr std::uint8_t FLAG_HAS_IP = 1 << 0; constexpr std::uint8_t FLAG_LINKED = 1 << 1; +constexpr std::uint8_t LINK_CODE_LENGTH = 6; + static std::uint8_t s_flags = 0; static std::unique_ptr s_wsClient = nullptr; @@ -81,6 +83,11 @@ AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { ESP_LOGD(TAG, "Attempting to link to account using code %s", linkCode); + if (std::strlen(linkCode) != LINK_CODE_LENGTH) { + ESP_LOGE(TAG, "Invalid link code length"); + return AccountLinkResultCode::InvalidCode; + } + auto response = HTTP::JsonAPI::LinkAccount(linkCode); if (response.result == HTTP::RequestResult::RateLimited) { @@ -88,11 +95,12 @@ AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { } if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); - return AccountLinkResultCode::InternalError; - } - if (response.code == 404) { - return AccountLinkResultCode::InvalidCode; + if (response.code == 404) { + return AccountLinkResultCode::InvalidCode; + } + + return AccountLinkResultCode::InternalError; } if (response.code != 200) { From 59118a0191ce36b6a687053f232972555b5cab80 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Thu, 18 Jan 2024 16:38:51 +0100 Subject: [PATCH 132/147] Only check non-empty semver identifiers --- src/SemVer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SemVer.cpp b/src/SemVer.cpp index 4bffcd95..f71447a0 100644 --- a/src/SemVer.cpp +++ b/src/SemVer.cpp @@ -286,12 +286,12 @@ bool OpenShock::TryParseSemVer(StringView semverStr, SemVer& semver) { return false; } - if (!_semverIsPrerelease(semver.prerelease)) { + if (!semver.prerelease.empty() && !_semverIsPrerelease(semver.prerelease)) { ESP_LOGE(TAG, "Invalid prerelease: %s", semver.prerelease.data()); return false; } - if (!_semverIsBuild(semver.build)) { + if (!semver.build.empty() && !_semverIsBuild(semver.build)) { ESP_LOGE(TAG, "Invalid build: %s", semver.build.data()); return false; } From b05902ace77a118a7d6fccd04c9d44a4d64317ea Mon Sep 17 00:00:00 2001 From: hhvrc Date: Thu, 18 Jan 2024 16:59:13 +0100 Subject: [PATCH 133/147] Fix responsecode checks --- src/GatewayConnectionManager.cpp | 8 ++++---- src/http/HTTPRequestManager.cpp | 12 +----------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index a55e6c39..5a0ee78a 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -96,13 +96,13 @@ AccountLinkResultCode GatewayConnectionManager::Link(const char* linkCode) { if (response.result != HTTP::RequestResult::Success) { ESP_LOGE(TAG, "Error while getting auth token: %d %d", response.result, response.code); - if (response.code == 404) { - return AccountLinkResultCode::InvalidCode; - } - return AccountLinkResultCode::InternalError; } + if (response.code == 404) { + return AccountLinkResultCode::InvalidCode; + } + if (response.code != 200) { ESP_LOGE(TAG, "Unexpected response code: %d", response.code); return AccountLinkResultCode::InternalError; diff --git a/src/http/HTTPRequestManager.cpp b/src/http/HTTPRequestManager.cpp index 22c22cc9..855b58ac 100644 --- a/src/http/HTTPRequestManager.cpp +++ b/src/http/HTTPRequestManager.cpp @@ -528,17 +528,7 @@ HTTP::Response HTTPClient client; _setupClient(client); - auto response = _doGetStream(client, url, headers, acceptedCodes, rateLimiter, contentLengthCallback, downloadCallback, timeoutMs); - if (response.result != RequestResult::Success) { - return response; - } - - if (std::find(acceptedCodes.begin(), acceptedCodes.end(), response.code) == acceptedCodes.end()) { - ESP_LOGE(TAG, "Received unexpected response code %d", response.code); - return {RequestResult::CodeRejected, response.code, 0}; - } - - return response; + return _doGetStream(client, url, headers, acceptedCodes, rateLimiter, contentLengthCallback, downloadCallback, timeoutMs); } HTTP::Response HTTP::GetString(StringView url, const std::map& headers, const std::vector& acceptedCodes, std::uint32_t timeoutMs) { From dba0f97ff7a1f1151edd26b6dbd8b5d5ee6812dd Mon Sep 17 00:00:00 2001 From: hhvrc Date: Thu, 18 Jan 2024 19:14:19 +0100 Subject: [PATCH 134/147] Fix dot-sep verification in SemVer parser --- src/SemVer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SemVer.cpp b/src/SemVer.cpp index f71447a0..f90eee57 100644 --- a/src/SemVer.cpp +++ b/src/SemVer.cpp @@ -252,8 +252,8 @@ std::string SemVer::toString() const { bool OpenShock::TryParseSemVer(StringView semverStr, SemVer& semver) { auto parts = semverStr.split('.'); - if (parts.size() != 3) { - ESP_LOGE(TAG, "Must have 3 dot-separated parts: %s", semverStr.data()); + if (parts.size() < 3) { + ESP_LOGE(TAG, "Must have at least 3 parts: %s", semverStr.data()); return false; } From efffa42c695e82f6295e85403a851feccaf3b415 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Thu, 18 Jan 2024 20:21:15 +0100 Subject: [PATCH 135/147] Add 1.1.0-rc.2 to changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebfdcf54..1b307d0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# Version 1.1.0-rc.2 Release Notes + +This is the RC (Release Candidate) 2 for version 1.1.0 + +We did a couple of bugfixes: + +- Fixed User-Agent header not being set on websocket connections. +- Stopped frontend from requesting to connect to a secured network without a password. +- Do sanity checking on pairing code length in firmware to return a proper error message early. +- Fixed some SemVer parsing logic. + # Version 1.1.0-rc.1 Release Notes It's been a while, and we think it's time for another beta release :smile: From 4c1bce386404f3edc704d35a2dad9dfc1930f735 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Fri, 19 Jan 2024 23:43:00 +0100 Subject: [PATCH 136/147] Fix updateId not being supplied to bootmessage serializer --- src/serialization/WSGateway.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serialization/WSGateway.cpp b/src/serialization/WSGateway.cpp index 2bfefcc0..0d0b046d 100644 --- a/src/serialization/WSGateway.cpp +++ b/src/serialization/WSGateway.cpp @@ -34,7 +34,7 @@ bool Gateway::SerializeBootStatusMessage(std::int32_t updateId, OpenShock::Firmw auto fbsVersion = Types::CreateSemVerDirect(builder, version.major, version.minor, version.patch, version.prerelease.data(), version.build.data()); - auto fbsBootStatus = Gateway::CreateBootStatus(builder, bootType, fbsVersion); + auto fbsBootStatus = Gateway::CreateBootStatus(builder, bootType, fbsVersion, updateId); auto msg = Gateway::CreateDeviceToGatewayMessage(builder, Gateway::DeviceToGatewayMessagePayload::BootStatus, fbsBootStatus.Union()); From 1e3ba19e1486c46d6c00af5d816c663efbf95ae5 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 00:46:35 +0100 Subject: [PATCH 137/147] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b307d0c..6a3c4994 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Version 1.1.0-rc.3 Release Notes + +Bugfixes: + +- Fixed updateID not being sent with BootStatus message. + # Version 1.1.0-rc.2 Release Notes This is the RC (Release Candidate) 2 for version 1.1.0 From 8e6d9ff883f60b4914c3b618c7cf1c89369647b5 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 18:39:46 +0100 Subject: [PATCH 138/147] Wait for message to be sent before rebooting --- src/OtaUpdateManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index b404d140..1f96baa1 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -371,7 +371,8 @@ void _otaUpdateTask(void* arg) { _sendProgressMessage(Serialization::Gateway::OtaInstallProgressTask::Rebooting, 0.0f); // Reboot into new firmware. - ESP_LOGI(TAG, "Restarting into new firmware"); + ESP_LOGI(TAG, "Restarting into new firmware..."); + vTaskDelay(pdMS_TO_TICKS(200)); break; } From a48d25c73afe535543f20a80071255f19934d825 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 18:43:01 +0100 Subject: [PATCH 139/147] Status report every 500ms --- src/util/ParitionUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/ParitionUtils.cpp b/src/util/ParitionUtils.cpp index 422bb7b7..222fd7e7 100644 --- a/src/util/ParitionUtils.cpp +++ b/src/util/ParitionUtils.cpp @@ -67,7 +67,7 @@ bool OpenShock::FlashPartitionFromUrl(const esp_partition_t* partition, StringVi contentWritten += length; std::int64_t now = OpenShock::millis(); - if (now - lastProgress >= 1000) { // Once per second + if (now - lastProgress >= 500) { // Send progress every 500ms lastProgress = now; progressCallback(contentWritten, contentLength, static_cast(contentWritten) / static_cast(contentLength)); } From 77f01d4952acd39d130a716a60de7b392b6bc7ce Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 18:44:52 +0100 Subject: [PATCH 140/147] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a3c4994..4f408d42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Version 1.1.0-rc.4 Release Notes + +Bugfixes: + +- Make OTA update status reporting smoother. + # Version 1.1.0-rc.3 Release Notes Bugfixes: From 4bd73ec42a64ac9ce5b729b71db86970f018ccd1 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 22:31:31 +0100 Subject: [PATCH 141/147] Fix boot type reporting --- .../open-shock/serialization/configuration.ts | 1 + .../configuration/ota-update-config.ts | 16 ++--- .../configuration/ota-update-step.ts | 12 ++++ include/OtaUpdateManager.h | 3 + include/OtaUpdateStep.h | 44 +++++++++++++ include/config/Config.h | 4 +- include/config/OtaUpdateConfig.h | 5 +- .../serialization/_fbs/ConfigFile_generated.h | 66 +++++++++++++++---- schemas/ConfigFile.fbs | 15 +++-- src/GatewayClient.cpp | 13 +++- src/OtaUpdateManager.cpp | 66 ++++++++++++------- src/config/Config.cpp | 12 ++-- src/config/OtaUpdateConfig.cpp | 14 ++-- src/main.cpp | 5 +- 14 files changed, 205 insertions(+), 71 deletions(-) create mode 100644 frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-step.ts create mode 100644 include/OtaUpdateStep.h diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts index b1e1a096..b7193bf5 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration.ts @@ -7,6 +7,7 @@ export { CaptivePortalConfig } from './configuration/captive-portal-config'; export { Config } from './configuration/config'; export { OtaUpdateChannel } from './configuration/ota-update-channel'; export { OtaUpdateConfig } from './configuration/ota-update-config'; +export { OtaUpdateStep } from './configuration/ota-update-step'; export { RFConfig } from './configuration/rfconfig'; export { SerialInputConfig } from './configuration/serial-input-config'; export { WiFiConfig } from './configuration/wi-fi-config'; diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts index 998eb924..b3a29758 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-config.ts @@ -5,7 +5,7 @@ import * as flatbuffers from 'flatbuffers'; import { OtaUpdateChannel } from '../../../open-shock/serialization/configuration/ota-update-channel'; -import { FirmwareBootType } from '../../../open-shock/serialization/types/firmware-boot-type'; +import { OtaUpdateStep } from '../../../open-shock/serialization/configuration/ota-update-step'; export class OtaUpdateConfig { @@ -101,11 +101,11 @@ updateId():number { } /** - * Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) + * Indicates what step of the update process the device is currently in, used to detect failed updates for status reporting. */ -bootType():FirmwareBootType { +updateStep():OtaUpdateStep { const offset = this.bb!.__offset(this.bb_pos, 22); - return offset ? this.bb!.readUint8(this.bb_pos + offset) : FirmwareBootType.Normal; + return offset ? this.bb!.readUint8(this.bb_pos + offset) : OtaUpdateStep.None; } static startOtaUpdateConfig(builder:flatbuffers.Builder) { @@ -148,8 +148,8 @@ static addUpdateId(builder:flatbuffers.Builder, updateId:number) { builder.addFieldInt32(8, updateId, 0); } -static addBootType(builder:flatbuffers.Builder, bootType:FirmwareBootType) { - builder.addFieldInt8(9, bootType, FirmwareBootType.Normal); +static addUpdateStep(builder:flatbuffers.Builder, updateStep:OtaUpdateStep) { + builder.addFieldInt8(9, updateStep, OtaUpdateStep.None); } static endOtaUpdateConfig(builder:flatbuffers.Builder):flatbuffers.Offset { @@ -157,7 +157,7 @@ static endOtaUpdateConfig(builder:flatbuffers.Builder):flatbuffers.Offset { return offset; } -static createOtaUpdateConfig(builder:flatbuffers.Builder, isEnabled:boolean, cdnDomainOffset:flatbuffers.Offset, updateChannel:OtaUpdateChannel, checkOnStartup:boolean, checkPeriodically:boolean, checkInterval:number, allowBackendManagement:boolean, requireManualApproval:boolean, updateId:number, bootType:FirmwareBootType):flatbuffers.Offset { +static createOtaUpdateConfig(builder:flatbuffers.Builder, isEnabled:boolean, cdnDomainOffset:flatbuffers.Offset, updateChannel:OtaUpdateChannel, checkOnStartup:boolean, checkPeriodically:boolean, checkInterval:number, allowBackendManagement:boolean, requireManualApproval:boolean, updateId:number, updateStep:OtaUpdateStep):flatbuffers.Offset { OtaUpdateConfig.startOtaUpdateConfig(builder); OtaUpdateConfig.addIsEnabled(builder, isEnabled); OtaUpdateConfig.addCdnDomain(builder, cdnDomainOffset); @@ -168,7 +168,7 @@ static createOtaUpdateConfig(builder:flatbuffers.Builder, isEnabled:boolean, cdn OtaUpdateConfig.addAllowBackendManagement(builder, allowBackendManagement); OtaUpdateConfig.addRequireManualApproval(builder, requireManualApproval); OtaUpdateConfig.addUpdateId(builder, updateId); - OtaUpdateConfig.addBootType(builder, bootType); + OtaUpdateConfig.addUpdateStep(builder, updateStep); return OtaUpdateConfig.endOtaUpdateConfig(builder); } } diff --git a/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-step.ts b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-step.ts new file mode 100644 index 00000000..2e1c4c61 --- /dev/null +++ b/frontend/src/lib/_fbs/open-shock/serialization/configuration/ota-update-step.ts @@ -0,0 +1,12 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */ + +export enum OtaUpdateStep { + None = 0, + Updating = 1, + Updated = 2, + Validating = 3, + Validated = 4, + RollingBack = 5 +} diff --git a/include/OtaUpdateManager.h b/include/OtaUpdateManager.h index bd26434a..f12c894b 100644 --- a/include/OtaUpdateManager.h +++ b/include/OtaUpdateManager.h @@ -1,5 +1,6 @@ #pragma once +#include "FirmwareBootType.h" #include "OtaUpdateChannel.h" #include "SemVer.h" #include "StringView.h" @@ -25,7 +26,9 @@ namespace OpenShock::OtaUpdateManager { bool TryStartFirmwareInstallation(const OpenShock::SemVer& version); + FirmwareBootType GetFirmwareBootType(); bool IsValidatingApp(); + void InvalidateAndRollback(); void ValidateApp(); } // namespace OpenShock::OtaUpdateManager diff --git a/include/OtaUpdateStep.h b/include/OtaUpdateStep.h new file mode 100644 index 00000000..343ea3cc --- /dev/null +++ b/include/OtaUpdateStep.h @@ -0,0 +1,44 @@ +#pragma once + +#include "serialization/_fbs/ConfigFile_generated.h" + +#include +#include + +namespace OpenShock { + typedef OpenShock::Serialization::Configuration::OtaUpdateStep OtaUpdateStep; + + inline bool TryParseOtaUpdateStep(OtaUpdateStep& channel, const char* str) { + if (strcasecmp(str, "none") == 0) { + channel = OtaUpdateStep::None; + return true; + } + + if (strcasecmp(str, "updating") == 0) { + channel = OtaUpdateStep::Updating; + return true; + } + + if (strcasecmp(str, "updated") == 0) { + channel = OtaUpdateStep::Updated; + return true; + } + + if (strcasecmp(str, "validating") == 0) { + channel = OtaUpdateStep::Validating; + return true; + } + + if (strcasecmp(str, "validated") == 0) { + channel = OtaUpdateStep::Validated; + return true; + } + + if (strcasecmp(str, "rollingback") == 0) { + channel = OtaUpdateStep::RollingBack; + return true; + } + + return false; + } +} // namespace OpenShock diff --git a/include/config/Config.h b/include/config/Config.h index c3b6f2e8..c5b52431 100644 --- a/include/config/Config.h +++ b/include/config/Config.h @@ -66,8 +66,8 @@ namespace OpenShock::Config { bool GetOtaUpdateId(std::int32_t& out); bool SetOtaUpdateId(std::int32_t updateId); - bool GetOtaFirmwareBootType(FirmwareBootType& out); - bool SetOtaFirmwareBootType(FirmwareBootType bootType); + bool GetOtaUpdateStep(OtaUpdateStep& out); + bool SetOtaUpdateStep(OtaUpdateStep updateStep); bool HasBackendAuthToken(); bool GetBackendAuthToken(std::string& out); diff --git a/include/config/OtaUpdateConfig.h b/include/config/OtaUpdateConfig.h index 88e906ea..446cc402 100644 --- a/include/config/OtaUpdateConfig.h +++ b/include/config/OtaUpdateConfig.h @@ -3,6 +3,7 @@ #include "config/ConfigBase.h" #include "FirmwareBootType.h" #include "OtaUpdateChannel.h" +#include "OtaUpdateStep.h" #include @@ -19,7 +20,7 @@ namespace OpenShock::Config { bool allowBackendManagement, bool requireManualApproval, std::int32_t updateId, - FirmwareBootType bootType + OtaUpdateStep updateStep ); bool isEnabled; @@ -31,7 +32,7 @@ namespace OpenShock::Config { bool allowBackendManagement; bool requireManualApproval; std::int32_t updateId; - FirmwareBootType bootType; + OtaUpdateStep updateStep; void ToDefault() override; diff --git a/include/serialization/_fbs/ConfigFile_generated.h b/include/serialization/_fbs/ConfigFile_generated.h index e508be11..434539c5 100644 --- a/include/serialization/_fbs/ConfigFile_generated.h +++ b/include/serialization/_fbs/ConfigFile_generated.h @@ -13,8 +13,6 @@ static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && FLATBUFFERS_VERSION_REVISION == 26, "Non-compatible flatbuffers version included"); -#include "FirmwareBootType_generated.h" - namespace OpenShock { namespace Serialization { namespace Configuration { @@ -76,6 +74,48 @@ inline const char *EnumNameOtaUpdateChannel(OtaUpdateChannel e) { return EnumNamesOtaUpdateChannel()[index]; } +enum class OtaUpdateStep : uint8_t { + None = 0, + Updating = 1, + Updated = 2, + Validating = 3, + Validated = 4, + RollingBack = 5, + MIN = None, + MAX = RollingBack +}; + +inline const OtaUpdateStep (&EnumValuesOtaUpdateStep())[6] { + static const OtaUpdateStep values[] = { + OtaUpdateStep::None, + OtaUpdateStep::Updating, + OtaUpdateStep::Updated, + OtaUpdateStep::Validating, + OtaUpdateStep::Validated, + OtaUpdateStep::RollingBack + }; + return values; +} + +inline const char * const *EnumNamesOtaUpdateStep() { + static const char * const names[7] = { + "None", + "Updating", + "Updated", + "Validating", + "Validated", + "RollingBack", + nullptr + }; + return names; +} + +inline const char *EnumNameOtaUpdateStep(OtaUpdateStep e) { + if (::flatbuffers::IsOutRange(e, OtaUpdateStep::None, OtaUpdateStep::RollingBack)) return ""; + const size_t index = static_cast(e); + return EnumNamesOtaUpdateStep()[index]; +} + struct RFConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef RFConfigBuilder Builder; struct Traits; @@ -514,7 +554,7 @@ struct OtaUpdateConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VT_ALLOW_BACKEND_MANAGEMENT = 16, VT_REQUIRE_MANUAL_APPROVAL = 18, VT_UPDATE_ID = 20, - VT_BOOT_TYPE = 22 + VT_UPDATE_STEP = 22 }; /// Indicates whether OTA updates are enabled. bool is_enabled() const { @@ -552,9 +592,9 @@ struct OtaUpdateConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { int32_t update_id() const { return GetField(VT_UPDATE_ID, 0); } - /// Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) - OpenShock::Serialization::Types::FirmwareBootType boot_type() const { - return static_cast(GetField(VT_BOOT_TYPE, 0)); + /// Indicates what step of the update process the device is currently in, used to detect failed updates for status reporting. + OpenShock::Serialization::Configuration::OtaUpdateStep update_step() const { + return static_cast(GetField(VT_UPDATE_STEP, 0)); } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && @@ -568,7 +608,7 @@ struct OtaUpdateConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { VerifyField(verifier, VT_ALLOW_BACKEND_MANAGEMENT, 1) && VerifyField(verifier, VT_REQUIRE_MANUAL_APPROVAL, 1) && VerifyField(verifier, VT_UPDATE_ID, 4) && - VerifyField(verifier, VT_BOOT_TYPE, 1) && + VerifyField(verifier, VT_UPDATE_STEP, 1) && verifier.EndTable(); } }; @@ -604,8 +644,8 @@ struct OtaUpdateConfigBuilder { void add_update_id(int32_t update_id) { fbb_.AddElement(OtaUpdateConfig::VT_UPDATE_ID, update_id, 0); } - void add_boot_type(OpenShock::Serialization::Types::FirmwareBootType boot_type) { - fbb_.AddElement(OtaUpdateConfig::VT_BOOT_TYPE, static_cast(boot_type), 0); + void add_update_step(OpenShock::Serialization::Configuration::OtaUpdateStep update_step) { + fbb_.AddElement(OtaUpdateConfig::VT_UPDATE_STEP, static_cast(update_step), 0); } explicit OtaUpdateConfigBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { @@ -629,12 +669,12 @@ inline ::flatbuffers::Offset CreateOtaUpdateConfig( bool allow_backend_management = false, bool require_manual_approval = false, int32_t update_id = 0, - OpenShock::Serialization::Types::FirmwareBootType boot_type = OpenShock::Serialization::Types::FirmwareBootType::Normal) { + OpenShock::Serialization::Configuration::OtaUpdateStep update_step = OpenShock::Serialization::Configuration::OtaUpdateStep::None) { OtaUpdateConfigBuilder builder_(_fbb); builder_.add_update_id(update_id); builder_.add_cdn_domain(cdn_domain); builder_.add_check_interval(check_interval); - builder_.add_boot_type(boot_type); + builder_.add_update_step(update_step); builder_.add_require_manual_approval(require_manual_approval); builder_.add_allow_backend_management(allow_backend_management); builder_.add_check_periodically(check_periodically); @@ -660,7 +700,7 @@ inline ::flatbuffers::Offset CreateOtaUpdateConfigDirect( bool allow_backend_management = false, bool require_manual_approval = false, int32_t update_id = 0, - OpenShock::Serialization::Types::FirmwareBootType boot_type = OpenShock::Serialization::Types::FirmwareBootType::Normal) { + OpenShock::Serialization::Configuration::OtaUpdateStep update_step = OpenShock::Serialization::Configuration::OtaUpdateStep::None) { auto cdn_domain__ = cdn_domain ? _fbb.CreateString(cdn_domain) : 0; return OpenShock::Serialization::Configuration::CreateOtaUpdateConfig( _fbb, @@ -673,7 +713,7 @@ inline ::flatbuffers::Offset CreateOtaUpdateConfigDirect( allow_backend_management, require_manual_approval, update_id, - boot_type); + update_step); } struct Config FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { diff --git a/schemas/ConfigFile.fbs b/schemas/ConfigFile.fbs index b71c156e..d7e88d8f 100644 --- a/schemas/ConfigFile.fbs +++ b/schemas/ConfigFile.fbs @@ -1,5 +1,3 @@ -include "./Types/FirmwareBootType.fbs"; - namespace OpenShock.Serialization.Configuration; table RFConfig { @@ -57,6 +55,15 @@ enum OtaUpdateChannel:uint8 { Develop = 2 } +enum OtaUpdateStep:uint8 { + None = 0, + Updating = 1, + Updated = 2, + Validating = 3, + Validated = 4, + RollingBack = 5, +} + // Represents configuration for Over-The-Air (OTA) updates. table OtaUpdateConfig { /// Indicates whether OTA updates are enabled. @@ -86,8 +93,8 @@ table OtaUpdateConfig { /// Update process ID, used to track the update process server-side across reboots. update_id:int32; - /// Indicates what kind of firmware boot is happening (normal boot, booting into new firmware, rolling back to old firmware, etc.) - boot_type:Types.FirmwareBootType; + /// Indicates what step of the update process the device is currently in, used to detect failed updates for status reporting. + update_step:OtaUpdateStep; } table Config { diff --git a/src/GatewayClient.cpp b/src/GatewayClient.cpp index c7836283..5e330371 100644 --- a/src/GatewayClient.cpp +++ b/src/GatewayClient.cpp @@ -4,6 +4,7 @@ #include "config/Config.h" #include "event_handlers/WebSocket.h" #include "Logging.h" +#include "OtaUpdateManager.h" #include "serialization/WSGateway.h" #include "Time.h" #include "util/CertificateUtils.h" @@ -119,8 +120,8 @@ void GatewayClient::_sendBootStatus() { return; } - OpenShock::FirmwareBootType bootType; - if (!Config::GetOtaFirmwareBootType(bootType)) { + OpenShock::OtaUpdateStep updateStep; + if (!Config::GetOtaUpdateStep(updateStep)) { ESP_LOGE(TAG, "Failed to get OTA firmware boot type"); return; } @@ -131,7 +132,13 @@ void GatewayClient::_sendBootStatus() { return; } - s_bootStatusSent = Serialization::Gateway::SerializeBootStatusMessage(updateId, bootType, version, [this](const std::uint8_t* data, std::size_t len) { return m_webSocket.sendBIN(data, len); }); + s_bootStatusSent = Serialization::Gateway::SerializeBootStatusMessage(updateId, OtaUpdateManager::GetFirmwareBootType(), version, [this](const std::uint8_t* data, std::size_t len) { return m_webSocket.sendBIN(data, len); }); + + if (s_bootStatusSent && updateStep != OpenShock::OtaUpdateStep::None) { + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::None)) { + ESP_LOGE(TAG, "Failed to reset firmware boot type to normal"); + } + } } void GatewayClient::_handleEvent(WStype_t type, std::uint8_t* payload, std::size_t length) { diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index 1f96baa1..eb2b4c67 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -58,7 +58,8 @@ enum OtaTaskEventFlag : std::uint32_t { OTA_TASK_EVENT_WIFI_CONNECTED = 1 << 2, }; -static bool _otaValidatingApp = false; +static esp_ota_img_states_t _otaImageState; +static OpenShock::FirmwareBootType _bootType; static TaskHandle_t _taskHandle; static OpenShock::SemVer _requestedVersion; static SemaphoreHandle_t _requestedVersionMutex = xSemaphoreCreateMutex(); @@ -314,6 +315,10 @@ void _otaUpdateTask(void* arg) { ESP_LOGE(TAG, "Failed to set OTA update ID"); continue; } + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::Updating)) { + ESP_LOGE(TAG, "Failed to set OTA update step"); + continue; + } if (!Serialization::Gateway::SerializeOtaInstallStartedMessage(updateId, version, GatewayConnectionManager::SendMessageBIN)) { ESP_LOGE(TAG, "Failed to serialize OTA install started message"); @@ -361,9 +366,9 @@ void _otaUpdateTask(void* arg) { if (!_flashAppPartition(appPartition, release.appBinaryUrl, release.appBinaryHash)) continue; // Set OTA boot type in config. - if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::NewFirmware)) { - ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); - _sendFailureMessage("Failed to set OTA firmware boot type"); + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::Updated)) { + ESP_LOGE(TAG, "Failed to set OTA update step"); + _sendFailureMessage("Failed to set OTA update step"); continue; } @@ -423,23 +428,37 @@ bool OtaUpdateManager::Init() { ESP_LOGD(TAG, "Fetching partition state"); // Get OTA state for said partition. - esp_ota_img_states_t states; - esp_err_t err = esp_ota_get_state_partition(partition, &states); + esp_err_t err = esp_ota_get_state_partition(partition, &_otaImageState); if (err != ESP_OK) { ESP_PANIC(TAG, "Failed to get partition state: %s", esp_err_to_name(err)); return false; // This will never be reached, but the compiler doesn't know that. } - ESP_LOGD(TAG, "Partition state: %u", states); + ESP_LOGD(TAG, "Fetching previous update step"); + OtaUpdateStep updateStep; + if (!Config::GetOtaUpdateStep(updateStep)) { + ESP_LOGE(TAG, "Failed to get OTA update step"); + return false; + } - // If the currently booting partition is being verified, set correct state. - _otaValidatingApp = states == ESP_OTA_IMG_PENDING_VERIFY; + // Infer boot type from update step. + switch (updateStep) { + case OtaUpdateStep::Updated: + _bootType = FirmwareBootType::NewFirmware; + break; + case OtaUpdateStep::Validating: // If the update step is validating, we have failed in the middle of validating the new firmware, meaning this is a rollback. + case OtaUpdateStep::RollingBack: + _bootType = FirmwareBootType::Rollback; + break; + default: + _bootType = FirmwareBootType::Normal; + break; + } - // Configure event triggers. - Config::OtaUpdateConfig otaUpdateConfig; - if (!Config::GetOtaUpdateConfig(otaUpdateConfig)) { - ESP_LOGE(TAG, "Failed to get OTA update config"); - return false; + if (updateStep == OtaUpdateStep::Updated) { + if (!Config::SetOtaUpdateStep(OtaUpdateStep::Validating)) { + ESP_PANIC(TAG, "Failed to set OTA update step in critical section"); // TODO: THIS IS A CRITICAL SECTION, WHAT DO WE DO? + } } WiFi.onEvent(_otaEvGotIPHandler, ARDUINO_EVENT_WIFI_STA_GOT_IP); @@ -607,13 +626,17 @@ bool OtaUpdateManager::TryStartFirmwareInstallation(const OpenShock::SemVer& ver return _tryQueueUpdateRequest(version); } +FirmwareBootType OtaUpdateManager::GetFirmwareBootType() { + return _bootType; +} + bool OtaUpdateManager::IsValidatingApp() { - return _otaValidatingApp; + return _otaImageState == ESP_OTA_IMG_PENDING_VERIFY; } void OtaUpdateManager::InvalidateAndRollback() { // Set OTA boot type in config. - if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Rollback)) { + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::RollingBack)) { ESP_PANIC(TAG, "Failed to set OTA firmware boot type in critical section"); // TODO: THIS IS A CRITICAL SECTION, WHAT DO WE DO? return; } @@ -631,7 +654,7 @@ void OtaUpdateManager::InvalidateAndRollback() { } // Set OTA boot type in config. - if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Normal)) { + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::None)) { ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); } @@ -640,16 +663,13 @@ void OtaUpdateManager::InvalidateAndRollback() { void OtaUpdateManager::ValidateApp() { if (esp_ota_mark_app_valid_cancel_rollback() != ESP_OK) { - // Set OTA boot type in config. - if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Rollback)) { // TODO: Check if we are in new firmware, if so set to rollback, else set to normal - ESP_LOGE(TAG, "Failed to set OTA firmware boot type"); - } - ESP_PANIC(TAG, "Unable to mark app as valid, WTF?"); // TODO: Wtf do we do here? } // Set OTA boot type in config. - if (!Config::SetOtaFirmwareBootType(OpenShock::FirmwareBootType::Normal)) { + if (!Config::SetOtaUpdateStep(OpenShock::OtaUpdateStep::Validated)) { ESP_PANIC(TAG, "Failed to set OTA firmware boot type in critical section"); // TODO: THIS IS A CRITICAL SECTION, WHAT DO WE DO? } + + _otaImageState = ESP_OTA_IMG_VALID; } diff --git a/src/config/Config.cpp b/src/config/Config.cpp index f45e3f35..e46cca17 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -1,7 +1,7 @@ #include "config/Config.h" -#include "config/RootConfig.h" #include "Common.h" +#include "config/RootConfig.h" #include "Logging.h" #include "ReadWriteMutex.h" @@ -604,28 +604,28 @@ bool Config::SetOtaUpdateId(std::int32_t updateId) { return _trySaveConfig(); } -bool Config::GetOtaFirmwareBootType(FirmwareBootType& out) { +bool Config::GetOtaUpdateStep(OtaUpdateStep& out) { ScopedReadLock lock(&_configMutex); if (!lock.isLocked()) { ESP_LOGE(TAG, "Failed to acquire read lock"); } - out = _configData.otaUpdate.bootType; + out = _configData.otaUpdate.updateStep; return true; } -bool Config::SetOtaFirmwareBootType(FirmwareBootType bootType) { +bool Config::SetOtaUpdateStep(OtaUpdateStep updateStep) { ScopedWriteLock lock(&_configMutex); if (!lock.isLocked()) { ESP_LOGE(TAG, "Failed to acquire write lock"); } - if (_configData.otaUpdate.bootType == bootType) { + if (_configData.otaUpdate.updateStep == updateStep) { return true; } - _configData.otaUpdate.bootType = bootType; + _configData.otaUpdate.updateStep = updateStep; return _trySaveConfig(); } diff --git a/src/config/OtaUpdateConfig.cpp b/src/config/OtaUpdateConfig.cpp index 35383d3f..a9839d0d 100644 --- a/src/config/OtaUpdateConfig.cpp +++ b/src/config/OtaUpdateConfig.cpp @@ -21,7 +21,7 @@ OtaUpdateConfig::OtaUpdateConfig( bool allowBackendManagement, bool requireManualApproval, std::int32_t updateId, - FirmwareBootType bootType + OtaUpdateStep updateStep ) { this->isEnabled = isEnabled; this->cdnDomain = cdnDomain; @@ -32,7 +32,7 @@ OtaUpdateConfig::OtaUpdateConfig( this->allowBackendManagement = allowBackendManagement; this->requireManualApproval = requireManualApproval; this->updateId = updateId; - this->bootType = bootType; + this->updateStep = updateStep; } void OtaUpdateConfig::ToDefault() { @@ -45,7 +45,7 @@ void OtaUpdateConfig::ToDefault() { allowBackendManagement = true; requireManualApproval = false; updateId = 0; - bootType = FirmwareBootType::Normal; + updateStep = OtaUpdateStep::None; } bool OtaUpdateConfig::FromFlatbuffers(const Serialization::Configuration::OtaUpdateConfig* config) { @@ -63,13 +63,13 @@ bool OtaUpdateConfig::FromFlatbuffers(const Serialization::Configuration::OtaUpd allowBackendManagement = config->allow_backend_management(); requireManualApproval = config->require_manual_approval(); updateId = config->update_id(); - bootType = config->boot_type(); + updateStep = config->update_step(); return true; } flatbuffers::Offset OtaUpdateConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { - return Serialization::Configuration::CreateOtaUpdateConfig(builder, isEnabled, builder.CreateString(cdnDomain), updateChannel, checkOnStartup, checkPeriodically, checkInterval, allowBackendManagement, requireManualApproval, updateId, bootType); + return Serialization::Configuration::CreateOtaUpdateConfig(builder, isEnabled, builder.CreateString(cdnDomain), updateChannel, checkOnStartup, checkPeriodically, checkInterval, allowBackendManagement, requireManualApproval, updateId, updateStep); } bool OtaUpdateConfig::FromJSON(const cJSON* json) { @@ -92,7 +92,7 @@ bool OtaUpdateConfig::FromJSON(const cJSON* json) { Internal::Utils::FromJsonBool(allowBackendManagement, json, "allowBackendManagement", true); Internal::Utils::FromJsonBool(requireManualApproval, json, "requireManualApproval", false); Internal::Utils::FromJsonI32(updateId, json, "updateId", 0); - Internal::Utils::FromJsonStrParsed(bootType, json, "bootType", OpenShock::TryParseFirmwareBootType, OpenShock::FirmwareBootType::Normal); + Internal::Utils::FromJsonStrParsed(updateStep, json, "updateStep", OpenShock::TryParseOtaUpdateStep, OpenShock::OtaUpdateStep::None); return true; } @@ -109,7 +109,7 @@ cJSON* OtaUpdateConfig::ToJSON(bool withSensitiveData) const { cJSON_AddBoolToObject(root, "allowBackendManagement", allowBackendManagement); cJSON_AddBoolToObject(root, "requireManualApproval", requireManualApproval); cJSON_AddNumberToObject(root, "updateId", updateId); - cJSON_AddStringToObject(root, "bootType", OpenShock::Serialization::Types::EnumNameFirmwareBootType(bootType)); + cJSON_AddStringToObject(root, "updateStep", OpenShock::Serialization::Configuration::EnumNameOtaUpdateStep(updateStep)); return root; } diff --git a/src/main.cpp b/src/main.cpp index d60a5c9f..339068df 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include "CaptivePortal.h" #include "CommandHandler.h" -#include "config/Config.h" #include "Common.h" +#include "config/Config.h" #include "EStopManager.h" #include "event_handlers/Init.h" #include "GatewayConnectionManager.h" @@ -26,8 +26,6 @@ bool trySetup() { OpenShock::EStopManager::Init(100); // 100ms update interval - OpenShock::Config::Init(); - if (!OpenShock::SerialInputHandler::Init()) { ESP_LOGE(TAG, "Unable to initialize SerialInputHandler"); return false; @@ -80,6 +78,7 @@ void appSetup() { void setup() { Serial.begin(115'200); + OpenShock::Config::Init(); OpenShock::OtaUpdateManager::Init(); if (OpenShock::OtaUpdateManager::IsValidatingApp()) { otaSetup(); From cc08101d4f9ae41fa811b7f7d00d11b63a0555f0 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 23:20:37 +0100 Subject: [PATCH 142/147] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f408d42..ac05610b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Bugfixes: +- Fix what firmware boot type firmware reports to server. + +# Version 1.1.0-rc.4 Release Notes + +Bugfixes: + - Make OTA update status reporting smoother. # Version 1.1.0-rc.3 Release Notes From 26e459450e59482a679a67406a76d11c7c24fa50 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Sat, 20 Jan 2024 23:29:25 +0100 Subject: [PATCH 143/147] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac05610b..aae75537 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Version 1.1.0-rc.4 Release Notes +# Version 1.1.0-rc.5 Release Notes Bugfixes: From f72d079f1ca39134f4881e2c60fae6f43dc06dea Mon Sep 17 00:00:00 2001 From: nullstalgia Date: Mon, 22 Jan 2024 02:58:09 -0800 Subject: [PATCH 144/147] Captive Portal Bugfixes (#185) * Don't try to connect without a password * Better link code error checks * Send discovered networks when user connects to captive portal * Don't use discovered networks by reference, send networks as array --------- Co-authored-by: hhvrc --- .../WifiNetworkEventHandler.ts | 15 ++++++--- .../serialization/local/wifi-network-event.ts | 31 ++++++++++++++++--- include/serialization/WSLocal.h | 2 +- .../_fbs/DeviceToLocalMessage_generated.h | 30 ++++++++++++------ include/wifi/WiFiManager.h | 5 +++ schemas/DeviceToLocalMessage.fbs | 2 +- src/CaptivePortalInstance.cpp | 5 +++ src/event_handlers/WiFiScan.cpp | 2 +- src/serialization/WSLocal.cpp | 10 ++++-- src/wifi/WiFiManager.cpp | 16 ++++++---- 10 files changed, 89 insertions(+), 29 deletions(-) diff --git a/frontend/src/lib/MessageHandlers/WifiNetworkEventHandler.ts b/frontend/src/lib/MessageHandlers/WifiNetworkEventHandler.ts index 5f5d42c7..9b5268c5 100644 --- a/frontend/src/lib/MessageHandlers/WifiNetworkEventHandler.ts +++ b/frontend/src/lib/MessageHandlers/WifiNetworkEventHandler.ts @@ -147,9 +147,6 @@ export const WifiNetworkEventHandler: MessageHandler = (cli, msg) => { const payload = new WifiNetworkEvent(); msg.payload(payload); - const fbsNetwork = new FbsWifiNetwork(); - payload.network(fbsNetwork); - const eventType = payload.eventType(); if (eventType < 0 || eventType >= EventHandlers.length) { @@ -157,5 +154,13 @@ export const WifiNetworkEventHandler: MessageHandler = (cli, msg) => { return; } - EventHandlers[eventType](fbsNetwork); -}; + const networksLength = payload.networksLength(); + for (let i = 0; i < networksLength; i++) { + const fbsNetwork = payload.networks(i); + if (!fbsNetwork) { + console.warn('[WS] Received invalid wifi network event (null network)'); + continue; + } + EventHandlers[eventType](fbsNetwork); + } +}; \ No newline at end of file diff --git a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts index 9e8d48e6..d5670352 100644 --- a/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts +++ b/frontend/src/lib/_fbs/open-shock/serialization/local/wifi-network-event.ts @@ -31,9 +31,14 @@ eventType():WifiNetworkEventType { return offset ? this.bb!.readUint8(this.bb_pos + offset) : WifiNetworkEventType.Discovered; } -network(obj?:WifiNetwork):WifiNetwork|null { +networks(index: number, obj?:WifiNetwork):WifiNetwork|null { const offset = this.bb!.__offset(this.bb_pos, 6); - return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; + return offset ? (obj || new WifiNetwork()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null; +} + +networksLength():number { + const offset = this.bb!.__offset(this.bb_pos, 6); + return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; } static startWifiNetworkEvent(builder:flatbuffers.Builder) { @@ -44,8 +49,20 @@ static addEventType(builder:flatbuffers.Builder, eventType:WifiNetworkEventType) builder.addFieldInt8(0, eventType, WifiNetworkEventType.Discovered); } -static addNetwork(builder:flatbuffers.Builder, networkOffset:flatbuffers.Offset) { - builder.addFieldOffset(1, networkOffset, 0); +static addNetworks(builder:flatbuffers.Builder, networksOffset:flatbuffers.Offset) { + builder.addFieldOffset(1, networksOffset, 0); +} + +static createNetworksVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset { + builder.startVector(4, data.length, 4); + for (let i = data.length - 1; i >= 0; i--) { + builder.addOffset(data[i]!); + } + return builder.endVector(); +} + +static startNetworksVector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(4, numElems, 4); } static endWifiNetworkEvent(builder:flatbuffers.Builder):flatbuffers.Offset { @@ -53,4 +70,10 @@ static endWifiNetworkEvent(builder:flatbuffers.Builder):flatbuffers.Offset { return offset; } +static createWifiNetworkEvent(builder:flatbuffers.Builder, eventType:WifiNetworkEventType, networksOffset:flatbuffers.Offset):flatbuffers.Offset { + WifiNetworkEvent.startWifiNetworkEvent(builder); + WifiNetworkEvent.addEventType(builder, eventType); + WifiNetworkEvent.addNetworks(builder, networksOffset); + return WifiNetworkEvent.endWifiNetworkEvent(builder); +} } diff --git a/include/serialization/WSLocal.h b/include/serialization/WSLocal.h index 79e76a0f..1fadbf16 100644 --- a/include/serialization/WSLocal.h +++ b/include/serialization/WSLocal.h @@ -15,5 +15,5 @@ namespace OpenShock::Serialization::Local { bool SerializeErrorMessage(const char* message, Common::SerializationCallbackFn callback); bool SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool accountLinked, Common::SerializationCallbackFn callback); bool SerializeWiFiScanStatusChangedEvent(OpenShock::WiFiScanStatus status, Common::SerializationCallbackFn callback); - bool SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, const WiFiNetwork& network, Common::SerializationCallbackFn callback); + bool SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, std::vector networks, Common::SerializationCallbackFn callback); } // namespace OpenShock::Serialization::Local diff --git a/include/serialization/_fbs/DeviceToLocalMessage_generated.h b/include/serialization/_fbs/DeviceToLocalMessage_generated.h index e7e213f0..58e04b48 100644 --- a/include/serialization/_fbs/DeviceToLocalMessage_generated.h +++ b/include/serialization/_fbs/DeviceToLocalMessage_generated.h @@ -442,19 +442,20 @@ struct WifiNetworkEvent FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { } enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_EVENT_TYPE = 4, - VT_NETWORK = 6 + VT_NETWORKS = 6 }; OpenShock::Serialization::Types::WifiNetworkEventType event_type() const { return static_cast(GetField(VT_EVENT_TYPE, 0)); } - const OpenShock::Serialization::Types::WifiNetwork *network() const { - return GetPointer(VT_NETWORK); + const ::flatbuffers::Vector<::flatbuffers::Offset> *networks() const { + return GetPointer> *>(VT_NETWORKS); } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_EVENT_TYPE, 1) && - VerifyOffset(verifier, VT_NETWORK) && - verifier.VerifyTable(network()) && + VerifyOffset(verifier, VT_NETWORKS) && + verifier.VerifyVector(networks()) && + verifier.VerifyVectorOfTables(networks()) && verifier.EndTable(); } }; @@ -466,8 +467,8 @@ struct WifiNetworkEventBuilder { void add_event_type(OpenShock::Serialization::Types::WifiNetworkEventType event_type) { fbb_.AddElement(WifiNetworkEvent::VT_EVENT_TYPE, static_cast(event_type), 0); } - void add_network(::flatbuffers::Offset network) { - fbb_.AddOffset(WifiNetworkEvent::VT_NETWORK, network); + void add_networks(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> networks) { + fbb_.AddOffset(WifiNetworkEvent::VT_NETWORKS, networks); } explicit WifiNetworkEventBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { @@ -483,9 +484,9 @@ struct WifiNetworkEventBuilder { inline ::flatbuffers::Offset CreateWifiNetworkEvent( ::flatbuffers::FlatBufferBuilder &_fbb, OpenShock::Serialization::Types::WifiNetworkEventType event_type = OpenShock::Serialization::Types::WifiNetworkEventType::Discovered, - ::flatbuffers::Offset network = 0) { + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> networks = 0) { WifiNetworkEventBuilder builder_(_fbb); - builder_.add_network(network); + builder_.add_networks(networks); builder_.add_event_type(event_type); return builder_.Finish(); } @@ -495,6 +496,17 @@ struct WifiNetworkEvent::Traits { static auto constexpr Create = CreateWifiNetworkEvent; }; +inline ::flatbuffers::Offset CreateWifiNetworkEventDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + OpenShock::Serialization::Types::WifiNetworkEventType event_type = OpenShock::Serialization::Types::WifiNetworkEventType::Discovered, + const std::vector<::flatbuffers::Offset> *networks = nullptr) { + auto networks__ = networks ? _fbb.CreateVector<::flatbuffers::Offset>(*networks) : 0; + return OpenShock::Serialization::Local::CreateWifiNetworkEvent( + _fbb, + event_type, + networks__); +} + struct WifiGotIpEvent FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef WifiGotIpEventBuilder Builder; struct Traits; diff --git a/include/wifi/WiFiManager.h b/include/wifi/WiFiManager.h index db22657b..efab76d4 100644 --- a/include/wifi/WiFiManager.h +++ b/include/wifi/WiFiManager.h @@ -4,6 +4,7 @@ #include #include +#include namespace OpenShock::WiFiManager { /// @brief Initializes the WiFiManager @@ -64,4 +65,8 @@ namespace OpenShock::WiFiManager { /// @brief Runs the WiFiManager loop void Update(); + + /// @brief Gets a copy of the vector of discovered WiFi networks + /// @return Vector of discovered WiFiNetworks + std::vector GetDiscoveredWiFiNetworks(); } // namespace OpenShock::WiFiManager diff --git a/schemas/DeviceToLocalMessage.fbs b/schemas/DeviceToLocalMessage.fbs index 47b40217..50cdb999 100644 --- a/schemas/DeviceToLocalMessage.fbs +++ b/schemas/DeviceToLocalMessage.fbs @@ -24,7 +24,7 @@ struct WifiScanStatusMessage { } table WifiNetworkEvent { event_type:Types.WifiNetworkEventType; - network:Types.WifiNetwork; + networks:[Types.WifiNetwork]; } table WifiGotIpEvent { ip:string; diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 7581c716..efc7c267 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -158,6 +158,11 @@ void CaptivePortalInstance::handleWebSocketClientConnected(std::uint8_t socketId } Serialization::Local::SerializeReadyMessage(connectedNetworkPtr, GatewayConnectionManager::IsLinked(), std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); + + // Send all previously scanned wifi networks + auto networks = OpenShock::WiFiManager::GetDiscoveredWiFiNetworks(); + + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {networks}, std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); } void CaptivePortalInstance::handleWebSocketClientDisconnected(std::uint8_t socketId) { diff --git a/src/event_handlers/WiFiScan.cpp b/src/event_handlers/WiFiScan.cpp index 4885a853..1a1d00a7 100644 --- a/src/event_handlers/WiFiScan.cpp +++ b/src/event_handlers/WiFiScan.cpp @@ -23,7 +23,7 @@ void _scanNetworkDiscoveredHandler(const wifi_ap_record_t* record) { std::uint8_t id = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); WiFiNetwork network(record, id); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, network, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {network}, CaptivePortal::BroadcastMessageBIN); } void OpenShock::EventHandlers::WiFiScan::Init() { diff --git a/src/serialization/WSLocal.cpp b/src/serialization/WSLocal.cpp index 92823319..62eb1fc0 100644 --- a/src/serialization/WSLocal.cpp +++ b/src/serialization/WSLocal.cpp @@ -104,10 +104,16 @@ bool Local::SerializeWiFiScanStatusChangedEvent(OpenShock::WiFiScanStatus status return callback(span.data(), span.size()); } -bool Local::SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, const WiFiNetwork& network, Common::SerializationCallbackFn callback) { +bool Local::SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, std::vector networks, Common::SerializationCallbackFn callback) { flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly - auto wrapperOffset = Local::CreateWifiNetworkEvent(builder, eventType, _createWiFiNetwork(builder, network)); + std::vector> fbsNetworks; + + for (const auto& network : networks) { + fbsNetworks.push_back(_createWiFiNetwork(builder, network)); + } + + auto wrapperOffset = Local::CreateWifiNetworkEvent(builder, eventType, builder.CreateVector(fbsNetworks)); auto msg = Local::CreateDeviceToLocalMessage(builder, Local::DeviceToLocalMessagePayload::WifiNetworkEvent, wrapperOffset.Union()); diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 414ff229..23949241 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -178,7 +178,7 @@ bool _authenticate(const WiFiNetwork& net, const std::string& password) { return false; } - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Saved, net, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Saved, {net}, CaptivePortal::BroadcastMessageBIN); return _connect(net.ssid, password); } @@ -202,7 +202,7 @@ void _evWiFiConnected(arduino_event_t* event) { ESP_LOGI(TAG, "Connected to network %s (" BSSID_FMT ")", reinterpret_cast(info.ssid), BSSID_ARG(info.bssid)); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Connected, *it, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Connected, {*it}, CaptivePortal::BroadcastMessageBIN); } void _evWiFiGotIP(arduino_event_t* event) { const auto& info = event->event_info.got_ip; @@ -247,7 +247,7 @@ void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { for (auto it = s_wifiNetworks.begin(); it != s_wifiNetworks.end();) { if (it->scansMissed++ > 3) { ESP_LOGV(TAG, "Network %s (" BSSID_FMT ") has not been seen in 3 scans, removing from list", it->ssid, BSSID_ARG(it->bssid)); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Lost, *it, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Lost, {*it}, CaptivePortal::BroadcastMessageBIN); it = s_wifiNetworks.erase(it); } else { ++it; @@ -274,7 +274,7 @@ void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { it->credentialsID = credsId; // TODO: I don't understand why I need to set this here, but it seems to fix a bug where the credentials ID is not set correctly it->scansMissed = 0; - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Updated, *it, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Updated, {*it}, CaptivePortal::BroadcastMessageBIN); ESP_LOGV(TAG, "Updated network %s (" BSSID_FMT ") with new scan info", it->ssid, BSSID_ARG(it->bssid)); return; @@ -282,7 +282,7 @@ void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { WiFiNetwork network(record->ssid, record->bssid, record->primary, record->rssi, record->authmode, credsId); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, network, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {network}, CaptivePortal::BroadcastMessageBIN); ESP_LOGV(TAG, "Discovered new network %s (" BSSID_FMT ")", network.ssid, BSSID_ARG(network.bssid)); // Insert the network into the list of networks sorted by RSSI @@ -363,7 +363,7 @@ bool WiFiManager::Forget(const char* ssid) { // Remove the credentials from the config if (Config::RemoveWiFiCredentials(credsId)) { it->credentialsID = 0; - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Removed, *it, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Removed, {*it}, CaptivePortal::BroadcastMessageBIN); } return true; @@ -528,3 +528,7 @@ void WiFiManager::Update() { _connect(creds.ssid, creds.password); } + +std::vector WiFiManager::GetDiscoveredWiFiNetworks() { + return s_wifiNetworks; +} From 68c2aeda421b8cca096fa141a8907db4c994babe Mon Sep 17 00:00:00 2001 From: hhvrc Date: Mon, 22 Jan 2024 17:26:12 +0100 Subject: [PATCH 145/147] Remove duplicate code --- include/event_handlers/Init.h | 9 ++------ include/event_handlers/WiFiScan.h | 6 ----- src/event_handlers/WiFiScan.cpp | 37 ------------------------------- src/wifi/WiFiManager.cpp | 3 +++ 4 files changed, 5 insertions(+), 50 deletions(-) delete mode 100644 include/event_handlers/WiFiScan.h delete mode 100644 src/event_handlers/WiFiScan.cpp diff --git a/include/event_handlers/Init.h b/include/event_handlers/Init.h index aea03a97..2f382854 100644 --- a/include/event_handlers/Init.h +++ b/include/event_handlers/Init.h @@ -1,14 +1,9 @@ #pragma once #include "event_handlers/WebSocket.h" -#include "event_handlers/WiFiScan.h" namespace OpenShock::EventHandlers { - void Init() { - WiFiScan::Init(); - } + void Init() { } - void Deinit() { - WiFiScan::Deinit(); - } + void Deinit() { } } // namespace OpenShock::EventHandlers diff --git a/include/event_handlers/WiFiScan.h b/include/event_handlers/WiFiScan.h deleted file mode 100644 index a48aab95..00000000 --- a/include/event_handlers/WiFiScan.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -namespace OpenShock::EventHandlers::WiFiScan { - void Init(); - void Deinit(); -} // namespace OpenShock::EventHandlers::WiFiScan diff --git a/src/event_handlers/WiFiScan.cpp b/src/event_handlers/WiFiScan.cpp deleted file mode 100644 index 1a1d00a7..00000000 --- a/src/event_handlers/WiFiScan.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "event_handlers/WiFiScan.h" - -#include "CaptivePortal.h" -#include "config/Config.h" -#include "serialization/WSLocal.h" -#include "wifi/WiFiManager.h" -#include "wifi/WiFiNetwork.h" -#include "wifi/WiFiScanManager.h" -#include "wifi/WiFiScanStatus.h" - -const char* const TAG = "WiFiScanEventHandlers"; - -static std::uint64_t s_scanStatusChangedHandle = 0; -static std::uint64_t s_scanNetworkDiscoveredHandle = 0; - -using namespace OpenShock; - -void _scanStatusChangedHandler(OpenShock::WiFiScanStatus status) { - Serialization::Local::SerializeWiFiScanStatusChangedEvent(status, CaptivePortal::BroadcastMessageBIN); -} - -void _scanNetworkDiscoveredHandler(const wifi_ap_record_t* record) { - std::uint8_t id = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); - WiFiNetwork network(record, id); - - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {network}, CaptivePortal::BroadcastMessageBIN); -} - -void OpenShock::EventHandlers::WiFiScan::Init() { - s_scanStatusChangedHandle = WiFiScanManager::RegisterStatusChangedHandler(_scanStatusChangedHandler); - s_scanNetworkDiscoveredHandle = WiFiScanManager::RegisterNetworkDiscoveryHandler(_scanNetworkDiscoveredHandler); -} - -void OpenShock::EventHandlers::WiFiScan::Deinit() { - WiFiScanManager::UnregisterStatusChangedHandler(s_scanStatusChangedHandle); - WiFiScanManager::UnregisterNetworkDiscoveredHandler(s_scanNetworkDiscoveredHandle); -} diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 23949241..6a1af35d 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -260,6 +260,9 @@ void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { // Sort the networks by RSSI std::sort(s_wifiNetworks.begin(), s_wifiNetworks.end(), [](const WiFiNetwork& a, const WiFiNetwork& b) { return a.rssi > b.rssi; }); } + + // Send the scan status changed event + Serialization::Local::SerializeWiFiScanStatusChangedEvent(status, CaptivePortal::BroadcastMessageBIN); } void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { std::uint8_t credsId = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); From 66427bc27e87157e39def835631b8fad3d1e7358 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Mon, 22 Jan 2024 17:29:13 +0100 Subject: [PATCH 146/147] Reduce allocations for vector construction [Optimization] --- include/StringView.h | 4 +- include/config/internal/utils.h | 4 +- include/radio/rmt/internal/Shared.h | 1 + include/serialization/WSLocal.h | 3 +- include/wifi/WiFiScanManager.h | 6 +-- src/CaptivePortalInstance.cpp | 2 +- src/OtaUpdateManager.cpp | 5 ++- src/config/WiFiConfig.cpp | 2 + src/serial/SerialInputHandler.cpp | 2 +- src/serialization/WSLocal.cpp | 19 +++++++- src/wifi/WiFiManager.cpp | 69 +++++++++++++++++------------ src/wifi/WiFiScanManager.cpp | 30 ++++++++----- 12 files changed, 94 insertions(+), 53 deletions(-) diff --git a/include/StringView.h b/include/StringView.h index a0be9732..959afe06 100644 --- a/include/StringView.h +++ b/include/StringView.h @@ -201,7 +201,7 @@ namespace OpenShock { for (const char* ptr = _ptrBeg; ptr < _ptrEnd; ++ptr) { if (predicate(*ptr)) { if (start != nullptr) { - result.push_back(StringView(start, ptr)); + result.emplace_back(StringView(start, ptr)); start = nullptr; } } else if (start == nullptr) { @@ -210,7 +210,7 @@ namespace OpenShock { } if (start != nullptr) { - result.push_back(StringView(start, _ptrEnd)); + result.emplace_back(StringView(start, _ptrEnd)); } return result; diff --git a/include/config/internal/utils.h b/include/config/internal/utils.h index c48d587b..1051c3be 100644 --- a/include/config/internal/utils.h +++ b/include/config/internal/utils.h @@ -27,7 +27,7 @@ namespace OpenShock::Config::Internal::Utils { for (auto fbsItem : *fbsVec) { T item; if (item.FromFlatbuffers(fbsItem)) { - vec.push_back(std::move(item)); + vec.emplace_back(std::move(item)); } } } @@ -60,7 +60,7 @@ namespace OpenShock::Config::Internal::Utils { cJSON_ArrayForEach(jsonItem, jsonArray) { T item; if (item.FromJSON(jsonItem)) { - vec.push_back(std::move(item)); + vec.emplace_back(std::move(item)); } } diff --git a/include/radio/rmt/internal/Shared.h b/include/radio/rmt/internal/Shared.h index f83de246..7969b158 100644 --- a/include/radio/rmt/internal/Shared.h +++ b/include/radio/rmt/internal/Shared.h @@ -14,6 +14,7 @@ namespace OpenShock::Rmt::Internal { static_assert(N > 0, "N must be greater than 0"); static_assert(N < std::numeric_limits::digits, "N must be less or equal to the number of bits in T"); + pulses.reserve(pulses.size() + N); for (std::int64_t bit_pos = N - 1; bit_pos >= 0; --bit_pos) { pulses.push_back((data >> bit_pos) & 1 ? rmtOne : rmtZero); } diff --git a/include/serialization/WSLocal.h b/include/serialization/WSLocal.h index 1fadbf16..50961f34 100644 --- a/include/serialization/WSLocal.h +++ b/include/serialization/WSLocal.h @@ -15,5 +15,6 @@ namespace OpenShock::Serialization::Local { bool SerializeErrorMessage(const char* message, Common::SerializationCallbackFn callback); bool SerializeReadyMessage(const WiFiNetwork* connectedNetwork, bool accountLinked, Common::SerializationCallbackFn callback); bool SerializeWiFiScanStatusChangedEvent(OpenShock::WiFiScanStatus status, Common::SerializationCallbackFn callback); - bool SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, std::vector networks, Common::SerializationCallbackFn callback); + bool SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, const WiFiNetwork& network, Common::SerializationCallbackFn callback); + bool SerializeWiFiNetworksEvent(Types::WifiNetworkEventType eventType, const std::vector& networks, Common::SerializationCallbackFn callback); } // namespace OpenShock::Serialization::Local diff --git a/include/wifi/WiFiScanManager.h b/include/wifi/WiFiScanManager.h index 908342b8..4c1173c1 100644 --- a/include/wifi/WiFiScanManager.h +++ b/include/wifi/WiFiScanManager.h @@ -16,11 +16,11 @@ namespace OpenShock::WiFiScanManager { bool AbortScan(); typedef std::function StatusChangedHandler; - typedef std::function NetworkDiscoveryHandler; + typedef std::function& networkRecords)> NetworksDiscoveredHandler; std::uint64_t RegisterStatusChangedHandler(const StatusChangedHandler& handler); void UnregisterStatusChangedHandler(std::uint64_t id); - std::uint64_t RegisterNetworkDiscoveryHandler(const NetworkDiscoveryHandler& handler); - void UnregisterNetworkDiscoveredHandler(std::uint64_t id); + std::uint64_t RegisterNetworksDiscoveredHandler(const NetworksDiscoveredHandler& handler); + void UnregisterNetworksDiscoveredHandler(std::uint64_t id); } // namespace OpenShock::WiFiScanManager diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index efc7c267..13e8ed4a 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -162,7 +162,7 @@ void CaptivePortalInstance::handleWebSocketClientConnected(std::uint8_t socketId // Send all previously scanned wifi networks auto networks = OpenShock::WiFiManager::GetDiscoveredWiFiNetworks(); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {networks}, std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); + Serialization::Local::SerializeWiFiNetworksEvent(Serialization::Types::WifiNetworkEventType::Discovered, networks, std::bind(&CaptivePortalInstance::sendMessageBIN, this, socketId, std::placeholders::_1, std::placeholders::_2)); } void CaptivePortalInstance::handleWebSocketClientDisconnected(std::uint8_t socketId) { diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index eb2b4c67..c95e9e13 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -402,7 +402,10 @@ bool _tryGetStringList(StringView url, std::vector& list) { OpenShock::StringView data = response.data; - for (auto line : data.splitLines()) { + auto lines = data.splitLines(); + list.reserve(lines.size()); + + for (auto line : lines) { line = line.trim(); if (line.isNullOrEmpty()) { diff --git a/src/config/WiFiConfig.cpp b/src/config/WiFiConfig.cpp index fc7769b2..bddcb246 100644 --- a/src/config/WiFiConfig.cpp +++ b/src/config/WiFiConfig.cpp @@ -32,6 +32,8 @@ bool WiFiConfig::FromFlatbuffers(const Serialization::Configuration::WiFiConfig* flatbuffers::Offset WiFiConfig::ToFlatbuffers(flatbuffers::FlatBufferBuilder& builder, bool withSensitiveData) const { std::vector> fbsCredentialsList; + fbsCredentialsList.reserve(credentialsList.size()); + for (auto& credentials : credentialsList) { fbsCredentialsList.emplace_back(credentials.ToFlatbuffers(builder, withSensitiveData)); } diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index b0500969..3b17ccb5 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -209,7 +209,7 @@ void _handleNetworksCommand(char* arg, std::size_t argLength) { ESP_LOGI(TAG, "Adding network \"%s\" to config, id=%u", cred.ssid.c_str(), cred.id); - creds.push_back(std::move(cred)); + creds.emplace_back(std::move(cred)); } if (!OpenShock::Config::SetWiFiCredentials(creds)) { diff --git a/src/serialization/WSLocal.cpp b/src/serialization/WSLocal.cpp index 62eb1fc0..68baff7c 100644 --- a/src/serialization/WSLocal.cpp +++ b/src/serialization/WSLocal.cpp @@ -104,10 +104,27 @@ bool Local::SerializeWiFiScanStatusChangedEvent(OpenShock::WiFiScanStatus status return callback(span.data(), span.size()); } -bool Local::SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, std::vector networks, Common::SerializationCallbackFn callback) { +bool Local::SerializeWiFiNetworkEvent(Types::WifiNetworkEventType eventType, const WiFiNetwork& network, Common::SerializationCallbackFn callback) { + flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly + + auto networkOffset = _createWiFiNetwork(builder, network); + + auto wrapperOffset = Local::CreateWifiNetworkEvent(builder, eventType, builder.CreateVector(&networkOffset, 1)); // Resulting vector will have 1 element + + auto msg = Local::CreateDeviceToLocalMessage(builder, Local::DeviceToLocalMessagePayload::WifiNetworkEvent, wrapperOffset.Union()); + + builder.Finish(msg); + + auto span = builder.GetBufferSpan(); + + return callback(span.data(), span.size()); +} + +bool Local::SerializeWiFiNetworksEvent(Types::WifiNetworkEventType eventType, const std::vector& networks, Common::SerializationCallbackFn callback) { flatbuffers::FlatBufferBuilder builder(256); // TODO: Profile this and adjust the size accordingly std::vector> fbsNetworks; + fbsNetworks.reserve(networks.size()); for (const auto& network : networks) { fbsNetworks.push_back(_createWiFiNetwork(builder, network)); diff --git a/src/wifi/WiFiManager.cpp b/src/wifi/WiFiManager.cpp index 6a1af35d..04e1890e 100644 --- a/src/wifi/WiFiManager.cpp +++ b/src/wifi/WiFiManager.cpp @@ -178,7 +178,7 @@ bool _authenticate(const WiFiNetwork& net, const std::string& password) { return false; } - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Saved, {net}, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Saved, net, CaptivePortal::BroadcastMessageBIN); return _connect(net.ssid, password); } @@ -202,7 +202,7 @@ void _evWiFiConnected(arduino_event_t* event) { ESP_LOGI(TAG, "Connected to network %s (" BSSID_FMT ")", reinterpret_cast(info.ssid), BSSID_ARG(info.bssid)); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Connected, {*it}, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Connected, *it, CaptivePortal::BroadcastMessageBIN); } void _evWiFiGotIP(arduino_event_t* event) { const auto& info = event->event_info.got_ip; @@ -247,7 +247,7 @@ void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { for (auto it = s_wifiNetworks.begin(); it != s_wifiNetworks.end();) { if (it->scansMissed++ > 3) { ESP_LOGV(TAG, "Network %s (" BSSID_FMT ") has not been seen in 3 scans, removing from list", it->ssid, BSSID_ARG(it->bssid)); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Lost, {*it}, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Lost, *it, CaptivePortal::BroadcastMessageBIN); it = s_wifiNetworks.erase(it); } else { ++it; @@ -264,32 +264,44 @@ void _evWiFiScanStatusChanged(OpenShock::WiFiScanStatus status) { // Send the scan status changed event Serialization::Local::SerializeWiFiScanStatusChangedEvent(status, CaptivePortal::BroadcastMessageBIN); } -void _evWiFiNetworkDiscovery(const wifi_ap_record_t* record) { - std::uint8_t credsId = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); +void _evWiFiNetworksDiscovery(const std::vector& records) { + std::vector updatedNetworks; + std::vector discoveredNetworks; - auto it = _findNetworkByBSSID(record->bssid); - if (it != s_wifiNetworks.end()) { - // Update the network - memcpy(it->ssid, record->ssid, sizeof(it->ssid)); - it->channel = record->primary; - it->rssi = record->rssi; - it->authMode = record->authmode; - it->credentialsID = credsId; // TODO: I don't understand why I need to set this here, but it seems to fix a bug where the credentials ID is not set correctly - it->scansMissed = 0; + for (const wifi_ap_record_t* record : records) { + std::uint8_t credsId = Config::GetWiFiCredentialsIDbySSID(reinterpret_cast(record->ssid)); - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Updated, {*it}, CaptivePortal::BroadcastMessageBIN); - ESP_LOGV(TAG, "Updated network %s (" BSSID_FMT ") with new scan info", it->ssid, BSSID_ARG(it->bssid)); + auto it = _findNetworkByBSSID(record->bssid); + if (it != s_wifiNetworks.end()) { + // Update the network + memcpy(it->ssid, record->ssid, sizeof(it->ssid)); + it->channel = record->primary; + it->rssi = record->rssi; + it->authMode = record->authmode; + it->credentialsID = credsId; // TODO: I don't understand why I need to set this here, but it seems to fix a bug where the credentials ID is not set correctly + it->scansMissed = 0; - return; - } + updatedNetworks.push_back(*it); + ESP_LOGV(TAG, "Updated network %s (" BSSID_FMT ") with new scan info", it->ssid, BSSID_ARG(it->bssid)); - WiFiNetwork network(record->ssid, record->bssid, record->primary, record->rssi, record->authmode, credsId); + continue; + } - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Discovered, {network}, CaptivePortal::BroadcastMessageBIN); - ESP_LOGV(TAG, "Discovered new network %s (" BSSID_FMT ")", network.ssid, BSSID_ARG(network.bssid)); + WiFiNetwork network(record->ssid, record->bssid, record->primary, record->rssi, record->authmode, credsId); - // Insert the network into the list of networks sorted by RSSI - s_wifiNetworks.insert(std::lower_bound(s_wifiNetworks.begin(), s_wifiNetworks.end(), network, [](const WiFiNetwork& a, const WiFiNetwork& b) { return a.rssi > b.rssi; }), std::move(network)); + discoveredNetworks.push_back(network); + ESP_LOGV(TAG, "Discovered new network %s (" BSSID_FMT ")", network.ssid, BSSID_ARG(network.bssid)); + + // Insert the network into the list of networks sorted by RSSI + s_wifiNetworks.insert(std::lower_bound(s_wifiNetworks.begin(), s_wifiNetworks.end(), network, [](const WiFiNetwork& a, const WiFiNetwork& b) { return a.rssi > b.rssi; }), std::move(network)); + } + + if (!updatedNetworks.empty()) { + Serialization::Local::SerializeWiFiNetworksEvent(Serialization::Types::WifiNetworkEventType::Updated, updatedNetworks, CaptivePortal::BroadcastMessageBIN); + } + if (!discoveredNetworks.empty()) { + Serialization::Local::SerializeWiFiNetworksEvent(Serialization::Types::WifiNetworkEventType::Discovered, discoveredNetworks, CaptivePortal::BroadcastMessageBIN); + } } esp_err_t set_esp_interface_dns(esp_interface_t interface, IPAddress main_dns, IPAddress backup_dns, IPAddress fallback_dns); @@ -300,7 +312,7 @@ bool WiFiManager::Init() { WiFi.onEvent(_evWiFiGotIP6, ARDUINO_EVENT_WIFI_STA_GOT_IP6); WiFi.onEvent(_evWiFiDisconnected, ARDUINO_EVENT_WIFI_STA_DISCONNECTED); WiFiScanManager::RegisterStatusChangedHandler(_evWiFiScanStatusChanged); - WiFiScanManager::RegisterNetworkDiscoveryHandler(_evWiFiNetworkDiscovery); + WiFiScanManager::RegisterNetworksDiscoveredHandler(_evWiFiNetworksDiscovery); if (!WiFiScanManager::Init()) { ESP_LOGE(TAG, "Failed to initialize WiFiScanManager"); @@ -322,8 +334,7 @@ bool WiFiManager::Init() { } } - - if (set_esp_interface_dns(ESP_IF_WIFI_STA, IPAddress(1,1,1,1), IPAddress(8,8,8,8), IPAddress(9,9,9,9)) != ESP_OK) { + if (set_esp_interface_dns(ESP_IF_WIFI_STA, IPAddress(1, 1, 1, 1), IPAddress(8, 8, 8, 8), IPAddress(9, 9, 9, 9)) != ESP_OK) { ESP_LOGE(TAG, "Failed to set DNS servers"); return false; } @@ -366,7 +377,7 @@ bool WiFiManager::Forget(const char* ssid) { // Remove the credentials from the config if (Config::RemoveWiFiCredentials(credsId)) { it->credentialsID = 0; - Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Removed, {*it}, CaptivePortal::BroadcastMessageBIN); + Serialization::Local::SerializeWiFiNetworkEvent(Serialization::Types::WifiNetworkEventType::Removed, *it, CaptivePortal::BroadcastMessageBIN); } return true; @@ -488,8 +499,8 @@ bool WiFiManager::GetIPv6Address(char* ipAddress) { return false; } - IPv6Address ip = WiFi.localIPv6(); - const std::uint8_t* ipPtr = ip; // Using the implicit conversion operator of IPv6Address + IPv6Address ip = WiFi.localIPv6(); + const std::uint8_t* ipPtr = ip; // Using the implicit conversion operator of IPv6Address snprintf(ipAddress, IPV6ADDR_FMT_LEN + 1, IPV6ADDR_FMT, IPV6ADDR_ARG(ipPtr)); return true; diff --git a/src/wifi/WiFiScanManager.cpp b/src/wifi/WiFiScanManager.cpp index f757fc59..7998cadb 100644 --- a/src/wifi/WiFiScanManager.cpp +++ b/src/wifi/WiFiScanManager.cpp @@ -26,7 +26,7 @@ static TaskHandle_t s_scanTaskHandle = nullptr; static SemaphoreHandle_t s_scanTaskMutex = xSemaphoreCreateMutex(); static std::uint8_t s_currentChannel = 0; static std::map s_statusChangedHandlers; -static std::map s_networkDiscoveredHandlers; +static std::map s_networksDiscoveredHandlers; bool _notifyTask(WiFiScanTaskNotificationFlags flags) { xSemaphoreTake(s_scanTaskMutex, portMAX_DELAY); @@ -168,6 +168,9 @@ void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { return; } + std::vector networkRecords; + networkRecords.reserve(numNetworks); + for (std::int16_t i = 0; i < numNetworks; i++) { wifi_ap_record_t* record = reinterpret_cast(WiFi.getScanInfoByIndex(i)); if (record == nullptr) { @@ -175,9 +178,12 @@ void _evScanCompleted(arduino_event_id_t event, arduino_event_info_t info) { return; } - for (auto& it : s_networkDiscoveredHandlers) { - it.second(record); - } + networkRecords.push_back(record); + } + + // Notify the networks discovered handlers + for (auto& it : s_networksDiscoveredHandlers) { + it.second(networkRecords); } // Notify the scan task that we're done @@ -268,16 +274,16 @@ void WiFiScanManager::UnregisterStatusChangedHandler(std::uint64_t handle) { } } -std::uint64_t WiFiScanManager::RegisterNetworkDiscoveryHandler(const WiFiScanManager::NetworkDiscoveryHandler& handler) { - static std::uint64_t nextHandle = 0; - std::uint64_t handle = nextHandle++; - s_networkDiscoveredHandlers[handle] = handler; +std::uint64_t WiFiScanManager::RegisterNetworksDiscoveredHandler(const WiFiScanManager::NetworksDiscoveredHandler& handler) { + static std::uint64_t nextHandle = 0; + std::uint64_t handle = nextHandle++; + s_networksDiscoveredHandlers[handle] = handler; return handle; } -void WiFiScanManager::UnregisterNetworkDiscoveredHandler(std::uint64_t handle) { - auto it = s_networkDiscoveredHandlers.find(handle); +void WiFiScanManager::UnregisterNetworksDiscoveredHandler(std::uint64_t handle) { + auto it = s_networksDiscoveredHandlers.find(handle); - if (it != s_networkDiscoveredHandlers.end()) { - s_networkDiscoveredHandlers.erase(it); + if (it != s_networksDiscoveredHandlers.end()) { + s_networksDiscoveredHandlers.erase(it); } } From 647516157183ba13b67db27a212bcf065e8ecbf6 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Mon, 22 Jan 2024 17:37:16 +0100 Subject: [PATCH 147/147] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aae75537..146213f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Version 1.1.0-rc.6 Release Notes + +Bugfixes: + +- Reduced latency, allocations, and network traffic for reporting wifi network scan results, making the networks instantly available in the frontend and improving the reliability of the captive portal. + # Version 1.1.0-rc.5 Release Notes Bugfixes: