diff --git a/config.xml b/config.xml index 45f6f86385..45838a5aa0 100644 --- a/config.xml +++ b/config.xml @@ -78,6 +78,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hooks/post-process.js b/hooks/post-process.js index 16f310469e..188e3c68bd 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -25,10 +25,17 @@ fs.copyFileSync(gradleFilePath, androidGradleFilePath); // directories that are required later in the build. Keep the generated tree and // only overlay this project's custom resources on top of it. copyDirRecursively(localResPath, resPath); +// Cordova can retain plugin Java from an earlier install during prepare. +// Keep the System plugin's icon map in sync with the launcher resources. +copyDirRecursively( + path.resolve(__dirname, '../src/plugins/system/android'), + path.resolve(__dirname, '../platforms/android/app/src/main/java') +); enableLegacyJni(); enableStaticContext(); removeLegacyKeyboardWorkaround(); patchTargetSdkVersion(); +stripLauncherFilterFromMainActivity(); function getPackageName() { const configPath = path.resolve(__dirname, '../config.xml'); @@ -65,6 +72,43 @@ function getTmpDir() { } } +/** + * Removes the MAIN/LAUNCHER intent-filter from MainActivity in the generated + * AndroidManifest. The launcher role is handled by activity-aliases instead + * (see config.xml), so that switching app icons at runtime only toggles aliases + * and never disables the running MainActivity component (which would otherwise + * force-stop/restart the app). + */ +function stripLauncherFilterFromMainActivity() { + const prefix = execSync('npm prefix').toString().trim(); + const manifestPath = path.join( + prefix, + 'platforms/android/app/src/main/AndroidManifest.xml' + ); + + if (!fs.existsSync(manifestPath)) { + console.warn('[Cordova Hook] ⚠️ AndroidManifest.xml not found'); + return; + } + + let content = fs.readFileSync(manifestPath, 'utf-8'); + const updated = content.replace( + /(]*\bname="MainActivity"[^>]*>)\s*]*>\s*]*\/>\s*]*\/>\s*<\/intent-filter>/, + '$1' + ); + + if (updated !== content) { + fs.writeFileSync(manifestPath, updated, 'utf-8'); + console.log( + '[Cordova Hook] ✅ Removed launcher intent-filter from MainActivity' + ); + } else { + console.log( + '[Cordova Hook] ✅ Launcher intent-filter already removed, skipping' + ); + } +} + function patchTargetSdkVersion() { const prefix = execSync('npm prefix').toString().trim(); const gradleFile = path.join(prefix, 'platforms/android/app/build.gradle'); diff --git a/package-lock.json b/package-lock.json index 4cdb90b9e3..1115c34a9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4125,13 +4125,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true, - "license": "MIT" - }, "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", @@ -4679,34 +4672,6 @@ "node": ">=10" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/name-from-folder": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-4.0.0.tgz", @@ -5720,16 +5685,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", @@ -5743,29 +5698,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -6136,9 +6068,9 @@ "peer": true }, "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6607,53 +6539,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/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, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -6675,33 +6560,6 @@ "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -6779,61 +6637,6 @@ "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "license": "MIT" }, - "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, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/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, - "license": "MIT" - }, - "node_modules/ansi-align/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -6844,16 +6647,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -6909,48 +6702,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "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==", "license": "Python-2.0" }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -6960,16 +6717,6 @@ "node": ">=8" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -6989,43 +6736,6 @@ "node": "*" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/autoprefixer": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", @@ -7069,23 +6779,6 @@ "integrity": "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==", "license": "MIT" }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, "node_modules/babel-loader": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", @@ -7171,16 +6864,6 @@ "node": ">=6.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -7253,227 +6936,69 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", - "dev": true, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.15.1", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "big-integer": "1.6.x" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 5.10.0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/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, - "license": "MIT" - }, - "node_modules/boxen/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/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, - "license": "MIT", - "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/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "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" - } - ], - "license": "MIT", + "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" + } + ], + "license": "MIT", "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -7509,23 +7034,6 @@ "node": ">=4.0" } }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cacache": { "version": "20.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", @@ -7547,82 +7055,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7666,13 +7098,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", @@ -7709,13 +7134,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -7765,23 +7183,6 @@ "node": ">=6.0" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -7796,39 +7197,6 @@ "node": ">=0.2.5" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true, - "license": "ISC" - }, "node_modules/cli/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7896,19 +7264,6 @@ "node": ">=20" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cmd-shim": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-8.0.0.tgz", @@ -7918,16 +7273,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/codemirror": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", @@ -7993,19 +7338,6 @@ "resolved": "src/plugins/pluginContext", "link": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -8024,86 +7356,6 @@ "node": ">= 18" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression/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" - } - ], - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8111,60 +7363,6 @@ "dev": true, "license": "MIT" }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/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, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -8191,57 +7389,6 @@ "date-now": "^0.1.4" } }, - "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, - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/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" - } - ], - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -8249,23 +7396,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "dev": true, - "license": "MIT" - }, "node_modules/cordova": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/cordova/-/cordova-13.0.0.tgz", @@ -8576,61 +7706,6 @@ "resolved": "src/plugins/websocket", "link": true }, - "node_modules/cordova-serve": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.1.tgz", - "integrity": "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^3.0.0", - "compression": "^1.7.4", - "express": "^4.17.1", - "open": "^7.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10", - "npm": ">= 5.6.0" - } - }, - "node_modules/cordova-serve/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cordova-serve/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/cordova-serve/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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/cordova/node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -8833,19 +7908,6 @@ "node": ">=4" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cytoscape": { "version": "3.33.3", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", @@ -9354,19 +8416,6 @@ "lodash-es": "^4.17.21" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -9379,32 +8428,6 @@ "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "license": "MIT" }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -9435,19 +8458,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", @@ -9476,23 +8486,6 @@ "node": ">=0.12" } }, - "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, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true, - "license": "MIT" - }, "node_modules/delaunator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", @@ -9502,73 +8495,13 @@ "robust-predicates": "^3.0.2" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "license": "MIT", "engines": { - "node": ">=0.4.0" - } - }, - "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, - "license": "MIT" - }, - "node_modules/dep-graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz", - "integrity": "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "underscore": "1.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dep-graph/node_modules/underscore": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz", - "integrity": "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/detect-libc": { @@ -9693,52 +8626,12 @@ "node": ">=8" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/editor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.357", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.357.tgz", @@ -9800,37 +8693,6 @@ "node": ">=14" } }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/endent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", @@ -9883,13 +8745,6 @@ "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, - "license": "MIT" - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -9900,16 +8755,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -9926,19 +8771,6 @@ "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-toolkit": { "version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", @@ -9958,23 +8790,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -9987,21 +8802,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -10015,42 +8815,6 @@ "node": ">=4" } }, - "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, - "license": "BSD-2-Clause", - "peer": 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, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": 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", @@ -10071,16 +8835,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -10140,156 +8894,6 @@ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, - "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.15.1", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/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" - } - ], - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/extsprintf": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", @@ -10378,29 +8982,6 @@ } } }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/filesize": { "version": "11.0.17", "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.17.tgz", @@ -10422,42 +9003,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10485,64 +9030,6 @@ "flat": "cli.js" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -10584,31 +9071,6 @@ } } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -10652,75 +9114,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10762,45 +9155,6 @@ "node": "*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10813,16 +9167,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", @@ -10852,32 +9196,6 @@ "node": ">= 6" } }, - "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, - "license": "MIT", - "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, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10898,55 +9216,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -11001,55 +9270,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "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/har-validator/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, - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11060,36 +9280,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "ISC" - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -11184,27 +9374,6 @@ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -11218,22 +9387,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -11256,16 +9409,6 @@ "node": ">=10.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, - "license": "MIT", - "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", @@ -11341,20 +9484,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "license": "MIT", "funding": { "type": "github", @@ -11370,23 +9503,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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true, - "license": "ISC" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -11414,320 +9530,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/init-package-json": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz", - "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/init-package-json/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/insight": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", - "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "async": "^2.6.2", - "chalk": "^4.1.1", - "conf": "^10.0.1", - "inquirer": "^6.3.1", - "lodash.debounce": "^4.0.8", - "os-name": "^4.0.1", - "request": "^2.88.0", - "tough-cookie": "^4.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/insight/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/insight/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/insight/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==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -11746,16 +9548,6 @@ "node": ">= 12" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11776,19 +9568,6 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", @@ -11804,22 +9583,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -11851,56 +9614,19 @@ "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, + "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==", "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12.0" } }, - "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, - "license": "MIT" - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "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==", - "license": "MIT", - "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==", + "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==", "license": "MIT", "engines": { "node": ">=8" @@ -11957,26 +9683,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true, - "license": "MIT" - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -12001,13 +9707,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -12081,13 +9780,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -12158,13 +9850,6 @@ "node": "*" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", @@ -12174,13 +9859,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -12188,13 +9866,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/json-stringify-nice": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", @@ -12204,13 +9875,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -12230,19 +9894,6 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -12252,32 +9903,6 @@ ], "license": "MIT" }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsprim/node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -12318,34 +9943,11 @@ "katex": "cli.js" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/khroma": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", @@ -12715,20 +10317,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loud-rejection": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", - "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -12739,16 +10327,6 @@ "get-func-name": "^2.0.1" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "11.5.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", @@ -12758,19 +10336,6 @@ "node": "20 || >=22" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -12904,55 +10469,12 @@ "node": ">= 18" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", - "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", - "dev": true, - "license": "MIT", - "bin": { - "md5-file": "cli.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13009,16 +10531,6 @@ "node": ">= 20" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -13044,19 +10556,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -13091,16 +10590,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.10.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", @@ -13137,28 +10626,18 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minimizer-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.0.tgz", + "integrity": "sha512-2//60T4S0X1Ug/dqLDOgDaGlZsN1Lv8hf8oB0NOV/KIHSaXlPwXBBIbim79dE2Z7NEs52ES8YHoSv6Lmsk+XNg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.31", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" + "schema-utils": "^4.3.3", + "terser": "^5.51.0" }, "engines": { "node": ">= 10.13.0" @@ -13174,6 +10653,9 @@ "@minify-html/node": { "optional": true }, + "@napi-rs/image": { + "optional": true + }, "@swc/core": { "optional": true }, @@ -13198,12 +10680,21 @@ "html-minifier-terser": { "optional": true }, + "imagemin": { + "optional": true + }, "lightningcss": { "optional": true }, "postcss": { "optional": true }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, "uglify-js": { "optional": true } @@ -13288,30 +10779,6 @@ "node": ">=8" } }, - "node_modules/minipass-json-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", - "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", - "dev": true, - "license": "MIT", - "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, - "license": "ISC", - "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", @@ -13800,13 +11267,6 @@ "mustache": "bin/mustache" } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true, - "license": "ISC" - }, "node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", @@ -13908,61 +11368,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13973,16 +11378,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm-bundled": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", @@ -14126,63 +11521,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/objectorarray": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", @@ -14203,29 +11541,6 @@ "node": ">=12.20.0" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14251,70 +11566,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -14359,32 +11610,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/package-manager-detector": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", @@ -14480,16 +11705,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -14560,13 +11775,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "dev": true, - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14593,13 +11801,6 @@ "node": "*" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14619,95 +11820,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/plist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", @@ -14895,16 +12007,6 @@ "dev": true, "license": "MIT" }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", @@ -14976,37 +12078,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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, - "license": "ISC" - }, - "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, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", - "dev": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, "node_modules/properties-parser": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.6.0.tgz", @@ -15017,44 +12088,6 @@ "node": ">= 0.3.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -15074,41 +12107,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -15145,49 +12143,10 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, "license": "MIT", "dependencies": { @@ -15258,66 +12217,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-chunk": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", - "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "with-open-file": "^0.1.6" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/read-cmd-shim": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-6.0.0.tgz", @@ -15327,118 +12226,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/read-package-json": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.2.tgz", - "integrity": "sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-package-json-fast/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-package-json/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, - "license": "MIT" - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "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/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -15506,32 +12293,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -15552,73 +12313,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/request/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15675,63 +12369,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -15742,94 +12379,24 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rolldown": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", + "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@oxc-project/types": "=0.142.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/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, - "license": "MIT" - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, - "node_modules/rolldown": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", - "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.142.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" + "rolldown": "bin/cli.mjs" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -15864,16 +12431,6 @@ "points-on-path": "^0.2.1" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15903,26 +12460,6 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -16032,61 +12569,6 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -16097,42 +12579,12 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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, - "license": "ISC" - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16154,82 +12606,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -16350,28 +12726,6 @@ "node": ">=0.10.0" } }, - "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, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-correct/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, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -16405,32 +12759,6 @@ "node": ">=0.2.4" } }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", @@ -16450,16 +12778,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", @@ -16525,16 +12843,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -16689,9 +12997,9 @@ } }, "node_modules/terser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", - "integrity": "sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==", + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "dev": true, "license": "BSD-2-Clause", "peer": true, @@ -16716,13 +13024,6 @@ "license": "MIT", "peer": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -16774,16 +13075,6 @@ "node": ">=14.14" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16796,37 +13087,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/treeverse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", @@ -16899,26 +13159,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", @@ -16929,56 +13169,6 @@ "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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -17015,13 +13205,6 @@ "dev": true, "license": "MIT" }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true, - "license": "MIT" - }, "node_modules/undici": { "version": "6.27.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", @@ -17082,26 +13265,6 @@ "node": ">=4" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -17114,26 +13277,6 @@ "node": ">=8" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -17175,48 +13318,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -17237,35 +13338,12 @@ "requires-port": "^1.0.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "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==", "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", @@ -17285,28 +13363,6 @@ "integrity": "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==", "license": "Apache-2.0" }, - "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, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-license/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, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", @@ -17325,38 +13381,6 @@ "@sphinxxxx/color-conversion": "^2.2.2" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vite": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", @@ -17636,9 +13660,9 @@ "license": "MIT" }, "node_modules/webpack": { - "version": "5.109.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", - "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", + "version": "5.110.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", "dev": true, "license": "MIT", "peer": true, @@ -17653,11 +13677,10 @@ "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", "events": "^3.2.0", "graceful-fs": "^4.2.11", "mime-db": "^1.54.0", - "minimizer-webpack-plugin": "^5.6.1", + "minimizer-webpack-plugin": "^5.7.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", @@ -17733,317 +13756,123 @@ "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==", + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true, - "license": "ISC", + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wide-align/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, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/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, - "license": "MIT" + "license": "ISC" }, - "node_modules/wide-align/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==", + "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==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/wide-align/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==", + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/widest-line/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, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/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, - "license": "MIT" - }, - "node_modules/widest-line/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/with-open-file": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", - "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0", - "p-try": "^2.1.0", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?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, - "license": "ISC" - }, - "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==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" + "node": ">=8.0" } }, "node_modules/y18n": { @@ -18147,974 +13976,6 @@ "xml2js": "0.4.23" } }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "MIT" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/cordova/-/cordova-11.0.0.tgz", - "integrity": "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "configstore": "^5.0.1", - "cordova-common": "^4.0.2", - "cordova-create": "^4.0.0", - "cordova-lib": "^11.0.0", - "editor": "^1.0.0", - "execa": "^5.1.1", - "fs-extra": "^10.0.0", - "insight": "^0.11.1", - "loud-rejection": "^2.2.0", - "nopt": "^5.0.0", - "semver": "^7.3.5", - "systeminformation": "^5.9.17", - "update-notifier": "^5.1.0" - }, - "bin": { - "cordova": "bin/cordova" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-app-hello-world": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", - "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==", - "dev": true, - "license": "Apache-2.0" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-4.1.0.tgz", - "integrity": "sha512-sYfOSfpYGQOmUDlsARUbpT/EvVKT/E+GI3zwTXt+C6DjZ7xs6ZQVHs3umHKSidjf9yVM2LLmvGFpGrGX7aGxug==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@netflix/nerror": "^1.1.3", - "ansi": "^0.3.1", - "bplist-parser": "^0.2.0", - "cross-spawn": "^7.0.1", - "elementtree": "^0.1.7", - "endent": "^1.4.1", - "fast-glob": "^3.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "plist": "^3.0.1", - "q": "^1.5.1", - "read-chunk": "^3.2.0", - "strip-bom": "^4.0.0", - "underscore": "^1.9.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-common/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-create": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-4.1.0.tgz", - "integrity": "sha512-8VQohB5w5WwuxurQJ+2L+lAFVhBr//kFvlxLOmF0P3SzTdfIU02pNalbOeLalC0DXD7rfBXJZOxJ+KSM5TOq+Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-app-hello-world": "^6.0.0", - "cordova-common": "^4.1.0", - "cordova-fetch": "^3.1.0", - "fs-extra": "^10.1.0", - "globby": "^11.1.0", - "import-fresh": "^3.3.0", - "isobject": "^4.0.0", - "npm-package-arg": "^8.1.5", - "path-is-inside": "^1.0.2", - "tmp": "^0.2.1", - "valid-identifier": "0.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-3.1.0.tgz", - "integrity": "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-common": "^4.1.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "^8.1.5", - "pacote": "^11.3.5", - "pify": "^5.0.0", - "resolve": "^1.22.1", - "semver": "^7.3.8", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10", - "npm": ">= 5.6.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-fetch/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/cordova-lib": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/cordova-lib/-/cordova-lib-11.1.0.tgz", - "integrity": "sha512-/XM+/wFag72bD4SNSxwX8b3OWatHNNlnmJpgb5pepp2Pobb957nWyR0GPwIkKyOyszdZesWM3Vv8uH9e2Z1k2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "cordova-common": "^4.1.0", - "cordova-fetch": "^3.1.0", - "cordova-serve": "^4.0.0", - "dep-graph": "^1.1.0", - "detect-indent": "^6.1.0", - "detect-newline": "^3.1.0", - "elementtree": "^0.1.7", - "execa": "^5.1.1", - "fs-extra": "^10.1.0", - "globby": "^11.1.0", - "init-package-json": "^2.0.5", - "md5-file": "^5.0.0", - "pify": "^5.0.0", - "semver": "^7.3.8", - "stringify-package": "^1.0.1", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">=12" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true, - "license": "MIT" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/endent": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.1.tgz", - "integrity": "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dedent": "^0.7.0", - "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "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" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "src/plugins/cordova-plugin-advanced-http/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "src/plugins/cordova-plugin-advanced-http/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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "src/plugins/cordova-plugin-buildinfo": { "version": "4.0.0", "dev": true, diff --git a/package.json b/package.json index f34c2faf1b..7e49faba2d 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ "com.foxdebug.acode.rk.exec.proot": {}, "cordova-plugin-iap": {}, "com.foxdebug.acode.rk.customtabs": {}, - "cordova-plugin-system": {}, "cordova-plugin-crashhandler": {}, "cordova-plugin-advanced-http": {}, - "cordova-plugin-acode-webview": {} + "cordova-plugin-acode-webview": {}, + "cordova-plugin-system": {} }, "platforms": [ "android" diff --git a/res/android/drawable/ic_acode_aurora_pulse_background.xml b/res/android/drawable/ic_acode_aurora_pulse_background.xml new file mode 100644 index 0000000000..8a22a85ce9 --- /dev/null +++ b/res/android/drawable/ic_acode_aurora_pulse_background.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_aurora_pulse_foreground.xml b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml new file mode 100644 index 0000000000..be024ec1ed --- /dev/null +++ b/res/android/drawable/ic_acode_aurora_pulse_foreground.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_blueprint_background.xml b/res/android/drawable/ic_acode_blueprint_background.xml new file mode 100644 index 0000000000..a5d145a4f7 --- /dev/null +++ b/res/android/drawable/ic_acode_blueprint_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_blueprint_foreground.xml b/res/android/drawable/ic_acode_blueprint_foreground.xml new file mode 100644 index 0000000000..cadd5f8c44 --- /dev/null +++ b/res/android/drawable/ic_acode_blueprint_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_midnight_circuit_background.xml b/res/android/drawable/ic_acode_midnight_circuit_background.xml new file mode 100644 index 0000000000..523498c8a9 --- /dev/null +++ b/res/android/drawable/ic_acode_midnight_circuit_background.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_midnight_circuit_foreground.xml b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml new file mode 100644 index 0000000000..f5a20b48e5 --- /dev/null +++ b/res/android/drawable/ic_acode_midnight_circuit_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_monochrome.xml b/res/android/drawable/ic_acode_monochrome.xml new file mode 100644 index 0000000000..7efafe6edf --- /dev/null +++ b/res/android/drawable/ic_acode_monochrome.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pixel_party_background.xml b/res/android/drawable/ic_acode_pixel_party_background.xml new file mode 100644 index 0000000000..885b6071b2 --- /dev/null +++ b/res/android/drawable/ic_acode_pixel_party_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pixel_party_foreground.xml b/res/android/drawable/ic_acode_pixel_party_foreground.xml new file mode 100644 index 0000000000..e4de7dcaa6 --- /dev/null +++ b/res/android/drawable/ic_acode_pixel_party_foreground.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pro_background.xml b/res/android/drawable/ic_acode_pro_background.xml new file mode 100644 index 0000000000..17de912b4f --- /dev/null +++ b/res/android/drawable/ic_acode_pro_background.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_pro_foreground.xml b/res/android/drawable/ic_acode_pro_foreground.xml new file mode 100644 index 0000000000..0681f914bd --- /dev/null +++ b/res/android/drawable/ic_acode_pro_foreground.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_solar_flare_background.xml b/res/android/drawable/ic_acode_solar_flare_background.xml new file mode 100644 index 0000000000..d087b0ef40 --- /dev/null +++ b/res/android/drawable/ic_acode_solar_flare_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_solar_flare_foreground.xml b/res/android/drawable/ic_acode_solar_flare_foreground.xml new file mode 100644 index 0000000000..f6dca5d8fe --- /dev/null +++ b/res/android/drawable/ic_acode_solar_flare_foreground.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_terminal_glow_background.xml b/res/android/drawable/ic_acode_terminal_glow_background.xml new file mode 100644 index 0000000000..36c8d69d38 --- /dev/null +++ b/res/android/drawable/ic_acode_terminal_glow_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/android/drawable/ic_acode_terminal_glow_foreground.xml b/res/android/drawable/ic_acode_terminal_glow_foreground.xml new file mode 100644 index 0000000000..ea4edbb646 --- /dev/null +++ b/res/android/drawable/ic_acode_terminal_glow_foreground.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml new file mode 100644 index 0000000000..6b8c715762 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml new file mode 100644 index 0000000000..6b8c715762 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_aurora_pulse_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml b/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml new file mode 100644 index 0000000000..6415762a4d --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_blueprint.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml new file mode 100644 index 0000000000..6415762a4d --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_blueprint_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml new file mode 100644 index 0000000000..5b709ba70f --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml new file mode 100644 index 0000000000..5b709ba70f --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_midnight_circuit_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml new file mode 100644 index 0000000000..a622de3912 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml new file mode 100644 index 0000000000..a622de3912 --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pixel_party_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pro.xml b/res/android/mipmap-anydpi-v26/ic_acode_pro.xml new file mode 100644 index 0000000000..0ba93a08ee --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pro.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml new file mode 100644 index 0000000000..0ba93a08ee --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_pro_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml new file mode 100644 index 0000000000..8d0f1caf5e --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml new file mode 100644 index 0000000000..8d0f1caf5e --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_solar_flare_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml new file mode 100644 index 0000000000..7f47bfab6a --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml new file mode 100644 index 0000000000..7f47bfab6a --- /dev/null +++ b/res/android/mipmap-anydpi-v26/ic_acode_terminal_glow_round.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000..39deea40e1 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_aurora_pulse.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000..c9cb2bd1ac Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_aurora_pulse_round.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_blueprint.webp b/res/android/mipmap-hdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000..42cf0c189d Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_blueprint.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-hdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000..bca3c15ee5 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_blueprint_round.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-hdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000..cb16b9adc4 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_midnight_circuit.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-hdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000..8513056d20 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_midnight_circuit_round.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_pixel_party.webp b/res/android/mipmap-hdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000..0ac4cb690d Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_pixel_party.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000..30626db1c1 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_pixel_party_round.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_solar_flare.webp b/res/android/mipmap-hdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000..fd2d385601 Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_solar_flare.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000..da58ca975f Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_solar_flare_round.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-hdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000..71b0ff5e2e Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_terminal_glow.webp differ diff --git a/res/android/mipmap-hdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-hdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000..37d2c5c20b Binary files /dev/null and b/res/android/mipmap-hdpi/ic_acode_terminal_glow_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-mdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000..70f922685e Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_aurora_pulse.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-mdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000..625f333f3f Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_aurora_pulse_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_blueprint.webp b/res/android/mipmap-mdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000..39471e5979 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_blueprint.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-mdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000..f987b87e09 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_blueprint_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-mdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000..67aed7b99e Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_midnight_circuit.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000..019f90f831 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_midnight_circuit_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_pixel_party.webp b/res/android/mipmap-mdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000..4f5702fda9 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_pixel_party.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-mdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000..deac35bbac Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_pixel_party_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_solar_flare.webp b/res/android/mipmap-mdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000..c7cbf81bf2 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_solar_flare.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-mdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000..ed64b73c22 Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_solar_flare_round.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-mdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000..100406746e Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_terminal_glow.webp differ diff --git a/res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000..9e5d1de40b Binary files /dev/null and b/res/android/mipmap-mdpi/ic_acode_terminal_glow_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000..f1c02e51d2 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000..d0954ac52f Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_aurora_pulse_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000..eb9c22ffa5 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_blueprint.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000..9ee9d89350 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_blueprint_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000..881a1aecf9 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000..96207773f7 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_midnight_circuit_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_pixel_party.webp b/res/android/mipmap-xhdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000..df57252484 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_pixel_party.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000..4514e58f71 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_pixel_party_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000..0f217b7e15 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_solar_flare.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-xhdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000..5423db41bf Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_solar_flare_round.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000..fb96a64a8e Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_terminal_glow.webp differ diff --git a/res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000..8d62dfe0b2 Binary files /dev/null and b/res/android/mipmap-xhdpi/ic_acode_terminal_glow_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000..28a57cc13b Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000..7cd2079a46 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_aurora_pulse_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xxhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000..78078a8b05 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_blueprint.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000..b808964308 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_blueprint_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000..858a8a950f Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000..de722e07c2 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_midnight_circuit_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp b/res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000..f70c7da953 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_pixel_party.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-xxhdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000..e3953df9ee Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_pixel_party_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000..9f172e6cf8 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_solar_flare.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000..c9ae98cb08 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_solar_flare_round.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000..6dc9706dd5 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow.webp differ diff --git a/res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000..44739c9f26 Binary files /dev/null and b/res/android/mipmap-xxhdpi/ic_acode_terminal_glow_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse.webp b/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse.webp new file mode 100644 index 0000000000..c05f83a87f Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp new file mode 100644 index 0000000000..8b7a9e5d82 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_aurora_pulse_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp b/res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp new file mode 100644 index 0000000000..04dcc97dd4 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_blueprint.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp new file mode 100644 index 0000000000..63e5981b27 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_blueprint_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp new file mode 100644 index 0000000000..d3c296fd15 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp new file mode 100644 index 0000000000..7483fbb3b9 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_midnight_circuit_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_pixel_party.webp b/res/android/mipmap-xxxhdpi/ic_acode_pixel_party.webp new file mode 100644 index 0000000000..d453fe7be0 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_pixel_party.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_pixel_party_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_pixel_party_round.webp new file mode 100644 index 0000000000..21b19bc5c5 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_pixel_party_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp new file mode 100644 index 0000000000..5295472a05 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp new file mode 100644 index 0000000000..fbe5fb4ce3 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_solar_flare_round.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow.webp b/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow.webp new file mode 100644 index 0000000000..0d792f43e5 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow.webp differ diff --git a/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow_round.webp b/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow_round.webp new file mode 100644 index 0000000000..dc90dfe269 Binary files /dev/null and b/res/android/mipmap-xxxhdpi/ic_acode_terminal_glow_round.webp differ diff --git a/src/dialogs/confirm.js b/src/dialogs/confirm.js index e42e360458..d9d187a0cf 100644 --- a/src/dialogs/confirm.js +++ b/src/dialogs/confirm.js @@ -3,16 +3,26 @@ import DOMPurify from "dompurify"; import actionStack from "lib/actionStack"; import restoreTheme from "lib/restoreTheme"; +let nextConfirmId = 0; + /** * Confirm dialog box * @param {string} titleText Title text * @param {string} [message] Alert message * @param {boolean} [isHTML] Whether the message is HTML - * @param {{checkboxText?: string, returnState?: boolean}} [options] + * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal}} [options] * @returns {Promise} */ function confirm(titleText, message, isHTML, options = {}) { return new Promise((resolve) => { + if (options.signal?.aborted) { + resolve( + options.returnState ? { confirmed: false, checked: false } : false, + ); + return; + } + const actionId = `confirm-${++nextConfirmId}`; + let closed = false; if (!message && titleText) { message = titleText; titleText = ""; @@ -42,17 +52,11 @@ function confirm(titleText, message, isHTML, options = {}) { }; const okBtn = tag("button", { textContent: strings.ok, - onclick: function () { - hide(); - resolve(getResponse(true)); - }, + onclick: () => close(true), }); const cancelBtn = tag("button", { textContent: strings.cancel, - onclick: function () { - hide(); - resolve(getResponse(false)); - }, + onclick: cancel, }); const confirmDiv = tag("div", { className: "prompt confirm", @@ -71,24 +75,37 @@ function confirm(titleText, message, isHTML, options = {}) { }); actionStack.push({ - id: "confirm", - action: hideAlert, + id: actionId, + action: cancel, }); app.append(confirmDiv, mask); restoreTheme(true); + options.signal?.addEventListener("abort", cancel, { once: true }); + + function cancel() { + close(false); + } + + function close(confirmed) { + if (closed) return; + closed = true; + options.signal?.removeEventListener("abort", cancel); + hide(); + resolve(getResponse(confirmed)); + } function hideAlert() { confirmDiv.classList.add("hide"); restoreTheme(); setTimeout(() => { - app.removeChild(confirmDiv); - app.removeChild(mask); + confirmDiv.remove(); + mask.remove(); }, 300); } function hide() { - actionStack.remove("confirm"); + actionStack.remove(actionId); hideAlert(); } }); diff --git a/src/handlers/purchase.js b/src/handlers/purchase.js index 394ab9eb6c..980258eba5 100644 --- a/src/handlers/purchase.js +++ b/src/handlers/purchase.js @@ -3,7 +3,11 @@ import helpers from "utils/helpers"; export default function purchaseListener(onpurchase, onerror) { return [ (purchases) => { - const [purchase] = purchases; + const purchase = purchases?.[0]; + if (!purchase) { + onerror?.(strings.failed); + return; + } if (purchase.purchaseState === iap.PURCHASE_STATE_PURCHASED) { if (!purchase.isAcknowledged) { iap.acknowledgePurchase( @@ -36,7 +40,7 @@ export default function purchaseListener(onpurchase, onerror) { } let message = - error === iap.USER_CANCELED ? strings.failed : strings.canceled; + error === iap.USER_CANCELED ? strings.canceled : strings.failed; if (typeof onerror === "function") onerror(message); }, diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index 70ca153df6..e96e78e135 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -717,7 +717,10 @@ "pinned tab": "تبويب مثبت", "unpin tab before closing": "قم بإلغاء تثبيت التبويب قبل إغلاقه.", "app font": "خط التطبيق", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "اختيار الخط المستخدم في واجهة التطبيق.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (تشغيل أمر ثنائي)", "lsp-transport-method-websocket": "WebSocket (الاتصال عبر رابط ws/wss)", "lsp-websocket-url": "رابط WebSocket", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "هل تريد مشاهدة إعلان بمكافأة لتطبيق أيقونة التطبيق هذه؟", + "rewarded ad unavailable": "الإعلانات بمكافأة غير متاحة الآن. يُرجى المحاولة مرة أخرى.", + "rewarded ad failed": "تعذر إكمال الإعلان. يُرجى المحاولة مرة أخرى.", + "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة." } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index 98f392e34e..6cddef6f07 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Паглядзець рэкламу з узнагародай, каб ужыць гэты значок праграмы?", + "rewarded ad unavailable": "Рэклама з узнагародай зараз недаступная. Паспрабуйце яшчэ раз.", + "rewarded ad failed": "Не ўдалося завяршыць прагляд рэкламы. Паспрабуйце яшчэ раз.", + "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду." } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index 36323c674a..166738aff1 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "এই অ্যাপ আইকনটি প্রয়োগ করতে একটি পুরস্কারযুক্ত বিজ্ঞাপন দেখবেন?", + "rewarded ad unavailable": "পুরস্কারযুক্ত বিজ্ঞাপন এখন উপলভ্য নেই। অনুগ্রহ করে আবার চেষ্টা করুন।", + "rewarded ad failed": "বিজ্ঞাপনটি সম্পূর্ণ করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", + "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index 52e5bbb078..69a1605a87 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Chcete zhlédnout reklamu s odměnou a použít tuto ikonu aplikace?", + "rewarded ad unavailable": "Reklamy s odměnou nejsou nyní dostupné. Zkuste to znovu.", + "rewarded ad failed": "Reklamu se nepodařilo dokončit. Zkuste to znovu.", + "rewarded ad incomplete": "Pro získání odměny zhlédněte reklamu až do konce." } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index d1fb0ed422..1efd40fe58 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Eine belohnte Anzeige ansehen, um dieses App-Symbol anzuwenden?", + "rewarded ad unavailable": "Belohnte Anzeigen sind derzeit nicht verfügbar. Bitte versuche es erneut.", + "rewarded ad failed": "Die Anzeige konnte nicht abgeschlossen werden. Bitte versuche es erneut.", + "rewarded ad incomplete": "Sieh dir die Anzeige bis zum Ende an, um die Belohnung zu erhalten." } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index fa275a3766..53063bc74c 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -766,7 +766,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.", "save selected tabs": "Save selected tabs", "close selected tabs": "Close selected tabs", @@ -835,5 +838,9 @@ "managed": "Managed", "acode service": "Acode Service", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Watch one rewarded ad to apply this app icon?", + "rewarded ad unavailable": "Rewarded ads are unavailable right now. Please try again.", + "rewarded ad failed": "The ad could not be completed. Please try again.", + "rewarded ad incomplete": "Finish watching the ad to earn the reward." } diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 8c3108cb68..2147ba35fe 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "¿Ver un anuncio con recompensa para aplicar este icono de la aplicación?", + "rewarded ad unavailable": "Los anuncios con recompensa no están disponibles en este momento. Inténtalo de nuevo.", + "rewarded ad failed": "No se pudo completar el anuncio. Inténtalo de nuevo.", + "rewarded ad incomplete": "Termina de ver el anuncio para obtener la recompensa." } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index f4edc7a62f..ac2403ef35 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Regarder une publicité récompensée pour appliquer cette icône d’application ?", + "rewarded ad unavailable": "Les publicités récompensées sont indisponibles pour le moment. Réessayez.", + "rewarded ad failed": "La publicité n’a pas pu être terminée. Réessayez.", + "rewarded ad incomplete": "Regardez la publicité jusqu’à la fin pour obtenir la récompense." } diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 9d67df02ca..56b2071a6e 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "לצפות בפרסומת מתגמלת כדי להחיל את סמל האפליקציה הזה?", + "rewarded ad unavailable": "פרסומות מתגמלות אינן זמינות כרגע. יש לנסות שוב.", + "rewarded ad failed": "לא ניתן היה להשלים את הפרסומת. יש לנסות שוב.", + "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול." } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index bd1a21d6b5..a26d5eaae9 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -716,8 +716,11 @@ "unpin tab": "टैब अनपिन करें", "pinned tab": "पिन किया गया टैब", "unpin tab before closing": "Unpin the tab before closing it.", + "app icon": "App icon", + "app icon changed": "App icon changed", "app font": "ऐप फ़ॉन्ट", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "कॉपी करते टाइम एक्सक्लूज़न्स अप्लाई करें", "settings-info-app-use-file-operation-exclusions": "कॉपी और पेस्ट ऑपरेशन्स के दौरान एक्सक्लूज़न पैटर्न्स से मैच करने वाले फ़ाइल्स और फ़ोल्डर्स स्किप कर।", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "क्या इस ऐप आइकन को लागू करने के लिए इनाम वाला एक विज्ञापन देखना चाहते हैं?", + "rewarded ad unavailable": "इनाम वाले विज्ञापन अभी उपलब्ध नहीं हैं। कृपया फिर से कोशिश करें।", + "rewarded ad failed": "विज्ञापन पूरा नहीं हो सका। कृपया फिर से कोशिश करें।", + "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 769ce29a00..086b82bb69 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -717,7 +717,10 @@ "pinned tab": "Rögzített lap", "unpin tab before closing": "Lap rögzítésének megszüntetése bezárás előtt.", "app font": "Alkalmazás betűtípusa", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Válassza ki az alkalmazás egész felületén használandó betűtípust.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (bináris parancs futtatása)", "lsp-transport-method-websocket": "WebSocket (kapcsolódás ws/wss webcímhez)", "lsp-websocket-url": "WebSocket webcím", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Kizárások használata másoláskor", "settings-info-app-use-file-operation-exclusions": "A kizárási mintáknak megfelelő fájlok és mappák kihagyása másoláskor és beillesztéskor.", "horizontal scroll margin": "Vízszintes görgetési margó", - "settings-info-horizontal-scroll-margin": "A leghosszabb sor után egy üres hely lesz hozzáadva a képernyő széléhez, ha a sorok tördelése ki van kapcsolva. Adjon meg egy nem negatív egész pixelértéket." + "settings-info-horizontal-scroll-margin": "A leghosszabb sor után egy üres hely lesz hozzáadva a képernyő széléhez, ha a sorok tördelése ki van kapcsolva. Adjon meg egy nem negatív egész pixelértéket.", + "confirm app icon reward": "Megnézel egy jutalmazott hirdetést az alkalmazásikon beállításához?", + "rewarded ad unavailable": "A jutalmazott hirdetések jelenleg nem érhetők el. Próbáld újra.", + "rewarded ad failed": "A hirdetést nem sikerült befejezni. Próbáld újra.", + "rewarded ad incomplete": "Nézd végig a hirdetést a jutalom megszerzéséhez." } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index 4f2baf5c81..dd62d02bb0 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -717,7 +717,10 @@ "pinned tab": "Tab yang tersematkan", "unpin tab before closing": "Lepas sematan tab sebelum ditutup.", "app font": "Font Aplikasi", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Pilih font yang digunakan di seluruh antarmuka aplikasi.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (luncurkan perintah biner)", "lsp-transport-method-websocket": "WebSocket (hubungkan ke sebuah URL ws/wss)", "lsp-websocket-url": "URL WebSocket", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Terapkan pengecualian saat menyalin", "settings-info-app-use-file-operation-exclusions": "Lewati file dan folder yang cocok dengan pola pengecualian selama operasi salin dan tempel.", "horizontal scroll margin": "Margin gulir horizontal", - "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkusan kata (word wrap) nonaktif. Masukkan nilai piksel utuh non-negatif apa pun." + "settings-info-horizontal-scroll-margin": "Menambahkan ruang kosong setelah baris terpanjang saat pembungkusan kata (word wrap) nonaktif. Masukkan nilai piksel utuh non-negatif apa pun.", + "confirm app icon reward": "Tonton satu iklan berhadiah untuk menerapkan ikon aplikasi ini?", + "rewarded ad unavailable": "Iklan berhadiah saat ini tidak tersedia. Silakan coba lagi.", + "rewarded ad failed": "Iklan tidak dapat diselesaikan. Silakan coba lagi.", + "rewarded ad incomplete": "Tonton iklan hingga selesai untuk mendapatkan hadiah." } diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index 076f096961..84a5387d7c 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -769,7 +769,10 @@ declare type LangStrings = { "pinned tab": string; "unpin tab before closing": string; "app font": string; + "app icon": string; + "app icon changed": string; "settings-info-app-font-family": string; + "settings-info-app-icon": string; "unsaved selected tabs warning": string; "save selected tabs": string; "close selected tabs": string; @@ -839,6 +842,10 @@ declare type LangStrings = { "acode service": string; "horizontal scroll margin": string; "settings-info-horizontal-scroll-margin": string; + "confirm app icon reward": string; + "rewarded ad unavailable": string; + "rewarded ad failed": string; + "rewarded ad incomplete": string; }; declare var strings: LangStrings; diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index b19d8c385d..c1ef78a612 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "برای اعمال این نماد برنامه، یک تبلیغ پاداش‌دار تماشا می‌کنید؟", + "rewarded ad unavailable": "تبلیغات پاداش‌دار در حال حاضر در دسترس نیستند. لطفاً دوباره تلاش کنید.", + "rewarded ad failed": "تبلیغ کامل نشد. لطفاً دوباره تلاش کنید.", + "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید." } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index dbb883ce3c..775c346e91 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Guardare un annuncio con ricompensa per applicare questa icona dell’app?", + "rewarded ad unavailable": "Gli annunci con ricompensa non sono disponibili al momento. Riprova.", + "rewarded ad failed": "Non è stato possibile completare l’annuncio. Riprova.", + "rewarded ad incomplete": "Guarda l’annuncio fino alla fine per ottenere la ricompensa." } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index ddd1e5b633..326b525fc2 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "リワード広告を1本視聴して、このアプリアイコンを適用しますか?", + "rewarded ad unavailable": "現在リワード広告を利用できません。もう一度お試しください。", + "rewarded ad failed": "広告を完了できませんでした。もう一度お試しください。", + "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index 20ae0a3146..b24526e9f9 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "보상형 광고 한 편을 시청하고 이 앱 아이콘을 적용할까요?", + "rewarded ad unavailable": "현재 보상형 광고를 이용할 수 없습니다. 다시 시도해 주세요.", + "rewarded ad failed": "광고를 완료하지 못했습니다. 다시 시도해 주세요.", + "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요." } diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index bcc5171dcf..cc44821d8f 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ഈ ആപ്പ് ഐക്കൺ ഉപയോഗിക്കാൻ പ്രതിഫലമുള്ള ഒരു പരസ്യം കാണണോ?", + "rewarded ad unavailable": "പ്രതിഫലമുള്ള പരസ്യങ്ങൾ ഇപ്പോൾ ലഭ്യമല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", + "rewarded ad failed": "പരസ്യം പൂർത്തിയാക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", + "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക." } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 00262a2a54..2c0ca208c0 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ဤအက်ပ်အိုင်ကွန်ကို အသုံးပြုရန် ဆုရကြော်ငြာတစ်ခုကို ကြည့်မလား။", + "rewarded ad unavailable": "ဆုရကြော်ငြာများကို လောလောဆယ် မရနိုင်ပါ။ ထပ်မံကြိုးစားပါ။", + "rewarded ad failed": "ကြော်ငြာကို အဆုံးအထိ မပြသနိုင်ခဲ့ပါ။ ထပ်မံကြိုးစားပါ။", + "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 84cf0cfc9f..0e9f1b919e 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ဤအက္ပ္အိုင္ကြန္ကို အသုံးျပဳရန္ ဆုရေၾကာ္ျငာတစ္ခုကို ၾကည့္မလား။", + "rewarded ad unavailable": "ဆုရေၾကာ္ျငာမ်ားကို ေလာေလာဆယ္ မရႏိုင္ပါ။ ထပ္မံႀကိဳးစားပါ။", + "rewarded ad failed": "ေၾကာ္ျငာကို အဆုံးအထိ မျပသႏိုင္ခဲ့ပါ။ ထပ္မံႀကိဳးစားပါ။", + "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 1634787b00..843821641a 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Obejrzeć reklamę z nagrodą, aby zastosować tę ikonę aplikacji?", + "rewarded ad unavailable": "Reklamy z nagrodą są teraz niedostępne. Spróbuj ponownie.", + "rewarded ad failed": "Nie udało się ukończyć reklamy. Spróbuj ponownie.", + "rewarded ad incomplete": "Obejrzyj reklamę do końca, aby otrzymać nagrodę." } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index 9f6552f768..6ac0faea49 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Assistir a um anúncio com recompensa para aplicar este ícone do aplicativo?", + "rewarded ad unavailable": "Os anúncios com recompensa estão indisponíveis no momento. Tente novamente.", + "rewarded ad failed": "Não foi possível concluir o anúncio. Tente novamente.", + "rewarded ad incomplete": "Assista ao anúncio até o fim para receber a recompensa." } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index 0cdbc0b314..c0030f7bb2 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "ਕੀ ਇਸ ਐਪ ਆਈਕਨ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਇੱਕ ਇਨਾਮ ਵਾਲਾ ਇਸ਼ਤਿਹਾਰ ਦੇਖਣਾ ਹੈ?", + "rewarded ad unavailable": "ਇਨਾਮ ਵਾਲੇ ਇਸ਼ਤਿਹਾਰ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "rewarded ad failed": "ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 4095204dc4..3fa063c1db 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Посмотреть рекламу с вознаграждением, чтобы применить этот значок приложения?", + "rewarded ad unavailable": "Реклама с вознаграждением сейчас недоступна. Повторите попытку.", + "rewarded ad failed": "Не удалось завершить просмотр рекламы. Повторите попытку.", + "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду." } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 509640d0c0..2d9d72f94c 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Manood ng isang ad na may gantimpala upang gamitin ang icon na ito ng app?", + "rewarded ad unavailable": "Hindi available ngayon ang mga ad na may gantimpala. Pakisubukang muli.", + "rewarded ad failed": "Hindi nakumpleto ang ad. Pakisubukang muli.", + "rewarded ad incomplete": "Tapusin ang panonood ng ad upang makuha ang gantimpala." } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index 327b4556db..407ca5a8dc 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Bu uygulama simgesini kullanmak için bir ödüllü reklam izlensin mi?", + "rewarded ad unavailable": "Ödüllü reklamlar şu anda kullanılamıyor. Lütfen tekrar deneyin.", + "rewarded ad failed": "Reklam tamamlanamadı. Lütfen tekrar deneyin.", + "rewarded ad incomplete": "Ödülü kazanmak için reklamı sonuna kadar izleyin." } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index 1f14b264af..d4817eb12a 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -717,7 +717,10 @@ "pinned tab": "Закріплена вкладка", "unpin tab before closing": "Відкріпіть вкладку перед її закриттям.", "app font": "Шрифт програми", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Виберіть шрифт, який буде використовуватися в інтерфейсі програми.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (запуск бінарної команди)", "lsp-transport-method-websocket": "WebSocket (підключення до URL-адреси ws/wss)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Переглянути рекламу з винагородою, щоб застосувати цю піктограму застосунку?", + "rewarded ad unavailable": "Реклама з винагородою зараз недоступна. Спробуйте ще раз.", + "rewarded ad failed": "Не вдалося завершити перегляд реклами. Спробуйте ще раз.", + "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду." } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index eec005214b..da3c2725e4 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Ushbu ilova belgisini qo‘llash uchun bitta mukofotli reklamani ko‘rasizmi?", + "rewarded ad unavailable": "Mukofotli reklamalar hozir mavjud emas. Qayta urinib ko‘ring.", + "rewarded ad failed": "Reklamani yakunlab bo‘lmadi. Qayta urinib ko‘ring.", + "rewarded ad incomplete": "Mukofotni olish uchun reklamani oxirigacha tomosha qiling." } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 4c992e2502..69f567b7ac 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "Xem một quảng cáo có thưởng để áp dụng biểu tượng ứng dụng này?", + "rewarded ad unavailable": "Quảng cáo có thưởng hiện không khả dụng. Vui lòng thử lại.", + "rewarded ad failed": "Không thể hoàn tất quảng cáo. Vui lòng thử lại.", + "rewarded ad incomplete": "Xem hết quảng cáo để nhận phần thưởng." } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 377aa0f004..aaf2d0813f 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -717,7 +717,10 @@ "pinned tab": "已固定的标签页", "unpin tab before closing": "关闭前请先取消固定该标签页。", "app font": "应用字体", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "选择在应用界面中使用的字体。", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO(启动可执行命令)", "lsp-transport-method-websocket": "WebSocket(连接到 ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "复制时应用排除项", "settings-info-app-use-file-operation-exclusions": "在复制和粘贴操作期间,跳过符合排除规则的文件和文件夹。", "horizontal scroll margin": "水平滚动边距", - "settings-info-horizontal-scroll-margin": "在关闭自动换行时,为最长行的末尾添加空白区域。请输入任意非负整数的像素值。" + "settings-info-horizontal-scroll-margin": "在关闭自动换行时,为最长行的末尾添加空白区域。请输入任意非负整数的像素值。", + "confirm app icon reward": "观看一条激励广告以应用此应用图标?", + "rewarded ad unavailable": "激励广告暂时不可用,请重试。", + "rewarded ad failed": "广告未能完成,请重试。", + "rewarded ad incomplete": "请完整观看广告以获得奖励。" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index 2e450d79c3..bf2ac76f22 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -717,7 +717,10 @@ "pinned tab": "已固定的標籤頁", "unpin tab before closing": "關閉前請先取消固定該標籤頁。", "app font": "應用字體", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "選擇在應用介面中使用的字體。", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO(啟動可執行命令)", "lsp-transport-method-websocket": "WebSocket(連線至 ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "複製時應用排除項", "settings-info-app-use-file-operation-exclusions": "在複製和粘貼操作期間,跳過符合排除規則的文件和文件夾。", "horizontal scroll margin": "水平滾動邊距", - "settings-info-horizontal-scroll-margin": "在關閉自動換行時,爲最長行的末尾添加空白區域。請輸入任意非負整數的像素值。" + "settings-info-horizontal-scroll-margin": "在關閉自動換行時,爲最長行的末尾添加空白區域。請輸入任意非負整數的像素值。", + "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", + "rewarded ad unavailable": "獎勵廣告暫時無法使用,請再試一次。", + "rewarded ad failed": "廣告未能完成,請再試一次。", + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 734c10caf0..1204930d69 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -717,7 +717,10 @@ "pinned tab": "Pinned tab", "unpin tab before closing": "Unpin the tab before closing it.", "app font": "App font", + "app icon": "App icon", + "app icon changed": "App icon changed", "settings-info-app-font-family": "Choose the font used across the app interface.", + "settings-info-app-icon": "Choose the app icon displayed on your device.", "lsp-transport-method-stdio": "STDIO (launch a binary command)", "lsp-transport-method-websocket": "WebSocket (connect to a ws/wss URL)", "lsp-websocket-url": "WebSocket URL", @@ -835,5 +838,9 @@ "apply exclusions when copying": "Apply exclusions when copying", "settings-info-app-use-file-operation-exclusions": "Skip files and folders matching the exclusion patterns during copy and paste operations.", "horizontal scroll margin": "Horizontal scroll margin", - "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value." + "settings-info-horizontal-scroll-margin": "Adds empty space after the longest line when word wrap is off. Enter any non-negative whole-pixel value.", + "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", + "rewarded ad unavailable": "獎勵廣告目前無法使用,請再試一次。", + "rewarded ad failed": "廣告未能完成,請再試一次。", + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" } diff --git a/src/lib/adRewards.js b/src/lib/adRewards.js index b5b0b22e48..459226dd79 100644 --- a/src/lib/adRewards.js +++ b/src/lib/adRewards.js @@ -3,13 +3,15 @@ import { createRewardStateLifecycle, isRewardPassActive, } from "./adRewardBannerPolicy.mjs"; -import auth from "./auth"; import config from "./config"; +import showRewardedAd, { + isRewardedAdSupported, + isWatchingRewardedAd, +} from "./rewardedAd"; import secureAdRewardState from "./secureAdRewardState"; -import { adUnitIdRewarded, setBannerSuppressed } from "./startAd"; +import { setBannerSuppressed } from "./startAd"; const ONE_HOUR = 60 * 60 * 1000; -const REWARDED_RESULT_TIMEOUT_MS = 90 * 1000; const OFFERS = [ { @@ -153,78 +155,19 @@ async function getRewardIdentity() { } } -async function createRewardedAd(offer, step, sessionId) { - if (!admob?.RewardedAd) { - throw new Error("Rewarded ads are not available in this build."); - } - - const userId = await getRewardIdentity(); - const customData = [ - `session=${sessionId}`, - `offer=${offer.id}`, - `step=${step}`, - `ads=${offer.adsRequired}`, - ].join("&"); - - return new admob.RewardedAd({ - adUnitId: adUnitIdRewarded, +async function showRewardedStep(offer, step, sessionId) { + const earned = await showRewardedAd({ serverSideVerification: { - userId, - customData, + userId: await getRewardIdentity(), + customData: [ + `session=${sessionId}`, + `offer=${offer.id}`, + `step=${step}`, + `ads=${offer.adsRequired}`, + ].join("&"), }, }); -} - -function waitForRewardedResult(ad) { - return new Promise((resolve, reject) => { - let earned = false; - let settled = false; - const timeoutId = setTimeout(() => { - fail( - new Error("Rewarded ad timed out before completion. Please try again."), - ); - }, REWARDED_RESULT_TIMEOUT_MS); - - const finish = (result) => { - if (settled) return; - settled = true; - clearTimeout(timeoutId); - resolve(result); - }; - - const fail = (error) => { - if (settled) return; - settled = true; - clearTimeout(timeoutId); - reject( - error instanceof Error - ? error - : new Error(error?.message || "Rewarded ad failed."), - ); - }; - - ad.on("reward", () => { - earned = true; - }); - - ad.on("dismiss", () => { - finish({ earned }); - }); - - ad.on("showfail", fail); - ad.on("loadfail", fail); - }); -} - -async function showRewardedStep(offer, step, sessionId) { - const rewardedAd = await createRewardedAd(offer, step, sessionId); - const resultPromise = waitForRewardedResult(rewardedAd); - await rewardedAd.load(); - await rewardedAd.show(); - const result = await resultPromise; - if (!result.earned) { - throw new Error("Reward not earned. The ad was closed before completion."); - } + if (!earned) throw new Error(strings["rewarded ad incomplete"]); } export default { @@ -285,13 +228,13 @@ export default { return Boolean(!config.HAS_PRO && !this.isAdFreeActive()); }, isRewardedSupported() { - return Boolean(!config.HAS_PRO && admob?.RewardedAd && adUnitIdRewarded); + return isRewardedAdSupported(); }, getRewardedUnavailableReason() { if (config.HAS_PRO) { return "Ads are already disabled on this build."; } - if (!admob?.RewardedAd) { + if (!isRewardedAdSupported()) { return "Rewarded ads are unavailable on this device."; } return ""; @@ -303,7 +246,7 @@ export default { }; }, isWatchingReward() { - return Boolean(activeWatchPromise); + return Boolean(activeWatchPromise) || isWatchingRewardedAd(); }, async watchOffer(offerId, { onStep } = {}) { if (activeWatchPromise) { @@ -318,18 +261,18 @@ export default { throw new Error(this.getRewardedUnavailableReason()); } - await rewardLifecycle.refresh({ notifyExpiry: false }); - const redemptionStatus = this.canRedeemNow(); - if (!redemptionStatus.ok) { - throw new Error(redemptionStatus.reason); - } - const sessionId = typeof crypto?.randomUUID === "function" ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`; activeWatchPromise = (async () => { + await rewardLifecycle.refresh({ notifyExpiry: false }); + const redemptionStatus = this.canRedeemNow(); + if (!redemptionStatus.ok) { + throw new Error(redemptionStatus.reason); + } + for (let step = 1; step <= offer.adsRequired; step += 1) { onStep?.({ step, diff --git a/src/lib/appIconSelection.js b/src/lib/appIconSelection.js new file mode 100644 index 0000000000..feced46132 --- /dev/null +++ b/src/lib/appIconSelection.js @@ -0,0 +1,61 @@ +import toast from "components/toast"; +import confirm from "dialogs/confirm"; +import helpers from "utils/helpers"; +import adRewards from "./adRewards"; +import { APP_ICONS } from "./appIcons"; +import config from "./config"; +import { requestProPurchase } from "./removeAds"; +import showRewardedAd from "./rewardedAd"; +import appSettings from "./settings"; + +// Also exclude a newly opened picker while an earlier native change is pending. +let selecting = false; + +export default function createAppIconSelection({ signal, onBusy, onChange }) { + return async function selectIcon(iconId) { + const icon = APP_ICONS.find(({ id }) => id === iconId); + if (!icon || selecting || signal.aborted) return; + if (iconId === (appSettings.value.appIcon || "default")) return; + + selecting = true; + onBusy(true); + try { + if (icon.requiresPro && !config.HAS_PRO) { + await requestProPurchase({ signal }); + return; + } + if (iconId !== "default" && adRewards.canShowAds()) { + const confirmed = await confirm( + strings["app icon"], + strings["confirm app icon reward"], + false, + { signal }, + ); + if (!confirmed || signal.aborted) return; + // Pro or a pass may have become active while confirmation was open. + if (adRewards.canShowAds()) { + const earned = await showRewardedAd({ signal }); + if (signal.aborted) return; + if (!earned) { + toast(strings["rewarded ad incomplete"]); + return; + } + } + } + if (signal.aborted || (icon.requiresPro && !config.HAS_PRO)) return; + await helpers.promisify(system.setAppIcon, iconId); + // Once Android has applied the change, keep persisted state in sync + // even if the picker closed while the native callback was in flight. + await appSettings.update({ appIcon: iconId }, false); + if (!signal.aborted) { + onChange(); + toast(strings["app icon changed"]); + } + } catch (error) { + if (!signal.aborted) helpers.error(error); + } finally { + selecting = false; + if (!signal.aborted) onBusy(false); + } + }; +} diff --git a/src/lib/appIcons.js b/src/lib/appIcons.js new file mode 100644 index 0000000000..3ad3737683 --- /dev/null +++ b/src/lib/appIcons.js @@ -0,0 +1,54 @@ +/** + * Available app icons that can be selected from the settings. + * The `id` matches the icon names accepted by `system.setAppIcon`. + * The `image` is a relative path (relative to the www root) to an SVG + * preview that is rendered inside the UI. + */ + +// Update system.java map too if this is updated +export const APP_ICONS = [ + { id: "default", label: "Default", image: "icons/ic_acode_default.svg" }, + { + id: "pro", + label: "Acode Pro", + image: "icons/ic_acode_pro.svg", + requiresPro: true, + }, + { + id: "midnight_circuit", + label: "Midnight Circuit", + image: "icons/ic_acode_midnight_circuit.svg", + }, + { + id: "aurora_pulse", + label: "Aurora Pulse", + image: "icons/ic_acode_aurora_pulse.svg", + }, + { + id: "terminal_glow", + label: "Terminal Glow", + image: "icons/ic_acode_terminal_glow.svg", + }, + { + id: "solar_flare", + label: "Solar Flare", + image: "icons/ic_acode_solar_flare.svg", + }, + { + id: "blueprint", + label: "Blueprint", + image: "icons/ic_acode_blueprint.svg", + }, + { + id: "pixel_party", + label: "Pixel Party", + image: "icons/ic_acode_pixel_party.svg", + }, +]; + +export const APP_ICON_IDS = APP_ICONS.map((icon) => icon.id); + +export function getAppIconLabel(id) { + const icon = APP_ICONS.find((item) => item.id === id); + return icon ? icon.label : APP_ICONS[0].label; +} diff --git a/src/lib/removeAds.js b/src/lib/removeAds.js index b825b7aeb0..fcb0bcb3b9 100644 --- a/src/lib/removeAds.js +++ b/src/lib/removeAds.js @@ -1,36 +1,138 @@ +import toast from "components/toast"; +import confirm from "dialogs/confirm"; +import loader from "dialogs/loader"; import purchaseListener from "handlers/purchase"; -import config from "./config.js"; -import { BANNER_SUPPRESSION_REASON, setBannerSuppressed } from "./startAd.js"; +import helpers from "utils/helpers"; +import auth from "./auth"; +import config from "./config"; +import customTab from "./customTab"; +import { BANNER_SUPPRESSION_REASON, setBannerSuppressed } from "./startAd"; -/** - * Remove ads after purchase - * @returns {Promise} - */ -export default function removeAds() { - return new Promise((resolve, reject) => { - iap.getProducts(["acode_pro_new"], (products) => { - const [product] = products; +let activePurchase = null; +let activeRequest = null; - iap.setPurchaseUpdatedListener(...purchaseListener(onpurchase, reject)); +function enablePro() { + config.HAS_PRO = true; + setBannerSuppressed(BANNER_SUPPRESSION_REASON.PRO, true); +} - iap.purchase( - product.productId, - (code) => { - // ignore - }, - (err) => { - alert(strings.error, err); +/** Purchase Pro through Play billing. Resolves only after purchase confirmation. */ +export default function removeAds({ signal } = {}) { + if (signal?.aborted) return Promise.reject(strings.canceled); + if (activePurchase) return activePurchase; + activePurchase = new Promise((resolve, reject) => { + let settled = false; + let launched = false; + let purchased = false; + function cancel() { + if (!launched) fail(strings.canceled); + } + function fail(error) { + if (settled) return; + settled = true; + signal?.removeEventListener("abort", cancel); + reject(error); + } + function onpurchase() { + // A pending purchase can be confirmed after the caller has settled. + if (purchased) return; + purchased = true; + settled = true; + signal?.removeEventListener("abort", cancel); + enablePro(); + // The cache is reverified by the existing startup purchase checks. + try { + localStorage.setItem("acode_pro", "true"); + } catch (error) { + console.warn("Unable to cache Pro purchase", error); + } + toast(strings["thank you :)"]); + resolve(); + } + signal?.addEventListener("abort", cancel, { once: true }); + try { + iap.getProducts( + ["acode_pro_new"], + (products) => { + if (settled) return; + try { + const product = products?.find( + ({ productId }) => productId === "acode_pro_new", + ); + if (!product) return fail(strings["no-product-info"]); + iap.setPurchaseUpdatedListener( + ...purchaseListener(onpurchase, fail), + ); + launched = true; + iap.purchase(product.productId, () => {}, fail); + } catch (error) { + fail(error); + } }, + fail, ); - }); + } catch (error) { + fail(error); + } + }).finally(() => { + activePurchase = null; + }); + return activePurchase; +} - function onpurchase() { - resolve(null); - // For caching, later verified so no need to worry about - localStorage.setItem("acode_pro", "true"); - config.HAS_PRO = true; - setBannerSuppressed(BANNER_SUPPRESSION_REASON.PRO, true); - toast(strings["thank you :)"]); +/** Reuse the Remove ads entry point; external checkout completes via its intent. */ +export function requestProPurchase({ signal } = {}) { + if (signal?.aborted) return Promise.resolve(false); + if (config.HAS_PRO) return Promise.resolve(true); + if (activeRequest) return activeRequest; + activeRequest = (async () => { + if (!helpers.shouldAllowExternalPurchase()) { + try { + await removeAds({ signal }); + return config.HAS_PRO; + } catch (error) { + if ( + error === strings.canceled || + error === globalThis.iap?.USER_CANCELED + ) + return false; + throw error; + } + } + + loader.create(strings.login, strings["loading..."]); + try { + let user = await auth.getLoggedInUser(); + if (signal?.aborted) return false; + if (!user) { + // Dismiss the modal loader so Android Back can cancel confirmation. + loader.destroy(); + const confirmed = await confirm( + strings.confirm, + strings["confirm-login"], + false, + { signal }, + ); + if (!confirmed || signal?.aborted) return false; + loader.create(strings.login, strings["loading..."]); + await auth.login(); + if (signal?.aborted) return false; + user = await auth.getLoggedInUser(); + } + if (signal?.aborted) return false; + if (!user) throw new Error(strings.failed); + if (user.acode_pro) { + enablePro(); + return true; + } + } finally { + loader.destroy(); } + if (signal?.aborted) return false; + await customTab(`${config.BASE_URL}/pro?redirect=app`); + return config.HAS_PRO; + })().finally(() => { + activeRequest = null; }); + return activeRequest; } diff --git a/src/lib/rewardedAd.js b/src/lib/rewardedAd.js new file mode 100644 index 0000000000..fcb375b6e5 --- /dev/null +++ b/src/lib/rewardedAd.js @@ -0,0 +1,120 @@ +import config from "./config"; +import startAd, { + adUnitIdRewarded, + getPrivacyState, + initialized, +} from "./startAd"; + +const RESULT_TIMEOUT_MS = 90_000; +let active = false; +let nextId = 0; + +export function isRewardedAdSupported() { + return Boolean( + !config.HAS_PRO && + typeof admob !== "undefined" && + admob.RewardedAd && + window.ANDROID_SDK_INT >= 29 && + adUnitIdRewarded, + ); +} + +export function isWatchingRewardedAd() { + return active; +} + +/** Show one reward, without granting an ad-free pass or applying its reward. */ +export default function showRewardedAd({ + serverSideVerification, + signal, +} = {}) { + if (signal?.aborted) return Promise.resolve(false); + if (active || !isRewardedAdSupported()) { + return Promise.reject(new Error(strings["rewarded ad unavailable"])); + } + active = true; + return new Promise((resolve, reject) => { + let earned = false; + let settled = false; + let presenting = false; + let cleaned = false; + const unsubscribe = []; + const timeout = setTimeout( + () => finish(new Error(strings["rewarded ad failed"])), + RESULT_TIMEOUT_MS, + ); + + function cleanup() { + // A cancelled/timed-out caller must not allow another full-screen ad + // until the native ad actually dismisses (show() resolves on opening). + if (presenting || cleaned) return; + cleaned = true; + for (const off of unsubscribe.splice(0)) off(); + active = false; + } + + function finish(error, result = false) { + if (!settled) { + settled = true; + clearTimeout(timeout); + signal?.removeEventListener("abort", cancel); + if (error) reject(error); + else resolve(result); + } + cleanup(); + } + + function cancel() { + finish(null); + } + + signal?.addEventListener("abort", cancel, { once: true }); + void (async () => { + await startAd(); + if (settled) return; + if ( + !isRewardedAdSupported() || + !initialized || + !getPrivacyState().canRequestAds + ) { + throw new Error(strings["rewarded ad unavailable"]); + } + const ad = new admob.RewardedAd({ + id: `acode-reward-${++nextId}`, + adUnitId: adUnitIdRewarded, + ...(serverSideVerification ? { serverSideVerification } : {}), + }); + unsubscribe.push( + ad.on("reward", () => { + if (!settled) earned = true; + }), + ad.on("dismiss", () => { + presenting = false; + finish(null, earned && !signal?.aborted); + }), + ad.on("showfail", () => { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + }), + ad.on("loadfail", () => + finish(new Error(strings["rewarded ad failed"])), + ), + () => { + void ad.destroy().catch((error) => { + console.warn("Failed to destroy rewarded ad", error); + }); + }, + ); + await ad.load(); + if (settled) return; + presenting = true; + if ((await ad.show()) === false) { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + } + })().catch(() => { + presenting = false; + finish(new Error(strings["rewarded ad failed"])); + }); + }); +} diff --git a/src/lib/settings.js b/src/lib/settings.js index 7421f3d2cd..8827faadbc 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -217,6 +217,7 @@ class Settings { developerMode: false, shiftClickSelection: true, showShareButton: true, + appIcon: "default", }; this.value = structuredClone(this.#defaultSettings); } diff --git a/src/pages/appIconSetting/appIconSetting.js b/src/pages/appIconSetting/appIconSetting.js new file mode 100644 index 0000000000..1d4afadffd --- /dev/null +++ b/src/pages/appIconSetting/appIconSetting.js @@ -0,0 +1,87 @@ +import "./appIconSetting.scss"; +import Page from "components/page"; +import loader from "dialogs/loader"; +import Ref from "html-tag-js/ref"; +import actionStack from "lib/actionStack"; +import createAppIconSelection from "lib/appIconSelection"; +import { APP_ICONS } from "lib/appIcons"; +import appSettings from "lib/settings"; +import helpers from "utils/helpers"; + +export default function appIconSetting() { + const title = strings["app icon"] || "App icon"; + const $page = Page(title); + const $list = Ref(); + const controller = new AbortController(); + let busy = false; + const selectIcon = createAppIconSelection({ + signal: controller.signal, + onBusy(value) { + busy = value; + if (value) loader.showTitleLoader(); + else loader.removeTitleLoader(); + $list.el.setAttribute("aria-busy", String(value)); + for (const button of $list.el.querySelectorAll("button")) { + button.disabled = value; + } + }, + onChange: renderIcons, + }); + let resolve; + $page.classList.add("app-icon-page"); + + actionStack.push({ + id: "appIcon", + action: () => { + $page.hide(); + }, + }); + + $page.onhide = () => { + controller.abort(); + loader.removeTitleLoader(); + $page.removeEventListener("click", clickHandler); + actionStack.remove("appIcon"); + resolve(); + }; + + $page.body =
; + + app.append($page); + renderIcons(); + helpers.showAd(); + + $page.addEventListener("click", clickHandler); + + return new Promise((res) => { + resolve = res; + }); + + function renderIcons() { + const current = appSettings.value.appIcon || "default"; + $list.el.content = APP_ICONS.map((icon) => { + const isCurrent = icon.id === current; + return ( + + ); + }); + } + + async function clickHandler(e) { + const $target = e.target.closest("[data-icon]"); + if (!$target) return; + const iconId = $target.dataset.icon; + await selectIcon(iconId); + } +} diff --git a/src/pages/appIconSetting/appIconSetting.scss b/src/pages/appIconSetting/appIconSetting.scss new file mode 100644 index 0000000000..814f6d9e28 --- /dev/null +++ b/src/pages/appIconSetting/appIconSetting.scss @@ -0,0 +1,89 @@ +wc-page.app-icon-page { + background: var(--secondary-color); + + .app-icon-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr)); + gap: 0.9rem; + width: 100%; + max-width: 48rem; + margin: 0 auto; + padding: 1rem 1rem 5.5rem; + box-sizing: border-box; + } + + .app-icon-item { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.6rem; + margin: 0; + padding: 1rem 0.75rem; + border: none; + border-radius: 1rem; + background: transparent; + cursor: pointer; + font-family: inherit; + transition: background-color 140ms ease; + + &:focus, + &:active { + background: color-mix( + in srgb, + var(--secondary-color), + var(--popup-text-color) 4% + ); + } + + &.current { + background: color-mix(in srgb, var(--secondary-color), var(--active-color) 10%); + } + + &.current .app-icon-preview { + box-shadow: 0 0 0 2px var(--active-color); + } + } + + .app-icon-preview { + display: block; + width: 4.2rem; + height: 4.2rem; + border-radius: 0.9rem; + overflow: hidden; + background: var(--popup-background-color); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25); + + img { + display: block; + width: 100%; + height: 100%; + object-fit: contain; + } + } + + .app-icon-name { + display: block; + font-size: 0.85rem; + line-height: 1.3; + font-weight: 600; + color: var(--popup-text-color); + text-align: center; + word-break: break-word; + } + + .app-icon-check { + position: absolute; + top: 0.4rem; + right: 0.4rem; + display: flex; + align-items: center; + justify-content: center; + width: 1.2rem; + height: 1.2rem; + border-radius: 50%; + background: var(--active-color); + color: var(--button-text-color); + font-size: 0.8rem; + } +} diff --git a/src/pages/appIconSetting/index.js b/src/pages/appIconSetting/index.js new file mode 100644 index 0000000000..6718f0c619 --- /dev/null +++ b/src/pages/appIconSetting/index.js @@ -0,0 +1,5 @@ +export default function appIconSetting(...args) { + return import( + /* webpackChunkName: "appIconSetting" */ "./appIconSetting" + ).then((module) => module.default(...args)); +} diff --git a/src/plugins/admob/src/android/cordova/AdMob.kt b/src/plugins/admob/src/android/cordova/AdMob.kt index 52ecec35d8..b3f459b728 100644 --- a/src/plugins/admob/src/android/cordova/AdMob.kt +++ b/src/plugins/admob/src/android/cordova/AdMob.kt @@ -45,6 +45,7 @@ class AdMob : CordovaPlugin() { Actions.START to ::executeStart, Actions.CONFIGURE to ::executeConfigure, Actions.AD_CREATE to ::executeAdCreate, + Actions.AD_DESTROY to ::executeAdDestroy, Actions.AD_IS_LOADED to ::executeAdIsLoaded, Actions.AD_LOAD to ::executeAdLoad, Actions.AD_SHOW to ::executeAdShow, @@ -140,6 +141,14 @@ class AdMob : CordovaPlugin() { } ?: ctx.reject("ad cls is missing") } + private fun executeAdDestroy(ctx: ExecuteContext) { + val id = ctx.optId() ?: return ctx.reject("id is required") + cordova.activity.runOnUiThread { + ads[id]?.onDestroy() + ctx.resolve() + } + } + private fun executeAdIsLoaded(ctx: ExecuteContext) { cordova.activity.runOnUiThread { ctx.optAdOrReject()?.let { ad -> diff --git a/src/plugins/admob/src/android/cordova/Generated.kt b/src/plugins/admob/src/android/cordova/Generated.kt index 53b3e11bde..20db58553e 100644 --- a/src/plugins/admob/src/android/cordova/Generated.kt +++ b/src/plugins/admob/src/android/cordova/Generated.kt @@ -3,6 +3,7 @@ package admob.plus.cordova object Actions { const val AD_CREATE = "adCreate" + const val AD_DESTROY = "adDestroy" const val AD_HIDE = "adHide" const val AD_IS_LOADED = "adIsLoaded" const val AD_LOAD = "adLoad" diff --git a/src/plugins/admob/src/android/cordova/ads/Rewarded.kt b/src/plugins/admob/src/android/cordova/ads/Rewarded.kt index 89a7a9dce1..545c5240d6 100644 --- a/src/plugins/admob/src/android/cordova/ads/Rewarded.kt +++ b/src/plugins/admob/src/android/cordova/ads/Rewarded.kt @@ -26,21 +26,35 @@ fun buildServerSideVerificationOptions(opts: JSONObject): ServerSideVerification class Rewarded(ctx: ExecuteContext) : AdBase(ctx) { private var mAd: RewardedAd? = null + private var destroyed = false + private var pendingLoad: ExecuteContext? = null + override fun onDestroy() { + if (destroyed) return + destroyed = true + pendingLoad?.reject("Ad is destroyed") + pendingLoad = null clear() super.onDestroy() } override fun load(ctx: ExecuteContext) { + if (destroyed) return ctx.reject("Ad is destroyed") + pendingLoad?.reject("Ad load replaced") + pendingLoad = ctx clear() RewardedAd.load(plugin.activity, adUnitId, adRequest, object : RewardedAdLoadCallback() { override fun onAdFailedToLoad(loadAdError: LoadAdError) { + if (destroyed || pendingLoad !== ctx) return + pendingLoad = null mAd = null emit(Events.AD_LOAD_FAIL, loadAdError) ctx.reject(loadAdError.toString()) } override fun onAdLoaded(rewardedAd: RewardedAd) { + if (destroyed || pendingLoad !== ctx) return + pendingLoad = null mAd = rewardedAd rewardedAd.onPaidEventListener = paidEventListener("rewarded") { rewardedAd.responseInfo } diff --git a/src/plugins/admob/src/www/ads/base.ts b/src/plugins/admob/src/www/ads/base.ts index 35395e0697..b9fab64dc9 100644 --- a/src/plugins/admob/src/www/ads/base.ts +++ b/src/plugins/admob/src/www/ads/base.ts @@ -19,6 +19,8 @@ export class MobileAd { protected readonly opts: T; private _initPromise: ReturnType | undefined; + private _destroyPromise: Promise | undefined; + private _destroyed = false; constructor(opts: T) { this.opts = opts; @@ -79,13 +81,30 @@ export class MobileAd { return execAsync("adHide", [{ id: this.id }]); } + protected destroy(): Promise { + if (this._destroyPromise) return this._destroyPromise; + this._destroyed = true; + if (MobileAd.allAds[this.id] === this) delete MobileAd.allAds[this.id]; + this._destroyPromise = (async () => { + // Creation may already be in flight; dispose only after it settles. + if (this._initPromise) { + await this._initPromise; + await execAsync("adDestroy", [{ id: this.id }]); + } + })(); + return this._destroyPromise; + } + protected async init() { + if (this._destroyed) throw new Error("Ad is destroyed"); // biome-ignore lint/suspicious/noAssignInExpressions: - return (this._initPromise ??= this._init()); + await (this._initPromise ??= this._init()); + if (this._destroyed) throw new Error("Ad is destroyed"); } private async _init() { await admob.start(); + if (this._destroyed) return; const cls = (this.constructor as unknown as { cls?: string }).cls ?? diff --git a/src/plugins/admob/src/www/ads/rewarded.ts b/src/plugins/admob/src/www/ads/rewarded.ts index 9f1b853e0c..c26ac659ce 100644 --- a/src/plugins/admob/src/www/ads/rewarded.ts +++ b/src/plugins/admob/src/www/ads/rewarded.ts @@ -23,4 +23,9 @@ export class RewardedAd extends MobileAd { public show() { return super.show(); } + + /** Release an Android rewarded ad after dismissal or before presentation. */ + public destroy() { + return super.destroy(); + } } diff --git a/src/plugins/admob/src/www/common.ts b/src/plugins/admob/src/www/common.ts index bdd8ef81ae..a3c0f0e133 100644 --- a/src/plugins/admob/src/www/common.ts +++ b/src/plugins/admob/src/www/common.ts @@ -2,6 +2,7 @@ export const CordovaService = "AdMob"; export type CordovaAction = | "adCreate" + | "adDestroy" | "adHide" | "adIsLoaded" | "adLoad" diff --git a/src/plugins/admob/www/admob.js b/src/plugins/admob/www/admob.js index a586f5832a..3dc046dac2 100644 --- a/src/plugins/admob/www/admob.js +++ b/src/plugins/admob/www/admob.js @@ -81,6 +81,7 @@ function execAsync(action, args) { class MobileAd { constructor(opts) { var _a; + this._destroyed = false; this.opts = opts; this.id = (_a = opts.id) !== null && _a !== void 0 ? _a : opts.adUnitId; MobileAd.allAds[this.id] = this; @@ -137,17 +138,38 @@ class MobileAd { return execAsync("adHide", [{ id: this.id }]); }); } + destroy() { + if (this._destroyPromise) + return this._destroyPromise; + this._destroyed = true; + if (MobileAd.allAds[this.id] === this) + delete MobileAd.allAds[this.id]; + this._destroyPromise = (() => __awaiter(this, void 0, void 0, function* () { + // Creation may already be in flight; dispose only after it settles. + if (this._initPromise) { + yield this._initPromise; + yield execAsync("adDestroy", [{ id: this.id }]); + } + }))(); + return this._destroyPromise; + } init() { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; + if (this._destroyed) + throw new Error("Ad is destroyed"); // biome-ignore lint/suspicious/noAssignInExpressions: - return ((_a = this._initPromise) !== null && _a !== void 0 ? _a : (this._initPromise = this._init())); + yield ((_a = this._initPromise) !== null && _a !== void 0 ? _a : (this._initPromise = this._init())); + if (this._destroyed) + throw new Error("Ad is destroyed"); }); } _init() { - var _a; return __awaiter(this, void 0, void 0, function* () { + var _a; yield admob.start(); + if (this._destroyed) + return; const cls = (_a = this.constructor.cls) !== null && _a !== void 0 ? _a : this.constructor.name; return execAsync("adCreate", [Object.assign(Object.assign({}, this.opts), { id: this.id, cls })]); }); @@ -318,6 +340,10 @@ class RewardedAd extends MobileAd { show() { return super.show(); } + /** Release an Android rewarded ad after dismissal or before presentation. */ + destroy() { + return super.destroy(); + } } RewardedAd.cls = "RewardedAd"; diff --git a/src/plugins/system/android/com/foxdebug/system/System.java b/src/plugins/system/android/com/foxdebug/system/System.java index c97ef0c77d..53e0f6a6e7 100644 --- a/src/plugins/system/android/com/foxdebug/system/System.java +++ b/src/plugins/system/android/com/foxdebug/system/System.java @@ -76,6 +76,21 @@ public class System extends CordovaPlugin { private static final String TAG = "SystemPlugin"; private CallbackContext requestPermissionCallback; + private static final Map APP_ICON_ALIASES; + + static { + Map aliases = new HashMap<>(); + aliases.put("default", "MainActivityIconDefault"); + aliases.put("pro", "MainActivityIconPro"); + aliases.put("midnight_circuit", "MainActivityIconMidnightCircuit"); + aliases.put("aurora_pulse", "MainActivityIconAuroraPulse"); + aliases.put("terminal_glow", "MainActivityIconTerminalGlow"); + aliases.put("solar_flare", "MainActivityIconSolarFlare"); + aliases.put("blueprint", "MainActivityIconBlueprint"); + aliases.put("pixel_party", "MainActivityIconPixelParty"); + APP_ICON_ALIASES = Collections.unmodifiableMap(aliases); + } + private Activity activity; private Context context; private int REQ_PERMISSIONS = 1; @@ -159,6 +174,9 @@ public void run() { } ); return true; + case "set-app-icon": + setAppIcon(arg1, callbackContext); + return true; case "get-cordova-intent": getCordovaIntent(callbackContext); return true; @@ -2185,6 +2203,45 @@ private void setNativeContextMenuDisabled(boolean disabled) { webView.setNativeContextMenuDisabled(disabled); } + /** + * Dynamically changes the app icon by toggling activity-alias components. + * + *

The launcher icon is always represented by an activity-alias (including + * the default icon) so that the running MainActivity component never has to + * be disabled. Disabling the currently running component would make Android + * force-stop/restart the app, so only aliases are toggled here. + * + * @param iconName Icon id (e.g. "midnight_circuit") or "default" to restore + * the original launcher icon. + * @param callback Callback invoked with the result. + */ + private void setAppIcon(String iconName, CallbackContext callback) { + try { + String packageName = context.getPackageName(); + PackageManager pm = context.getPackageManager(); + String key = iconName == null ? "default" : iconName.toLowerCase(); + + if (!APP_ICON_ALIASES.containsKey(key)) { + callback.error("Unknown app icon: " + iconName); + return; + } + + for (Map.Entry entry : APP_ICON_ALIASES.entrySet()) { + boolean enabled = entry.getKey().equals(key); + pm.setComponentEnabledSetting( + new ComponentName(packageName, packageName + "." + entry.getValue()), + enabled + ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP + ); + } + callback.success(); + } catch (Exception e) { + callback.error(e.toString()); + } + } + private void extractAsset( String assetName, String destinationPath, diff --git a/src/plugins/system/system.d.ts b/src/plugins/system/system.d.ts index aa2ef8bf7f..6131045068 100644 --- a/src/plugins/system/system.d.ts +++ b/src/plugins/system/system.d.ts @@ -295,6 +295,13 @@ interface System { onSuccess?: () => void, onFail?: OnFail, ): void; + /** + * Change the app icon at runtime. + * @param iconName Icon id, e.g. "midnight_circuit", or "default" to restore the original icon + * @param onSuccess + * @param onFail + */ + setAppIcon(iconName: string, onSuccess: OnSuccessBool, onFail: OnFail): void; } interface Window{ diff --git a/src/plugins/system/www/plugin.js b/src/plugins/system/www/plugin.js index 8bebd47efd..c8722e7e4a 100644 --- a/src/plugins/system/www/plugin.js +++ b/src/plugins/system/www/plugin.js @@ -231,6 +231,15 @@ module.exports = { [String(!!disabled)] ); }, + /** + * Change the app icon at runtime. + * @param iconName Icon id, e.g. "midnight_circuit", or "default" to restore the original icon + * @param onSuccess + * @param onFail + */ + setAppIcon: function (iconName, onSuccess, onFail) { + cordova.exec(onSuccess, onFail, 'System', 'set-app-icon', [iconName]); + }, getGlobalSetting: function (key, onSuccess, onFail) { cordova.exec(onSuccess, onFail, 'System', 'get-global-setting', [key]); }, diff --git a/src/settings/appSettings.js b/src/settings/appSettings.js index a7f912f74c..2817bb52ff 100644 --- a/src/settings/appSettings.js +++ b/src/settings/appSettings.js @@ -6,11 +6,13 @@ import loader from "dialogs/loader"; import select from "dialogs/select"; import actions from "handlers/quickTools"; import actionStack from "lib/actionStack"; +import { getAppIconLabel } from "lib/appIcons"; import config from "lib/config"; import fonts from "lib/fonts"; import lang from "lib/lang"; import openFile from "lib/openFile"; import appSettings from "lib/settings"; +import appIconSetting from "pages/appIconSetting"; import FontManager from "pages/fontManager"; import QuickToolsSettings from "pages/quickTools"; import encodings, { getEncoding } from "utils/encodings"; @@ -64,6 +66,17 @@ export default function otherSettings() { info: strings["settings-info-app-fullscreen"], category: categories.interface, }, + { + key: "appIcon", + text: strings["app icon"] || "App icon", + value: values.appIcon || "default", + valueText: (value) => getAppIconLabel(value), + info: + strings["settings-info-app-icon"] || + "Choose the app icon displayed on your device.", + category: categories.interface, + chevron: true, + }, { key: "uiZoom", text: strings["ui zoom"] || "UI zoom", @@ -391,6 +404,20 @@ export default function otherSettings() { FontManager(); return; + case "appIcon": + await appIconSetting(); + { + const item = items.find((i) => i.key === "appIcon"); + if (item) item.value = appSettings.value.appIcon || "default"; + const $value = this.get(".setting-trailing-value"); + if ($value) { + $value.textContent = getAppIconLabel( + appSettings.value.appIcon || "default", + ); + } + } + return; + case "appFont": await fonts.setAppFont(value); break; diff --git a/src/settings/mainSettings.js b/src/settings/mainSettings.js index 2946f57c72..d43a866ca4 100644 --- a/src/settings/mainSettings.js +++ b/src/settings/mainSettings.js @@ -1,14 +1,11 @@ import settingsPage from "components/settingsPage"; import confirm from "dialogs/confirm"; -import loader from "dialogs/loader"; import rateBox from "dialogs/rateBox"; import actionStack from "lib/actionStack"; -import auth from "lib/auth"; import config from "lib/config"; -import customTab from "lib/customTab"; import openFile from "lib/openFile"; import { bindPrivacyChoices } from "lib/privacyChoicesController.mjs"; -import removeAds from "lib/removeAds"; +import { requestProPurchase } from "lib/removeAds"; import appSettings from "lib/settings"; import settings from "lib/settings"; import { showPrivacyOptions, subscribePrivacyState } from "lib/startAd"; @@ -289,48 +286,7 @@ export default function mainSettings() { case "removeads": try { - if (!helpers.shouldAllowExternalPurchase()) { - await removeAds(); - this.remove(); - break; - } - - loader.create(strings.login, strings["loading..."]); - - try { - let user = await auth.getLoggedInUser(); - if (!user) { - const confirmation = await confirm( - strings.confirm, - strings["confirm-login"], - ); - - if (!confirmation) { - return; - } - - loader.show(); - await auth.login(); - - user = await auth.getLoggedInUser(); - } - - if (!user) { - throw new Error("Unable to fetch user"); - } - - if (user.acode_pro) { - this.remove(); - return; - } - } catch (error) { - helpers.error(error); - return; - } finally { - loader.destroy(); - } - - customTab(`${config.BASE_URL}/pro?redirect=app`).catch(helpers.error); + if (await requestProPurchase()) this.remove(); } catch (error) { helpers.error(error); } diff --git a/tests/admob/adRewards.test.js b/tests/admob/adRewards.test.js new file mode 100644 index 0000000000..de4fb1ffa8 --- /dev/null +++ b/tests/admob/adRewards.test.js @@ -0,0 +1,73 @@ +import { afterEach, beforeEach, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + show: vi.fn(), + getStatus: vi.fn(), + redeem: vi.fn(), + suppress: vi.fn(), +})); +vi.mock("components/toast", () => ({ default: vi.fn() })); +vi.mock("lib/config", () => ({ default: { HAS_PRO: false } })); +vi.mock("lib/rewardedAd", () => ({ + default: mocks.show, + isRewardedAdSupported: () => true, + isWatchingRewardedAd: () => false, +})); +vi.mock("lib/startAd", () => ({ setBannerSuppressed: mocks.suppress })); +vi.mock("lib/secureAdRewardState", () => ({ + default: { getStatus: mocks.getStatus, redeem: mocks.redeem }, +})); +let adRewards; +beforeEach(async () => { + vi.resetModules(); + vi.useFakeTimers(); + vi.clearAllMocks(); + vi.stubGlobal("window", {}); + vi.stubGlobal("user", { id: "test-user" }); + vi.stubGlobal("strings", { "rewarded ad incomplete": "Incomplete" }); + mocks.getStatus.mockResolvedValue({ canRedeem: true }); + mocks.show.mockResolvedValue(true); + mocks.redeem.mockResolvedValue({ + canRedeem: true, + isActive: true, + adFreeUntil: Date.now() + 3_600_000, + appliedDurationMs: 3_600_000, + }); + ({ default: adRewards } = await import("lib/adRewards")); +}); +afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); +}); + +it("shares duplicate pass requests during status refresh and preserves step verification", async () => { + let refreshed; + mocks.getStatus.mockImplementationOnce( + () => + new Promise((resolve) => { + refreshed = resolve; + }), + ); + const first = adRewards.watchOffer("focus"); + const duplicate = adRewards.watchOffer("focus"); + refreshed({ canRedeem: true }); + await Promise.all([first, duplicate]); + expect(mocks.show).toHaveBeenCalledTimes(2); + const firstMetadata = mocks.show.mock.calls[0][0].serverSideVerification; + const secondMetadata = mocks.show.mock.calls[1][0].serverSideVerification; + expect(firstMetadata.userId).toBe("test-user"); + expect(firstMetadata.customData).toContain("&offer=focus&step=1&ads=2"); + expect(secondMetadata.customData).toBe( + firstMetadata.customData.replace("step=1", "step=2"), + ); + expect(mocks.redeem).toHaveBeenCalledExactlyOnceWith("focus"); + expect(adRewards.isAdFreeActive()).toBe(true); +}); +it("never grants a pass for an incomplete reward and permits retry", async () => { + mocks.show.mockResolvedValueOnce(false); + await expect(adRewards.watchOffer("quick")).rejects.toThrow("Incomplete"); + expect(mocks.redeem).not.toHaveBeenCalled(); + expect(adRewards.isWatchingReward()).toBe(false); + await adRewards.watchOffer("quick"); + expect(mocks.redeem).toHaveBeenCalledExactlyOnceWith("quick"); +}); diff --git a/tests/admob/rewardedAd.test.js b/tests/admob/rewardedAd.test.js new file mode 100644 index 0000000000..06a726e271 --- /dev/null +++ b/tests/admob/rewardedAd.test.js @@ -0,0 +1,342 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { RewardedAd } from "../../src/plugins/admob/src/www/ads/rewarded"; +const mocks = vi.hoisted(() => ({ + start: vi.fn(), + config: { HAS_PRO: false }, + ready: true, + allowed: true, +})); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/startAd", () => ({ + default: mocks.start, + adUnitIdRewarded: "test-unit", + get initialized() { + return mocks.ready; + }, + getPrivacyState: () => ({ canRequestAds: mocks.allowed }), +})); +let showRewardedAd; +let instances; +const flush = async () => { + for (let i = 0; i < 8; i++) await Promise.resolve(); +}; +class Ad { + constructor(options) { + this.options = options; + this.id = options.id; + this.listeners = new Map(); + instances.push(this); + } + on(name, listener) { + this.listeners.set(name, listener); + return () => this.listeners.delete(name); + } + emit(name) { + this.listeners.get(name)?.(); + } + load = vi.fn().mockResolvedValue(); + show = vi.fn().mockResolvedValue(); + destroy = vi.fn().mockResolvedValue(); +} +beforeEach(async () => { + vi.resetModules(); + vi.useFakeTimers(); + instances = []; + mocks.config.HAS_PRO = false; + mocks.ready = true; + mocks.allowed = true; + mocks.start.mockReset().mockResolvedValue(); + vi.stubGlobal("window", { ANDROID_SDK_INT: 36 }); + vi.stubGlobal("admob", { RewardedAd: Ad }); + vi.stubGlobal("strings", { + "rewarded ad unavailable": "Unavailable", + "rewarded ad failed": "Failed", + }); + ({ default: showRewardedAd } = await import("lib/rewardedAd")); +}); +afterEach(() => { + vi.restoreAllMocks(); + vi.useRealTimers(); + vi.unstubAllGlobals(); +}); + +describe("shared rewarded ad lifecycle", () => { + it("waits for reward AND dismissal, retaining verification metadata and cleaning listeners", async () => { + const verification = { userId: "guest", customData: "offer=quick&step=1" }; + const done = vi.fn(); + const result = showRewardedAd({ serverSideVerification: verification }); + result.then(done); + await flush(); + const ad = instances[0]; + expect(ad.options.serverSideVerification).toEqual(verification); + expect(ad.options.adUnitId).toBe("test-unit"); + ad.emit("reward"); + await flush(); + expect(done).not.toHaveBeenCalled(); + ad.emit("dismiss"); + await expect(result).resolves.toBe(true); + expect(ad.listeners.size).toBe(0); + expect(ad.destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + }); + it.each([ + "dismiss", + "loadfail", + "showfail", + "load rejection", + "show rejection", + "show false", + ])("settles and cleans up on %s", async (event) => { + if (event === "loadfail") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockImplementation(async () => { + this.emit("loadfail"); + throw new Error("network"); + }); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "load rejection") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockRejectedValue(new Error("network")); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "show rejection") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.show.mockRejectedValue(new Error("show")); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + if (event === "show false") + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.show.mockResolvedValue(false); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + const result = showRewardedAd(); + const assertion = + event === "dismiss" + ? expect(result).resolves.toBe(false) + : expect(result).rejects.toThrow("Failed"); + await flush(); + instances[0].emit(event); + await assertion; + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + const retry = showRewardedAd(); + await flush(); + instances[1].emit("reward"); + instances[1].emit("dismiss"); + await expect(retry).resolves.toBe(true); + vi.restoreAllMocks(); + }); + it.each([ + "paid", + "missing SDK", + "unsupported Android", + "no consent", + "not initialized", + ])("does not load ads for %s", async (reason) => { + if (reason === "paid") mocks.config.HAS_PRO = true; + if (reason === "missing SDK") vi.stubGlobal("admob", undefined); + if (reason === "unsupported Android") window.ANDROID_SDK_INT = 28; + if (reason === "no consent") mocks.allowed = false; + if (reason === "not initialized") mocks.ready = false; + await expect(showRewardedAd()).rejects.toThrow(); + expect(instances).toHaveLength(0); + }); + it("cancels loading and ignores late callbacks without unlocking a subsequent ad", async () => { + let finishInit; + mocks.start.mockImplementationOnce( + () => + new Promise((resolve) => { + finishInit = resolve; + }), + ); + const controller = new AbortController(); + const old = showRewardedAd({ signal: controller.signal }); + controller.abort(); + await expect(old).resolves.toBe(false); + const next = showRewardedAd(); + await flush(); + finishInit(); + await flush(); + expect(instances).toHaveLength(1); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[0].emit("dismiss"); + await next; + }); + it("holds the full-screen lock after cancellation until native dismissal", async () => { + const controller = new AbortController(); + const result = showRewardedAd({ signal: controller.signal }); + await flush(); + controller.abort(); + await expect(result).resolves.toBe(false); + expect(instances[0].destroy).not.toHaveBeenCalled(); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[0].emit("reward"); + instances[0].emit("dismiss"); + const next = showRewardedAd(); + await flush(); + instances[1].emit("dismiss"); + await next; + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + }); + it("ignores an abandoned load rejection while a newer ad is active", async () => { + let rejectLoad; + vi.spyOn(Ad.prototype, "on").mockImplementationOnce( + function (name, callback) { + this.load.mockImplementation( + () => + new Promise((resolve, reject) => { + rejectLoad = reject; + }), + ); + this.listeners.set(name, callback); + return () => this.listeners.delete(name); + }, + ); + const controller = new AbortController(); + const old = showRewardedAd({ signal: controller.signal }); + await flush(); + controller.abort(); + await expect(old).resolves.toBe(false); + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + const next = showRewardedAd(); + await flush(); + rejectLoad(new Error("Late failure")); + await flush(); + expect(instances[0].show).not.toHaveBeenCalled(); + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + instances[1].emit("dismiss"); + await next; + vi.restoreAllMocks(); + }); + it("rejects a presentation timeout and ignores late reward and dismissal", async () => { + const result = showRewardedAd(); + const assertion = expect(result).rejects.toThrow("Failed"); + await flush(); + await vi.advanceTimersByTimeAsync(90_000); + await assertion; + await expect(showRewardedAd()).rejects.toThrow("Unavailable"); + expect(instances[0].destroy).not.toHaveBeenCalled(); + instances[0].emit("reward"); + instances[0].emit("dismiss"); + expect(instances[0].listeners.size).toBe(0); + expect(instances[0].destroy).toHaveBeenCalledOnce(); + expect(vi.getTimerCount()).toBe(0); + }); + it("times out initialization and never presents a late ad", async () => { + let complete; + mocks.start.mockImplementation( + () => + new Promise((resolve) => { + complete = resolve; + }), + ); + const result = showRewardedAd(); + const assertion = expect(result).rejects.toThrow("Failed"); + await vi.advanceTimersByTimeAsync(90_000); + await assertion; + complete(); + await flush(); + expect(instances).toHaveLength(0); + expect(vi.getTimerCount()).toBe(0); + }); +}); + +describe("rewarded wrapper disposal", () => { + let calls; + beforeEach(() => { + calls = []; + admob.start = vi.fn().mockResolvedValue(); + vi.stubGlobal("cordova", { + exec: vi.fn((resolve, reject, service, action, args) => { + calls.push({ action, id: args[0].id, resolve, reject }); + if (action !== "adCreate" && action !== "adLoad") resolve(); + }), + }); + }); + it("disposes an unused ad once without creating native resources", async () => { + const ad = new RewardedAd({ id: "unused", adUnitId: "test" }); + expect(window.admobAds.unused).toBe(ad); + const disposed = ad.destroy(); + expect(ad.destroy()).toBe(disposed); + await disposed; + expect(window.admobAds.unused).toBeUndefined(); + expect(calls).toEqual([]); + await expect(ad.load()).rejects.toThrow("Ad is destroyed"); + }); + it.each(["SDK startup", "native creation"])( + "cancels during %s without issuing a late load or show", + async (phase) => { + let started; + if (phase === "SDK startup") { + admob.start.mockImplementation( + () => + new Promise((resolve) => { + started = resolve; + }), + ); + } + const ad = new RewardedAd({ id: "old", adUnitId: "test" }); + const loading = ad.load(); + const rejected = expect(loading).rejects.toThrow("Ad is destroyed"); + await flush(); + const disposed = ad.destroy(); + expect(ad.destroy()).toBe(disposed); + const next = new RewardedAd({ id: "next", adUnitId: "test" }); + if (started) started(); + else calls.find(({ action }) => action === "adCreate").resolve(); + await Promise.all([disposed, rejected]); + expect(calls.filter(({ action }) => action === "adLoad")).toEqual([]); + expect( + calls + .filter(({ action }) => action === "adDestroy") + .map(({ id }) => id), + ).toEqual(["old"]); + expect(window.admobAds.old).toBeUndefined(); + expect(window.admobAds.next).toBe(next); + await expect(ad.show()).rejects.toThrow("Ad is destroyed"); + await next.destroy(); + }, + ); + it("destroys a pending native load and ignores its late completion", async () => { + const ad = new RewardedAd({ id: "loading", adUnitId: "test" }); + const loading = ad.load(); + const rejected = expect(loading).rejects.toThrow("Ad is destroyed"); + await flush(); + calls[0].resolve(); + await flush(); + const load = calls.find(({ action }) => action === "adLoad"); + cordova.exec.mockImplementation( + (resolve, reject, service, action, args) => { + calls.push({ action, id: args[0].id }); + load.reject(new Error("Ad is destroyed")); + resolve(); + }, + ); + await ad.destroy(); + load.resolve(); + await rejected; + await ad.destroy(); + expect(calls.map(({ action }) => action)).toEqual([ + "adCreate", + "adLoad", + "adDestroy", + ]); + expect(window.admobAds.loading).toBeUndefined(); + }); +}); diff --git a/tests/unit/androidPrepare.test.js b/tests/unit/androidPrepare.test.js new file mode 100644 index 0000000000..8f29d5a15a --- /dev/null +++ b/tests/unit/androidPrepare.test.js @@ -0,0 +1,76 @@ +import fs from "node:fs"; +import { createRequire } from "node:module"; +import os from "node:os"; +import path from "node:path"; +import vm from "node:vm"; +import { expect, it } from "vitest"; + +const require = createRequire(import.meta.url); +const hook = fs.readFileSync( + new URL("../../hooks/post-process.js", import.meta.url), + "utf8", +); + +it("refreshes stale System plugin Java alongside icons on repeated Android prepares", () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "acode-prepare-")); + const write = (file, content) => { + const target = path.join(root, file); + fs.mkdirSync(path.dirname(target), { recursive: true }); + fs.writeFileSync(target, content); + return target; + }; + try { + write("config.xml", ''); + write("build-extras.gradle", "// build configuration"); + write("res/android/drawable/ic_acode_pro.xml", ""); + const source = write( + "src/plugins/system/android/com/foxdebug/system/System.java", + 'aliases.put("pro", "MainActivityIconPro");', + ); + const generated = write( + "platforms/android/app/src/main/java/com/foxdebug/system/System.java", + 'aliases.put("default", "MainActivityIconDefault");', + ); + const unrelated = write( + "platforms/android/app/src/main/java/other/Plugin.java", + "// other plugin", + ); + const prepare = () => + vm.runInNewContext(hook, { + __dirname: path.join(root, "hooks"), + process: { env: { TMPDIR: root } }, + console: { log() {}, warn() {}, error() {} }, + require(id) { + if (id === "child_process") + return { + execSync(command) { + expect(command).toBe("npm prefix"); + return Buffer.from(root); + }, + }; + return require(id); + }, + }); + prepare(); + expect(fs.readFileSync(generated, "utf8")).toBe( + fs.readFileSync(source, "utf8"), + ); + fs.appendFileSync(source, "\n// subsequent native edit"); + prepare(); + expect(fs.readFileSync(generated, "utf8")).toBe( + fs.readFileSync(source, "utf8"), + ); + expect(fs.readFileSync(unrelated, "utf8")).toBe("// other plugin"); + expect( + fs.readFileSync( + path.join( + root, + "platforms/android/app/src/main/res/drawable/ic_acode_pro.xml", + ), + "utf8", + ), + ).toBe(""); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/tests/unit/appIconSelection.test.js b/tests/unit/appIconSelection.test.js new file mode 100644 index 0000000000..fc78dfc5b0 --- /dev/null +++ b/tests/unit/appIconSelection.test.js @@ -0,0 +1,170 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + config: { HAS_PRO: false }, + settings: { value: { appIcon: "default" }, update: vi.fn() }, + confirm: vi.fn(), + reward: vi.fn(), + purchase: vi.fn(), + toast: vi.fn(), + error: vi.fn(), + pass: false, +})); +vi.mock("components/toast", () => ({ default: mocks.toast })); +vi.mock("dialogs/confirm", () => ({ default: mocks.confirm })); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/settings", () => ({ default: mocks.settings })); +vi.mock("lib/adRewards", () => ({ + default: { canShowAds: () => !mocks.config.HAS_PRO && !mocks.pass }, +})); +vi.mock("lib/rewardedAd", () => ({ default: mocks.reward })); +vi.mock("lib/removeAds", () => ({ requestProPurchase: mocks.purchase })); +vi.mock("utils/helpers", () => ({ + default: { + error: mocks.error, + promisify: (fn, ...args) => + new Promise((resolve, reject) => fn(...args, resolve, reject)), + }, +})); +import createAppIconSelection from "lib/appIconSelection"; + +function harness() { + const controller = new AbortController(); + const onBusy = vi.fn(); + const onChange = vi.fn(); + return { + controller, + onBusy, + onChange, + select: createAppIconSelection({ + signal: controller.signal, + onBusy, + onChange, + }), + }; +} +beforeEach(() => { + vi.clearAllMocks(); + mocks.config.HAS_PRO = false; + mocks.pass = false; + mocks.settings.value.appIcon = "default"; + mocks.settings.update.mockImplementation(async ({ appIcon }) => { + mocks.settings.value.appIcon = appIcon; + }); + mocks.confirm.mockResolvedValue(true); + mocks.reward.mockResolvedValue(true); + mocks.purchase.mockResolvedValue(false); + vi.stubGlobal("strings", { + "app icon": "App icon", + "confirm app icon reward": "Watch?", + "app icon changed": "Changed", + "rewarded ad incomplete": "Incomplete", + }); + vi.stubGlobal("system", { setAppIcon: vi.fn((id, success) => success()) }); +}); + +describe("icon selection", () => { + it("opens Pro purchase without watching an ad or applying the locked icon", async () => { + mocks.pass = true; + const h = harness(); + mocks.purchase.mockImplementation(async () => { + mocks.config.HAS_PRO = true; + }); + await h.select("pro"); + expect(mocks.purchase).toHaveBeenCalledOnce(); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(system.setAppIcon).not.toHaveBeenCalled(); + await h.select("pro"); + expect(system.setAppIcon).toHaveBeenCalledWith( + "pro", + expect.any(Function), + expect.any(Function), + ); + }); + it.each([ + "default", + "paid", + "pass", + ])("skips rewarded ads for %s", async (kind) => { + mocks.settings.value.appIcon = "pixel_party"; + mocks.config.HAS_PRO = kind === "paid"; + mocks.pass = kind === "pass"; + await harness().select(kind === "default" ? "default" : "midnight_circuit"); + expect(mocks.confirm).not.toHaveBeenCalled(); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(mocks.settings.update).toHaveBeenCalledOnce(); + expect(mocks.toast).toHaveBeenCalledWith("Changed"); + }); + it("ignores current/unknown icons and serializes confirmation and reward", async () => { + const h = harness(); + await h.select("default"); + await h.select("unknown"); + expect(h.onBusy).not.toHaveBeenCalled(); + let confirm; + mocks.confirm.mockImplementation( + () => + new Promise((resolve) => { + confirm = resolve; + }), + ); + const first = h.select("pixel_party"); + await h.select("solar_flare"); + expect(mocks.confirm).toHaveBeenCalledOnce(); + expect(mocks.reward).not.toHaveBeenCalled(); + confirm(true); + await first; + expect(system.setAppIcon.mock.calls[0][0]).toBe("pixel_party"); + expect(h.onBusy.mock.calls).toEqual([[true], [false]]); + expect(mocks.toast).toHaveBeenCalledTimes(1); + }); + it.each([ + "decline", + "incomplete", + "load failure", + "native failure", + ])("keeps the current selection on %s", async (kind) => { + if (kind === "decline") mocks.confirm.mockResolvedValue(false); + if (kind === "incomplete") mocks.reward.mockResolvedValue(false); + if (kind === "load failure") + mocks.reward.mockRejectedValue(new Error("Unavailable")); + if (kind === "native failure") + system.setAppIcon.mockImplementation((id, ok, fail) => + fail("Native failure"), + ); + const h = harness(); + await h.select("pixel_party"); + expect(mocks.settings.value.appIcon).toBe("default"); + expect(mocks.settings.update).not.toHaveBeenCalled(); + expect(mocks.toast).not.toHaveBeenCalledWith("Changed"); + expect(h.onBusy).toHaveBeenLastCalledWith(false); + if (kind === "decline") expect(mocks.reward).not.toHaveBeenCalled(); + }); + it("ignores a reward received after leaving the picker", async () => { + let finish; + mocks.reward.mockImplementation( + () => + new Promise((resolve) => { + finish = resolve; + }), + ); + const h = harness(); + const pending = h.select("pixel_party"); + await vi.waitFor(() => expect(finish).toBeTypeOf("function")); + h.controller.abort(); + finish(true); + await pending; + expect(system.setAppIcon).not.toHaveBeenCalled(); + expect(h.onChange).not.toHaveBeenCalled(); + expect(mocks.toast).not.toHaveBeenCalled(); + }); + it("does not apply after leaving during confirmation", async () => { + const h = harness(); + mocks.confirm.mockImplementation(async () => { + h.controller.abort(); + return true; + }); + await h.select("pixel_party"); + expect(mocks.reward).not.toHaveBeenCalled(); + expect(system.setAppIcon).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/unit/appIcons.test.js b/tests/unit/appIcons.test.js new file mode 100644 index 0000000000..77df9a0050 --- /dev/null +++ b/tests/unit/appIcons.test.js @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest"; +import { APP_ICONS, getAppIconLabel } from "lib/appIcons"; + +describe("appIcons", () => { + it("exposes the default icon first", () => { + expect(APP_ICONS[0].id).toBe("default"); + }); + + it("references an svg preview for each icon", () => { + for (const icon of APP_ICONS) { + expect(icon.image).toMatch(/\.svg$/); + } + }); + + describe("getAppIconLabel", () => { + it("returns the label for a known icon", () => { + expect(getAppIconLabel("midnight_circuit")).toBe("Midnight Circuit"); + }); + + it("falls back to the default label for unknown icons", () => { + expect(getAppIconLabel("unknown_icon")).toBe("Default"); + }); + }); +}); diff --git a/tests/unit/confirm.test.js b/tests/unit/confirm.test.js new file mode 100644 index 0000000000..0029941e48 --- /dev/null +++ b/tests/unit/confirm.test.js @@ -0,0 +1,117 @@ +import { Window } from "happy-dom"; +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +vi.mock("lib/settings", () => ({ + default: { value: { confirmOnExit: false } }, +})); +vi.mock("lib/restoreTheme", () => ({ default: vi.fn() })); +vi.mock("components/checkbox", () => ({ + default: () => document.createElement("input"), +})); +import confirm from "dialogs/confirm"; +import actionStack from "lib/actionStack"; +let window; +beforeEach(() => { + vi.useFakeTimers(); + vi.clearAllMocks(); + actionStack.setMark(); + window = new Window(); + vi.stubGlobal("document", window.document); + vi.stubGlobal("app", window.document.body); + vi.stubGlobal("strings", { ok: "OK", cancel: "Cancel" }); + vi.stubGlobal("tag", (name, options) => { + const el = document.createElement(name); + for (const [key, value] of Object.entries(options)) { + if (key === "children") el.append(...value); + else if (value !== undefined) el[key] = value; + } + return el; + }); +}); +afterEach(() => { + actionStack.clearFromMark(); + vi.runAllTimers(); + vi.restoreAllMocks(); + vi.useRealTimers(); + vi.unstubAllGlobals(); + window.happyDOM.cancelAsync(); +}); +it.each([ + "back", + "cancel", + "abort", +])("settles %s as cancellation and cleans the dialog", async (method) => { + const controller = new AbortController(); + const result = confirm("Icon", "Watch?", false, { + signal: controller.signal, + }); + if (method === "back") await actionStack.pop(); + if (method === "cancel") document.querySelector("button").click(); + if (method === "abort") controller.abort(); + await expect(result).resolves.toBe(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); +}); +it("preserves checkbox response and ignores subsequent dismissals", async () => { + const push = vi.spyOn(actionStack, "push"); + const remove = vi.spyOn(actionStack, "remove"); + const controller = new AbortController(); + const result = confirm("Icon", "Watch?", false, { + checkboxText: "Remember", + returnState: true, + signal: controller.signal, + }); + document.querySelector("input").checked = true; + document.querySelectorAll("button")[1].click(); + controller.abort(); + push.mock.calls[0][0].action(); + await expect(result).resolves.toEqual({ confirmed: true, checked: true }); + expect(remove).toHaveBeenCalledOnce(); + expect(actionStack.length).toBe(0); +}); + +it.each(["back", "cancel", "ok", "abort"])( + "preserves the lower confirmation's Back handler after %s dismisses the top", + async (method) => { + const firstClosed = vi.fn(); + confirm("First", "First confirmation").then(firstClosed); + const controller = new AbortController(); + const second = confirm("Second", "Second confirmation", false, { + signal: controller.signal, + }); + const top = document.querySelectorAll(".confirm")[1]; + if (method === "back") await actionStack.pop(); + if (method === "cancel") top.querySelector("button").click(); + if (method === "ok") top.querySelectorAll("button")[1].click(); + if (method === "abort") controller.abort(); + await expect(second).resolves.toBe(method === "ok"); + vi.runAllTimers(); + expect(document.querySelectorAll(".confirm")).toHaveLength(1); + expect(actionStack.length).toBe(1); + expect(firstClosed).not.toHaveBeenCalled(); + + await actionStack.pop(); + expect(firstClosed).toHaveBeenCalledExactlyOnceWith(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); + }, +); + +it("preserves the top confirmation when the lower one is aborted", async () => { + const controller = new AbortController(); + const first = confirm("First", "First confirmation", false, { + signal: controller.signal, + }); + const secondClosed = vi.fn(); + confirm("Second", "Second confirmation").then(secondClosed); + controller.abort(); + await expect(first).resolves.toBe(false); + expect(actionStack.length).toBe(1); + expect(secondClosed).not.toHaveBeenCalled(); + await actionStack.pop(); + expect(secondClosed).toHaveBeenCalledExactlyOnceWith(false); + vi.runAllTimers(); + expect(app.children.length).toBe(0); + expect(actionStack.length).toBe(0); +}); diff --git a/tests/unit/removeAds.test.js b/tests/unit/removeAds.test.js new file mode 100644 index 0000000000..cb6fecc7a9 --- /dev/null +++ b/tests/unit/removeAds.test.js @@ -0,0 +1,171 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +const mocks = vi.hoisted(() => ({ + config: { HAS_PRO: false, BASE_URL: "https://acode.app" }, + toast: vi.fn(), + suppress: vi.fn(), + confirm: vi.fn(), + customTab: vi.fn(), + auth: { getLoggedInUser: vi.fn(), login: vi.fn() }, + loader: { create: vi.fn(), show: vi.fn(), destroy: vi.fn() }, + external: false, +})); +vi.mock("components/toast", () => ({ default: mocks.toast })); +vi.mock("dialogs/confirm", () => ({ default: mocks.confirm })); +vi.mock("dialogs/loader", () => ({ default: mocks.loader })); +vi.mock("utils/helpers", () => ({ + default: { + error: vi.fn(), + shouldAllowExternalPurchase: () => mocks.external, + }, +})); +vi.mock("lib/auth", () => ({ default: mocks.auth })); +vi.mock("lib/config", () => ({ default: mocks.config })); +vi.mock("lib/customTab", () => ({ default: mocks.customTab })); +vi.mock("lib/startAd", () => ({ + BANNER_SUPPRESSION_REASON: { PRO: "pro" }, + setBannerSuppressed: mocks.suppress, +})); +import removeAds, { requestProPurchase } from "lib/removeAds"; +let purchaseUpdated; +let purchaseError; +beforeEach(() => { + vi.clearAllMocks(); + mocks.config.HAS_PRO = false; + mocks.external = false; + mocks.auth.getLoggedInUser + .mockReset() + .mockResolvedValue({ acode_pro: false }); + mocks.auth.login.mockResolvedValue(); + mocks.confirm.mockResolvedValue(true); + mocks.customTab.mockResolvedValue(); + vi.stubGlobal("strings", { + "no-product-info": "No product", + "purchase pending": "Pending", + failed: "Failed", + canceled: "Cancelled", + "thank you :)": "Thanks", + "confirm-login": "Login?", + }); + vi.stubGlobal("localStorage", { setItem: vi.fn() }); + vi.stubGlobal("iap", { + USER_CANCELED: 1, + ITEM_ALREADY_OWNED: 7, + PURCHASE_STATE_PURCHASED: 1, + PURCHASE_STATE_PENDING: 2, + getProducts: vi.fn((ids, ok) => ok([{ productId: "acode_pro_new" }])), + setPurchaseUpdatedListener: vi.fn((ok, fail) => { + purchaseUpdated = ok; + purchaseError = fail; + }), + purchase: vi.fn(), + acknowledgePurchase: vi.fn((token, ok) => ok()), + }); +}); + +describe("shared Pro purchase flow", () => { + it.each([ + "empty products", + "product error", + "product exception", + "launch error", + "empty purchase", + "pending", + "cancel", + ])("settles %s without granting Pro", async (kind) => { + if (kind === "empty products") + iap.getProducts.mockImplementation((ids, ok) => ok([])); + if (kind === "product error") + iap.getProducts.mockImplementation((ids, ok, fail) => + fail("Products failed"), + ); + if (kind === "product exception") + iap.getProducts.mockImplementation(() => { + throw new Error("Billing unavailable"); + }); + if (kind === "launch error") + iap.purchase.mockImplementation((id, ok, fail) => fail("Launch failed")); + const pending = removeAds(); + const assertion = expect(pending).rejects.toBeDefined(); + if (kind === "empty purchase") purchaseUpdated([]); + if (kind === "pending") purchaseUpdated([{ purchaseState: 2 }]); + if (kind === "cancel") purchaseError(1); + await assertion; + expect(mocks.config.HAS_PRO).toBe(false); + expect(mocks.suppress).not.toHaveBeenCalled(); + }); + it("shares an active billing request and grants Pro once after acknowledgement", async () => { + const first = removeAds(); + const duplicate = removeAds(); + expect(duplicate).toBe(first); + const value = [ + { purchaseState: 1, isAcknowledged: false, purchaseToken: "test" }, + ]; + purchaseUpdated(value); + await first; + purchaseUpdated(value); + expect(iap.purchase).toHaveBeenCalledOnce(); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.toast).toHaveBeenCalledOnce(); + expect(mocks.suppress).toHaveBeenCalledWith("pro", true); + }); + it("treats cancelled billing as a cancelled request", async () => { + const result = requestProPurchase(); + purchaseError(1); + await expect(result).resolves.toBe(false); + }); + it("honors a later confirmed purchase after reporting its pending state", async () => { + const result = removeAds(); + const assertion = expect(result).rejects.toBe("Pending"); + purchaseUpdated([{ purchaseState: 2 }]); + await assertion; + expect(mocks.config.HAS_PRO).toBe(false); + purchaseUpdated([{ purchaseState: 1, isAcknowledged: true }]); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.toast).toHaveBeenCalledOnce(); + }); + it("cancels pending product lookup and ignores its late result", async () => { + let productsLoaded; + iap.getProducts.mockImplementation((ids, ok) => { + productsLoaded = ok; + }); + const controller = new AbortController(); + const result = requestProPurchase({ signal: controller.signal }); + controller.abort(); + await expect(result).resolves.toBe(false); + productsLoaded([{ productId: "acode_pro_new" }]); + expect(iap.purchase).not.toHaveBeenCalled(); + expect(mocks.config.HAS_PRO).toBe(false); + }); + it("uses the existing external checkout and does not grant Pro merely for opening it", async () => { + mocks.external = true; + await expect(requestProPurchase()).resolves.toBe(false); + expect(mocks.customTab).toHaveBeenCalledWith( + "https://acode.app/pro?redirect=app", + ); + expect(iap.purchase).not.toHaveBeenCalled(); + expect(mocks.loader.destroy).toHaveBeenCalledOnce(); + }); + it("refreshes confirmed account Pro without checkout", async () => { + mocks.external = true; + mocks.auth.getLoggedInUser.mockResolvedValue({ acode_pro: true }); + await expect(requestProPurchase()).resolves.toBe(true); + expect(mocks.config.HAS_PRO).toBe(true); + expect(mocks.customTab).not.toHaveBeenCalled(); + }); + it("honors login cancellation and page closure before checkout", async () => { + mocks.external = true; + mocks.auth.getLoggedInUser.mockResolvedValue(null); + mocks.confirm.mockResolvedValue(false); + await expect(requestProPurchase()).resolves.toBe(false); + expect(mocks.auth.login).not.toHaveBeenCalled(); + const controller = new AbortController(); + mocks.auth.getLoggedInUser.mockImplementation(async () => { + controller.abort(); + return { acode_pro: false }; + }); + await expect( + requestProPurchase({ signal: controller.signal }), + ).resolves.toBe(false); + expect(mocks.customTab).not.toHaveBeenCalled(); + }); +}); diff --git a/www/icons/ic_acode_aurora_pulse.svg b/www/icons/ic_acode_aurora_pulse.svg new file mode 100644 index 0000000000..a5341b80bf --- /dev/null +++ b/www/icons/ic_acode_aurora_pulse.svg @@ -0,0 +1,37 @@ + + Acode Aurora Pulse app icon + White Acode mark floating over cyan, violet, and pink aurora ribbons. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_blueprint.svg b/www/icons/ic_acode_blueprint.svg new file mode 100644 index 0000000000..0c65026b46 --- /dev/null +++ b/www/icons/ic_acode_blueprint.svg @@ -0,0 +1,38 @@ + + Acode Blueprint app icon + Technical blue Acode mark over a crisp drafting grid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_default.svg b/www/icons/ic_acode_default.svg new file mode 100644 index 0000000000..8114270ea6 --- /dev/null +++ b/www/icons/ic_acode_default.svg @@ -0,0 +1,227 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_midnight_circuit.svg b/www/icons/ic_acode_midnight_circuit.svg new file mode 100644 index 0000000000..7de6506f59 --- /dev/null +++ b/www/icons/ic_acode_midnight_circuit.svg @@ -0,0 +1,33 @@ + + Acode Midnight Circuit app icon + Electric blue Acode mark on a midnight circuit board. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_pixel_party.svg b/www/icons/ic_acode_pixel_party.svg new file mode 100644 index 0000000000..6c5981a6c1 --- /dev/null +++ b/www/icons/ic_acode_pixel_party.svg @@ -0,0 +1,29 @@ + + Acode Pixel Party app icon + White Acode mark with cyan and pink pixel offsets on deep purple. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_pro.svg b/www/icons/ic_acode_pro.svg new file mode 100644 index 0000000000..3eb809143b --- /dev/null +++ b/www/icons/ic_acode_pro.svg @@ -0,0 +1,29 @@ + + Acode Pro app icon + Golden Acode mark on a midnight gradient. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_solar_flare.svg b/www/icons/ic_acode_solar_flare.svg new file mode 100644 index 0000000000..a5c1b38899 --- /dev/null +++ b/www/icons/ic_acode_solar_flare.svg @@ -0,0 +1,28 @@ + + Acode Solar Flare app icon + Warm white Acode mark over a vivid radial sunset. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/icons/ic_acode_terminal_glow.svg b/www/icons/ic_acode_terminal_glow.svg new file mode 100644 index 0000000000..1dbaa40f10 --- /dev/null +++ b/www/icons/ic_acode_terminal_glow.svg @@ -0,0 +1,33 @@ + + Acode Terminal Glow app icon + Phosphor green Acode mark on a dark terminal grid. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +