diff --git a/.github/workflows/community-release-notifier.yml b/.github/workflows/community-release-notifier.yml index 1b08d7bee3..5dc9daa458 100644 --- a/.github/workflows/community-release-notifier.yml +++ b/.github/workflows/community-release-notifier.yml @@ -56,7 +56,7 @@ jobs: id: vars env: INPUT_TAG: ${{ github.event.release.tag_name || inputs.tag_name }} - INPUT_URL: ${{ github.event.release.url || inputs.url }} + INPUT_URL: ${{ github.event.release.html_url || inputs.url }} INPUT_BODY: ${{ github.event.release.body || inputs.body }} run: | TAG="$INPUT_TAG" @@ -68,7 +68,12 @@ jobs: # Escape problematic characters for MarkdownV2 (very conservative escaping) # We escape: _ * [ ] ( ) ~ ` > # + - = | { } . ! \ BODY_SAFE=$(printf '%s' "$INPUT_BODY" | \ - sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g') + sed -E \ + -e 's/^[[:space:]]*##[[:space:]]*//' \ + -e 's/^[[:space:]]*\*[[:space:]]+/- /' \ + -e 's/\*\*([^*]*)\*\*/\*\1\*/g' \ + -e 's/\\!/!/g' \ + -e 's/@([A-Za-z0-9-]+)/@\1/g') TAG_SAFE=$(printf '%s' "$TAG" | sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g') if [[ "$TAG" == *"-nightly"* ]]; then @@ -140,7 +145,8 @@ jobs: ${{ steps.vars.outputs.announce }} ${{ steps.vars.outputs.body_safe }} - format: markdown + # disabled for time being see https://github.com/Acode-Foundation/Acode/pull/2832#discussion_r3887130617 + #format: markdown disable_web_page_preview: true # Only needed for topic-enabled supergroups/channels message_thread_id: ${{ secrets.TELEGRAM_MESSAGE_THREAD_ID }} diff --git a/.github/workflows/congrats.yml b/.github/workflows/congrats.yml new file mode 100644 index 0000000000..0ba154b32c --- /dev/null +++ b/.github/workflows/congrats.yml @@ -0,0 +1,77 @@ +name: Congrats + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + check-author: + runs-on: ubuntu-latest + if: github.repository_owner == 'acode-foundation' && github.event.head_commit.message != '' + outputs: + should_congratulate: ${{ steps.check.outputs.should_congratulate }} + steps: + - name: Check PR author + id: check + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ secrets.CONGRATSBOT_GITHUB_TOKEN }} + script: | + const { owner, repo } = context.repo; + const sha = context.sha; + + // Find the merged PR associated with this push commit + const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + owner, + repo, + commit_sha: sha, + }); + + const mergedPr = prs.find(pr => pr.merged_at !== null); + + if (!mergedPr) { + core.info('No merged PR found for this push.'); + core.setOutput('should_congratulate', 'false'); + return; + } + + const author = mergedPr.user; + + // Skip bots + if (author.type === 'Bot') { + core.info(`Skipping bot user: ${author.login}`); + core.setOutput('should_congratulate', 'false'); + return; + } + + // Check organization membership in team slug 'acode' + try { + await github.rest.teams.getMembershipForUserInOrg({ + org: owner, + team_slug: 'acode', + username: author.login, + }); + + core.info(`User ${author.login} is a member of team 'acode'. Skipping congrats.`); + core.setOutput('should_congratulate', 'false'); + } catch (error) { + if (error.status === 404) { + core.info(`User ${author.login} is not a member of team 'acode'. Sending congrats.`); + core.setOutput('should_congratulate', 'true'); + } else { + core.setFailed(`Error checking team membership: ${error.message}`); + } + } + + congrats: + needs: check-author + if: needs.check-author.outputs.should_congratulate == 'true' + uses: UnschooledGamer/automation/.github/workflows/congratsbot.yml@patch-1 # patch-1 for now + with: + EMOJIS: 🎉,🎊,🧑‍🚀,🥳,🙌,🚀,🦀,🔥,🚢 + secrets: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_CONGRATS }} diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index b7812b4341..4323996a06 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -106,7 +106,7 @@ jobs: allow-unsafe-pr-checkout: ${{ !!(inputs.is_PR && inputs.PR_NUMBER && github.event.pull_request.head.sha) }} - name: Setup Java - uses: actions/setup-java@v5 + uses: actions/setup-java@v6 with: distribution: temurin java-version: "21" diff --git a/CHANGELOG.md b/CHANGELOG.md index 60ee76afad..e824b1f7aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,44 @@ # Change Log +## v1.13.3 + +* refactor(file-browser): Replace plain object directory cache with `Map` by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2831 +* fix(editor): stabilize selection menu sizing and transitions by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2833 +* fix(editor): keep fullscreen controls above bottom pane tabs by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2834 +* chore(community-release-notifier): Change sed parsing - TG release notes by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/2832 +* fix(editor): restore cursor state and prevent tab-switch flash by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2835 +* feat(lsp): improve actions, navigation, and position handling by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2837 +* fix(editor): highlight all visible search matches by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2838 +* Translation: Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/2828 +* chore(deps): bump actions/setup-java from 5 to 6 by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/2821 +* feat: improved pluginContext by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/2806 +* fix(webview): retain instance when destroy fails by @azamkassim in https://github.com/Acode-Foundation/Acode/pull/2836 +* fix(sftp): recover from failed profile migration by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2840 + +## v1.13.2 + +* feat: stabilize SFTP and add secure SSH terminal integration by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2694 +* fix(lsp): correct workspace and document color capabilities and add tailwind lsp by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2736 +* refactor: Standardize DOM element dataset attributes across file browser component by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2543 +* fix(lsp): preserve websocket clients across tab switches by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2764 +* feat(plugins): expose static CodeMirror highlighter by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2769 +* refactor(loader): Extract `tailSpin` SVG component and dynamic gradient logic by @AuDevTist1C in https://github.com/Acode-Foundation/Acode/pull/2776 +* fix(quick-tools): prevent scrollbars during editor gestures by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2777 +* fix: fall back to internal storage when external storage is unavailable by @ulite-Amr in https://github.com/Acode-Foundation/Acode/pull/2781 +* fix(theme): prevent freeze when switching to system theme by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2790 +* fix(sftp): cancel stalled connections and prevent delayed errors by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2791 +* fix: admob issues by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/2800 +* fix(android): avoid splash surface crash on realme Android 13 by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2805 +* fix(session): restore picker documents and skip intent files tab by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2809 +* feat(console): isolate execution and improve mobile REPL UX by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2808 +* feat(console): follow active Acode theme by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2814 +* chore: improve Indonesian (id) language translations by @MatrixTM26 in https://github.com/Acode-Foundation/Acode/pull/2798 +* fix: preserve MIME type for plugin icons on plugin details page by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2818 +* fix(console): run JavaScript files in isolated worker by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2819 +* feat: plugin review by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/2826 +* Improve selection menu UX and plugin action overflow by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2813 +* fix(search): include restored files in global search by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/2830 + ## v1.12.9 * fix(admob): remove the policy-prohibited interstitial shown while exiting the app diff --git a/_typos.toml b/_typos.toml index 0b501dc4c1..8bc0f2fa3f 100644 --- a/_typos.toml +++ b/_typos.toml @@ -26,6 +26,7 @@ extend-exclude = [ "src/lang/it-it.json", "src/lang/ja-jp.json", "src/lang/ko-kr.json", + "src/lang/ln-ln.json", "src/lang/ml-in.json", "src/lang/mm-unicode.json", "src/lang/mm-zawgyi.json", diff --git a/bun.lock b/bun.lock index 33528b9faf..308c5a1031 100644 --- a/bun.lock +++ b/bun.lock @@ -6,19 +6,19 @@ "name": "com.foxdebug.acode", "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -28,15 +28,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -51,57 +51,57 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0", + "yargs": "^18.1.0", }, "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -126,33 +126,33 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0", + "ws": "^8.21.3", }, }, }, "overrides": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", - "@codemirror/language": "^6.12.3", + "@codemirror/commands": "^6.11.0", + "@codemirror/language": "^6.12.4", "@codemirror/lint": "^6.9.7", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.43.4", + "@codemirror/state": "^6.7.1", + "@codemirror/view": "^6.43.9", "tar": "^7.5.22", }, "packages": { @@ -164,7 +164,7 @@ "@babel/core": ["@babel/core@8.0.1", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-compilation-targets": "^8.0.0", "@babel/helpers": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0", "@types/gensync": "^1.0.5", "convert-source-map": "^2.0.0", "empathic": "^2.0.1", "gensync": "^1.0.0-beta.2", "import-meta-resolve": "^4.2.0", "json5": "^2.2.3", "obug": "^2.1.1", "semver": "^7.7.3" } }, "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw=="], - "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" } }, "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw=="], @@ -176,7 +176,7 @@ "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@1.0.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^8.0.0", "@babel/helper-plugin-utils": "^8.0.0", "lodash.debounce": "^4.0.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0" } }, "sha512-9jzVaTeZyXRDKTgUnNzcPQMO8y0ga3o+Z4fKjNet9Fcx7slgKa83qRbz0EwROSd6qO6CoEe/HQszqSPKb5lhkw=="], - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@8.0.0", "", { "dependencies": { "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ=="], @@ -204,7 +204,7 @@ "@babel/helpers": ["@babel/helpers@8.0.0", "", { "dependencies": { "@babel/template": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg=="], - "@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="], + "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@8.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-Ytgjjne4RnG3Oig7ik+NfY4ebRY30BPptVkkyu1f72eINJXRM3/bkU++tIc5aPvyLmo4KH20avq0xJ2o+9aEnw=="], @@ -332,13 +332,13 @@ "@babel/preset-typescript": ["@babel/preset-typescript@8.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-validator-option": "^8.0.0", "@babel/plugin-transform-modules-commonjs": "^8.0.1", "@babel/plugin-transform-typescript": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A=="], - "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], - "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.29.2", "", { "dependencies": { "core-js-pure": "^3.48.0" } }, "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw=="], + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.29.7", "", { "dependencies": { "core-js-pure": "^3.48.0" } }, "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ=="], "@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], - "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], "@babel/types": ["@babel/types@8.0.0", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.0" } }, "sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw=="], @@ -374,7 +374,7 @@ "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g=="], - "@codemirror/commands": ["@codemirror/commands@6.10.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q=="], + "@codemirror/commands": ["@codemirror/commands@6.11.0", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA=="], "@codemirror/lang-angular": ["@codemirror/lang-angular@0.1.4", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/lang-javascript": "^6.1.2", "@codemirror/language": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.3" } }, "sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g=="], @@ -384,7 +384,7 @@ "@codemirror/lang-go": ["@codemirror/lang-go@6.0.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/go": "^1.0.0" } }, "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg=="], - "@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/lang-html": ["@codemirror/lang-html@6.4.12", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w=="], "@codemirror/lang-java": ["@codemirror/lang-java@6.0.2", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@lezer/java": "^1.0.0" } }, "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ=="], @@ -398,7 +398,7 @@ "@codemirror/lang-liquid": ["@codemirror/lang-liquid@6.3.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.1" } }, "sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw=="], - "@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw=="], + "@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw=="], "@codemirror/lang-php": ["@codemirror/lang-php@6.0.2", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/php": "^1.0.0" } }, "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA=="], @@ -418,7 +418,7 @@ "@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.3", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ=="], - "@codemirror/language": ["@codemirror/language@6.12.3", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA=="], + "@codemirror/language": ["@codemirror/language@6.12.4", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A=="], "@codemirror/language-data": ["@codemirror/language-data@6.5.2", "", { "dependencies": { "@codemirror/lang-angular": "^0.1.0", "@codemirror/lang-cpp": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-go": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/lang-java": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/lang-jinja": "^6.0.0", "@codemirror/lang-json": "^6.0.0", "@codemirror/lang-less": "^6.0.0", "@codemirror/lang-liquid": "^6.0.0", "@codemirror/lang-markdown": "^6.0.0", "@codemirror/lang-php": "^6.0.0", "@codemirror/lang-python": "^6.0.0", "@codemirror/lang-rust": "^6.0.0", "@codemirror/lang-sass": "^6.0.0", "@codemirror/lang-sql": "^6.0.0", "@codemirror/lang-vue": "^0.1.1", "@codemirror/lang-wast": "^6.0.0", "@codemirror/lang-xml": "^6.0.0", "@codemirror/lang-yaml": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/legacy-modes": "^6.4.0" } }, "sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg=="], @@ -426,15 +426,15 @@ "@codemirror/lint": ["@codemirror/lint@6.9.7", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.42.0", "crelt": "^1.0.5" } }, "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg=="], - "@codemirror/lsp-client": ["@codemirror/lsp-client@github:Acode-Foundation/codemirror-lsp-client#db6930c", { "dependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/language": "^6.11.0", "@codemirror/lint": "^6.8.5", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.37.0", "@lezer/highlight": "^1.2.1", "marked": "^15.0.12", "vscode-languageserver-protocol": "^3.17.5" } }, "Acode-Foundation-codemirror-lsp-client-db6930c"], + "@codemirror/lsp-client": ["@codemirror/lsp-client@github:Acode-Foundation/codemirror-lsp-client#db6930c", { "dependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/language": "^6.11.0", "@codemirror/lint": "^6.8.5", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.37.0", "@lezer/highlight": "^1.2.1", "marked": "^15.0.12", "vscode-languageserver-protocol": "^3.17.5" } }, "Acode-Foundation-codemirror-lsp-client-db6930c", "sha512-yENf3NqsXGERWcvUL98FziXbUgkB1R4jU2kTQGYxwcZ6HwTP8+uwebs/j+HDRD7VbxRyemYJClvMNU8n0p8UPg=="], "@codemirror/search": ["@codemirror/search@6.7.1", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA=="], - "@codemirror/state": ["@codemirror/state@6.6.0", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ=="], + "@codemirror/state": ["@codemirror/state@6.7.1", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A=="], "@codemirror/theme-one-dark": ["@codemirror/theme-one-dark@6.1.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/highlight": "^1.0.0" } }, "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA=="], - "@codemirror/view": ["@codemirror/view@6.43.4", "", { "dependencies": { "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg=="], + "@codemirror/view": ["@codemirror/view@6.43.9", "", { "dependencies": { "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw=="], "@deadlyjack/ajax": ["@deadlyjack/ajax@1.2.6", "", {}, "sha512-VwZU8YUflO2/V/dl3dluu+3jg8Ghz/W5fwxD5Z21OZXKeV73d+vStKVBe4wi+Av2KbTR35K7Z+5Q3iIpjB41MA=="], @@ -448,16 +448,14 @@ "@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="], - "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + "@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="], - "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="], - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], @@ -514,9 +512,9 @@ "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], - "@mermaid-js/parser": ["@mermaid-js/parser@1.1.1", "", { "dependencies": { "@chevrotain/types": "~11.1.1" } }, "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw=="], + "@mermaid-js/parser": ["@mermaid-js/parser@1.2.1", "", { "dependencies": { "@chevrotain/types": "~11.1.2" } }, "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], "@netflix/nerror": ["@netflix/nerror@1.1.3", "", { "dependencies": { "assert-plus": "^1.0.0", "extsprintf": "^1.4.0", "lodash": "^4.17.15" } }, "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg=="], @@ -540,8 +538,6 @@ "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@9.0.3", "", { "dependencies": { "cacache": "^20.0.0", "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5" } }, "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg=="], - "@npmcli/move-file": ["@npmcli/move-file@1.1.2", "", { "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg=="], - "@npmcli/name-from-folder": ["@npmcli/name-from-folder@4.0.0", "", {}, "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg=="], "@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="], @@ -618,31 +614,39 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@rspack/binding": ["@rspack/binding@2.0.2", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.0.2", "@rspack/binding-darwin-x64": "2.0.2", "@rspack/binding-linux-arm64-gnu": "2.0.2", "@rspack/binding-linux-arm64-musl": "2.0.2", "@rspack/binding-linux-x64-gnu": "2.0.2", "@rspack/binding-linux-x64-musl": "2.0.2", "@rspack/binding-wasm32-wasi": "2.0.2", "@rspack/binding-win32-arm64-msvc": "2.0.2", "@rspack/binding-win32-ia32-msvc": "2.0.2", "@rspack/binding-win32-x64-msvc": "2.0.2" } }, "sha512-0kZPplW9GWx8mfC6DfsaRY3QBIYPuUs42JfmSM6aSb8tMHZAXQeLeMB8M+h8i4SeI+aFtCgO6UuYGtyWf7+L+A=="], + "@rspack/binding": ["@rspack/binding@2.2.0", "", { "optionalDependencies": { "@rspack/binding-darwin-arm64": "2.2.0", "@rspack/binding-darwin-x64": "2.2.0", "@rspack/binding-linux-arm64-gnu": "2.2.0", "@rspack/binding-linux-arm64-musl": "2.2.0", "@rspack/binding-linux-ppc64-gnu": "2.2.0", "@rspack/binding-linux-riscv64-gnu": "2.2.0", "@rspack/binding-linux-riscv64-musl": "2.2.0", "@rspack/binding-linux-s390x-gnu": "2.2.0", "@rspack/binding-linux-x64-gnu": "2.2.0", "@rspack/binding-linux-x64-musl": "2.2.0", "@rspack/binding-wasm32-wasi": "2.2.0", "@rspack/binding-win32-arm64-msvc": "2.2.0", "@rspack/binding-win32-ia32-msvc": "2.2.0", "@rspack/binding-win32-x64-msvc": "2.2.0" } }, "sha512-nxZzJqqB0EmEKp6qjzFNkBb/SgGt0k0DSENrLvAJgvVvrm3waVsubD0cfxtPlZY/rd5SzadzxWGEHRyFcds5nA=="], + + "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KAVVT7hp3NBjtc/RY2UtOjzzc8i+s4pIhW1p52UV+Aev6ywQCu3dXwkHTonpPvJO3hqLXc4zIMH5l4HbMqBm4g=="], + + "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-rzyJCX99aFwl540trsVMNZOgK4+IFm2d5+YeP+RdNo9Uprxloz8vHz0J4dYtaq6MRiCAyM60dAwEa3wJMwqWAQ=="], - "@rspack/binding-darwin-arm64": ["@rspack/binding-darwin-arm64@2.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0o7lbgBBsDlICWdjIH0q3e0BsSco4GRiImHWVfZSVEG+q2+ykZJvSvYCVhPM1Co375Z0S3VMPa/8SjcY1FHwlw=="], + "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0t8QOiOMcBV7RvPSsTJ5DQ4QCK6FIyUZy77qbxnS6asGTOXPZZn7V5cL26IxEv/wuHdQ6tQOXheau1fi+gGyBQ=="], - "@rspack/binding-darwin-x64": ["@rspack/binding-darwin-x64@2.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-tOwxZpoPlTlRs/w6UyUinXJ4TYRVHMlR7+eQxO1R3muKpixvhXQjtvoaY16HuFyTVky5F0IfOoWr3x9FEsgdLg=="], + "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BAvCukqcuHxUdE294ITCohvhVkEklW8RbkKkR36Uo0WyIiMPGrnvPjARPn0/4Q4xMAz7lUmC60sZrvJHlAOKMw=="], - "@rspack/binding-linux-arm64-gnu": ["@rspack/binding-linux-arm64-gnu@2.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-1ZD4YFhG1rmgqj+W8hfwHyKV8xDxGsc/3KgU0FwmiVEX7JfzhCkgBO/xlCG79kRKSrzuVzt4icO/G3cCKn0pag=="], + "@rspack/binding-linux-ppc64-gnu": ["@rspack/binding-linux-ppc64-gnu@2.2.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nCHqZLv/E8nm2ccGkb00F5DQtXxzGy3W3X73ArA+N0+zXJUnzRcSRSwr7AE8pVgP/FYfX4yMFgUXy0g0YxYGRA=="], - "@rspack/binding-linux-arm64-musl": ["@rspack/binding-linux-arm64-musl@2.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-/PtTkM/DsDLjeuXTmeJeRfbjCDbcL9jvoVgZrgxYFZ28y2cdLvbChbW9uigOzs5dQEs1CIBQXMTTj7KhdBTuQg=="], + "@rspack/binding-linux-riscv64-gnu": ["@rspack/binding-linux-riscv64-gnu@2.2.0", "", { "os": "linux", "cpu": "none" }, "sha512-CA3WEqKFDI6FAZTnCho2n9pmdPWZYAW/S8mqgxd0cx2Jix43at3VyLxhCC7ED5A9WBSFn/AdHaIbVtgoQHVhWA=="], - "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-bBjsZxMHRaPo6X9SokApm6ucs+UhXtAJFyJJyuk2BH4XJsLeCU9Dz1vMwioeohFbJUUeTASVPm6/BL+RhSaunw=="], + "@rspack/binding-linux-riscv64-musl": ["@rspack/binding-linux-riscv64-musl@2.2.0", "", { "os": "linux", "cpu": "none" }, "sha512-kHB960oClkoPRPZ6sdkhRvqbdRIlbpIMYd/Tbxfmn3DWQahiCk1pkUFJbOtFq3EgESxZISV4THl442W2Y57HvQ=="], - "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-HjlpInqzabDNkhVsUJpsHPqa9QYVWBViJoyWNjzXCAW0vKMDvwaphyUvokSinX8FGTlZi/sr5UEaHJo6XtQ35g=="], + "@rspack/binding-linux-s390x-gnu": ["@rspack/binding-linux-s390x-gnu@2.2.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-lVBdiffVo1jq0P0jT36jNou2suLB4ueQI4aWUs+HM+h67YPBtVKWu/mo5Wh59+8nowgcZmYaFM5hdH69963I9w=="], - "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.0.2", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "1.1.4" }, "cpu": "none" }, "sha512-YaRYNFLJRpkGfYjSWR7n9f+nQKtrlmrrffpAn/blc2geHcRvXoBc5SCs1idPtsLhj7H9qWWhs7ucjyHy4csWFg=="], + "@rspack/binding-linux-x64-gnu": ["@rspack/binding-linux-x64-gnu@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-M49UaWspE0YJ3268DsquD8idEQTfjBDMvO/I8qccV/Z5T+Q98FJ+kIs5liUaTWb48OIbDEK+8ZKx5QzLbfVN6g=="], - "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-d/3kTEKq+asLjRFPO96t+wfWiM7DLN76VQEPDD9bc1kdsZXlVJBuvyXfsgK8bbEvKplWXYcSsokhmEnuXrLOpg=="], + "@rspack/binding-linux-x64-musl": ["@rspack/binding-linux-x64-musl@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-YYbs0wmey+5blhEQDE4Dax3TwJtqfGwe2QBm3OLphlBHo/fcZVvimzKkMV0/pVrZTLy2z5ZAwNhGMY64bNr77w=="], - "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.0.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-161cWineq3RW+Jdm1FAfSpXeUtYWvhB3kAbm46vNT9h/YYz+spwsFMvveAZ1nsVSVL0IC5lDBGUte7yUAY8K2g=="], + "@rspack/binding-wasm32-wasi": ["@rspack/binding-wasm32-wasi@2.2.0", "", { "dependencies": { "@emnapi/core": "1.11.3", "@emnapi/runtime": "1.11.3", "@napi-rs/wasm-runtime": "1.1.6" }, "cpu": "none" }, "sha512-rerLPTN/HD4EvLNWs3O2N+Eb37eGvLRIP3dXXc3n+UzTebOepAsahNn44vXeRBsE4m/pHkpDJjwgWTytgQ2gBw=="], - "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-y7Q0S1FE+OlkL5GMqLG0PwxrPw6E1r892KhGrGKE1Vdufe5YTEx6xTPxzZ+b7N2KPD7s9G1/iJmWHQxb1+Bjkg=="], + "@rspack/binding-win32-arm64-msvc": ["@rspack/binding-win32-arm64-msvc@2.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-JUAmnbOQYGTRyX28vls/MOMonZWcmcCi5YtEq6YMc8Xqh3Qx0HUwaLM/I1xr/N9BX3b8CV0dQDOpNuBc2ei+CA=="], - "@rspack/cli": ["@rspack/cli@2.0.2", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "bin/rspack.js" } }, "sha512-rwuzo/V59ck/ChNkxMEEjuXLFs8nPJ37K0PMuUeIMmzFJNdUcPLxSV3qaV9azDLGcyq4XwcyQvexH3okWbfUfQ=="], + "@rspack/binding-win32-ia32-msvc": ["@rspack/binding-win32-ia32-msvc@2.2.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-wOmQRUaOG0eWH/fnfslA9yK9xKfaq9X+3Xa1TdTJnTqlo0ARJYs6A+Lzjbs7cxdY/o1f12Xe00BG3nQozReUOg=="], - "@rspack/core": ["@rspack/core@2.0.2", "", { "dependencies": { "@rspack/binding": "2.0.2" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": ">=0.5.1" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-VM3UHOo26uC+4QSqY5tU1ybI7KuXY5rTof8nhFOaBY9SYau0Smvr+hMSAPmrmHwknB6dXT8yaNVxrj7I+qxE1Q=="], + "@rspack/binding-win32-x64-msvc": ["@rspack/binding-win32-x64-msvc@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-v6/3bFr9+i7hRpgulL9b5qCvZL0VgR4vQGQNqOWezUzZmPUj9LYpvB0L9xZIVwDQ2ug/xBiA58bfg5IbESgoyw=="], + + "@rspack/cli": ["@rspack/cli@2.2.0", "", { "peerDependencies": { "@rspack/core": "^2.0.0-0", "@rspack/dev-server": "^2.0.0-0" }, "optionalPeers": ["@rspack/dev-server"], "bin": { "rspack": "./bin/rspack.js" } }, "sha512-GSiQPG5v5tN8vYJdUMYX44sPiwVVG8H25fq3LWRydVB4WswDAD/N3qNgWZtFVliQdLH3ZWzFdFUoCyZmea0TMA=="], + + "@rspack/core": ["@rspack/core@2.2.0", "", { "dependencies": { "@rspack/binding": "2.2.0" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", "@swc/helpers": "^0.5.23" }, "optionalPeers": ["@module-federation/runtime-tools", "@swc/helpers"] }, "sha512-3W7oX0BAHbK4VlknH3lfyfRvupzxdZtyEa+DfKmdjzmIAcqYtHnFd0nLqp5dzitDPyDI1TIKkDhpB0AZJn0pVg=="], "@sigstore/bundle": ["@sigstore/bundle@4.0.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="], @@ -656,21 +660,15 @@ "@sigstore/verify": ["@sigstore/verify@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag=="], - "@sindresorhus/is": ["@sindresorhus/is@0.14.0", "", {}, "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="], - "@sphinxxxx/color-conversion": ["@sphinxxxx/color-conversion@2.2.2", "", {}, "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="], "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@szmarczak/http-timer": ["@szmarczak/http-timer@1.1.2", "", { "dependencies": { "defer-to-connect": "^1.0.1" } }, "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="], - - "@tootallnate/once": ["@tootallnate/once@1.1.2", "", {}, "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="], - "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], "@tufjs/models": ["@tufjs/models@4.1.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@types/ace": ["@types/ace@0.0.52", "", {}, "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ=="], @@ -778,19 +776,19 @@ "@upsetjs/venn.js": ["@upsetjs/venn.js@2.0.0", "", { "optionalDependencies": { "d3-selection": "^3.0.0", "d3-transition": "^3.0.1" } }, "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw=="], - "@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="], + "@vitest/expect": ["@vitest/expect@4.1.11", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.11", "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw=="], - "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="], + "@vitest/mocker": ["@vitest/mocker@4.1.11", "", { "dependencies": { "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ=="], - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.1.11", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw=="], - "@vitest/runner": ["@vitest/runner@4.1.10", "", { "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" } }, "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg=="], + "@vitest/runner": ["@vitest/runner@4.1.11", "", { "dependencies": { "@vitest/utils": "4.1.11", "pathe": "^2.0.3" } }, "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw=="], - "@vitest/snapshot": ["@vitest/snapshot@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw=="], + "@vitest/snapshot": ["@vitest/snapshot@4.1.11", "", { "dependencies": { "@vitest/pretty-format": "4.1.11", "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog=="], - "@vitest/spy": ["@vitest/spy@4.1.10", "", {}, "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw=="], + "@vitest/spy": ["@vitest/spy@4.1.11", "", {}, "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA=="], - "@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="], + "@vitest/utils": ["@vitest/utils@4.1.11", "", { "dependencies": { "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ=="], "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], @@ -848,18 +846,12 @@ "abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="], - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - - "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], @@ -870,56 +862,26 @@ "ansi": ["ansi@0.3.1", "", {}, "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A=="], - "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], - "ansi-colors": ["ansi-colors@4.1.1", "", {}, "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="], - "ansi-escapes": ["ansi-escapes@3.2.0", "", {}, "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="], - "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], - - "archiver": ["archiver@3.1.1", "", { "dependencies": { "archiver-utils": "^2.1.0", "async": "^2.6.3", "buffer-crc32": "^0.2.1", "glob": "^7.1.4", "readable-stream": "^3.4.0", "tar-stream": "^2.1.0", "zip-stream": "^2.1.2" } }, "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg=="], - - "archiver-utils": ["archiver-utils@2.1.0", "", { "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", "lodash.defaults": "^4.2.0", "lodash.difference": "^4.5.0", "lodash.flatten": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.union": "^4.6.0", "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" } }, "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw=="], - - "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "array-find-index": ["array-find-index@1.0.2", "", {}, "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="], - - "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], - "async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], - - "atomically": ["atomically@1.7.0", "", {}, "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w=="], - - "autoprefixer": ["autoprefixer@10.5.0", "", { "dependencies": { "browserslist": "^4.28.2", "caniuse-lite": "^1.0.30001787", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong=="], + "autoprefixer": ["autoprefixer@10.5.4", "", { "dependencies": { "browserslist": "^4.28.6", "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA=="], "autosize": ["autosize@6.0.1", "", {}, "sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ=="], - "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], - - "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - "babel-loader": ["babel-loader@10.1.1", "", { "dependencies": { "find-up": "^5.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0 || ^8.0.0-beta.1", "@rspack/core": "^1.0.0 || ^2.0.0-0", "webpack": ">=5.61.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg=="], "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@1.0.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^1.0.0", "core-js-compat": "^3.48.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0" } }, "sha512-yIkslVjbmml2Xjb6XhFW7lISXHsqk6cesxTdDsXoMom4Lnb99DbD3OQbSOoM5Z+ASh8YXYaLAsRQrU2Jeh3Qig=="], @@ -928,9 +890,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw=="], "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], @@ -940,12 +900,6 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - - "body-parser": ["body-parser@1.20.5", "", { "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" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="], - - "boxen": ["boxen@5.1.2", "", { "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" } }, "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ=="], - "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -954,42 +908,24 @@ "browser-stdout": ["browser-stdout@1.3.1", "", {}, "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="], - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], - - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "buffer-image-size": ["buffer-image-size@0.6.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ=="], - "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cacache": ["cacache@20.0.4", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="], - "cacheable-request": ["cacheable-request@6.1.0", "", { "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" } }, "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], - - "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chai": ["chai@4.3.6", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], - "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], @@ -998,30 +934,16 @@ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], - "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], - - "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], - "cli": ["cli@1.0.1", "", { "dependencies": { "exit": "0.1.2", "glob": "^7.1.1" } }, "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg=="], - "cli-boxes": ["cli-boxes@2.2.1", "", {}, "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="], - - "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], - - "cli-width": ["cli-width@2.2.1", "", {}, "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="], - "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], - "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], - "cmd-shim": ["cmd-shim@8.0.0", "", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="], - "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], - "codemirror": ["codemirror@6.0.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -1040,40 +962,20 @@ "com.foxdebug.acode.rk.plugin.plugincontext": ["com.foxdebug.acode.rk.plugin.plugincontext@file:src/plugins/pluginContext", {}], - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], - "compress-commons": ["compress-commons@2.1.1", "", { "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^3.0.1", "normalize-path": "^3.0.0", "readable-stream": "^2.3.6" } }, "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q=="], - - "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], - - "compression": ["compression@1.8.1", "", { "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" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "conf": ["conf@10.2.0", "", { "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" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="], - "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "configstore": ["configstore@5.0.1", "", { "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" } }, "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="], "console-browserify": ["console-browserify@1.1.0", "", { "dependencies": { "date-now": "^0.1.4" } }, "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg=="], - "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], - - "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], - "cordova": ["cordova@13.0.0", "", { "dependencies": { "configstore": "^5.0.1", "cordova-common": "^6.0.0", "cordova-create": "^6.0.0", "cordova-lib": "^13.0.0", "editor": "^1.0.0", "execa": "^5.1.1", "nopt": "^9.0.0", "semver": "^7.7.3", "systeminformation": "^5.27.11" }, "bin": { "cordova": "bin/cordova" } }, "sha512-QAIMwmYLL0jHo4vauWSnRd2fr9l+wajG+F5aUkrC6e4ZQGSTv0wAiRmpqQUkIc1ZdELisKDQws/BjHz5nP/sLw=="], "cordova-android": ["cordova-android@15.1.0", "", { "dependencies": { "android-versions": "^2.1.1", "cordova-common": "^6.0.0", "dedent": "^1.7.1", "execa": "^5.1.1", "fast-glob": "^3.3.3", "is-path-inside": "^3.0.3", "nopt": "^9.0.0", "properties-parser": "^0.6.0", "semver": "^7.7.4", "string-argv": "^0.3.2", "untildify": "^4.0.0", "which": "^6.0.1" } }, "sha512-mnOnOisYUVhyrLCPVlHJBKh4ro+X6nZA7nPqBrpVnyTpiiDiakNCfbBJjSs1MTBUJZ6dcmhhvNKZWPT9w6aGPA=="], @@ -1092,7 +994,7 @@ "cordova-plugin-acode-webview": ["cordova-plugin-acode-webview@file:src/plugins/webview", {}], - "cordova-plugin-advanced-http": ["cordova-plugin-advanced-http@file:src/plugins/cordova-plugin-advanced-http", { "devDependencies": { "chai": "4.3.6", "colors": "1.4.0", "cordova": "11.0.0", "mocha": "9.2.2", "umd-tough-cookie": "3.0.0", "wd": "1.14.0", "xml2js": "0.4.23" } }], + "cordova-plugin-advanced-http": ["cordova-plugin-advanced-http@file:src/plugins/cordova-plugin-advanced-http", { "devDependencies": { "chai": "4.3.6", "colors": "1.4.0", "cordova": "13.0.0", "mocha": "9.2.2", "umd-tough-cookie": "3.0.0", "xml2js": "0.4.23" } }], "cordova-plugin-browser": ["cordova-plugin-browser@file:src/plugins/browser", {}], @@ -1118,9 +1020,7 @@ "cordova-plugin-websocket": ["cordova-plugin-websocket@file:src/plugins/websocket", {}], - "cordova-serve": ["cordova-serve@4.0.1", "", { "dependencies": { "chalk": "^3.0.0", "compression": "^1.7.4", "express": "^4.17.1", "open": "^7.0.3", "which": "^2.0.2" } }, "sha512-YbfXaZ60yr5dkqmDFQgrU7TSKnzCqYsxHgIUzDeX8RggZb6mz1F9jMfUBbaYyaU7JjcuJ0aoRPYLvwSGQVhGkw=="], - - "core-js": ["core-js@3.49.0", "", {}, "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg=="], + "core-js": ["core-js@3.50.0", "", {}, "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw=="], "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], @@ -1132,10 +1032,6 @@ "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], - "crc": ["crc@3.8.0", "", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="], - - "crc32-stream": ["crc32-stream@3.0.1", "", { "dependencies": { "crc": "^3.4.4", "readable-stream": "^3.4.0" } }, "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w=="], - "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1146,9 +1042,7 @@ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "currently-unhandled": ["currently-unhandled@0.4.1", "", { "dependencies": { "array-find-index": "^1.0.1" } }, "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng=="], - - "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], + "cytoscape": ["cytoscape@3.34.2", "", {}, "sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g=="], "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], @@ -1220,40 +1114,20 @@ "dagre-d3-es": ["dagre-d3-es@7.0.14", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg=="], - "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], - "date-now": ["date-now@0.1.4", "", {}, "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw=="], - "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], - - "debounce-fn": ["debounce-fn@4.0.0", "", { "dependencies": { "mimic-fn": "^3.0.0" } }, "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ=="], + "dayjs": ["dayjs@1.11.23", "", {}, "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], - "decompress-response": ["decompress-response@3.3.0", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA=="], - "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], "deep-eql": ["deep-eql@3.0.1", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="], - "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - - "defer-to-connect": ["defer-to-connect@1.1.3", "", {}, "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="], - "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], - - "dep-graph": ["dep-graph@1.1.0", "", { "dependencies": { "underscore": "1.2.1" } }, "sha512-/6yUWlSH0Uevjj6HWvO86rDeFzuYfzbaKDqifTEemwfwEPyBrODTb3ox/jFzqmc2+UmgJ3IDMS88BKEBh1Nm2Q=="], - - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - - "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], @@ -1270,23 +1144,15 @@ "domhandler": ["domhandler@2.3.0", "", { "dependencies": { "domelementtype": "1" } }, "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ=="], - "dompurify": ["dompurify@3.4.11", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw=="], + "dompurify": ["dompurify@3.4.14", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg=="], "domutils": ["domutils@1.5.1", "", { "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw=="], "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "duplexer3": ["duplexer3@0.1.5", "", {}, "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="], - - "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], - "editor": ["editor@1.0.0", "", {}, "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw=="], - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], + "electron-to-chromium": ["electron-to-chromium@1.5.415", "", {}, "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg=="], "elementtree": ["elementtree@0.1.7", "", { "dependencies": { "sax": "1.1.4" } }, "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg=="], @@ -1298,12 +1164,6 @@ "empathic": ["empathic@2.0.1", "", {}, "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - - "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - "endent": ["endent@2.1.0", "", { "dependencies": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", "objectorarray": "^1.0.5" } }, "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w=="], "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="], @@ -1312,26 +1172,14 @@ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], - "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], - "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], - - "es-toolkit": ["es-toolkit@1.46.1", "", {}, "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ=="], + "es-toolkit": ["es-toolkit@1.51.0", "", {}, "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-goat": ["escape-goat@2.1.1", "", {}, "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="], - - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], @@ -1346,8 +1194,6 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], @@ -1358,12 +1204,6 @@ "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], - "express": ["express@4.22.2", "", { "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" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="], - - "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - - "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], - "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -1380,33 +1220,17 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="], - - "filesize": ["filesize@11.0.17", "", {}, "sha512-oHLTvMLw6imZUl1se/RBQrFlyy50nXce4sU7yGR6Qc0JgCwqnfiFsAnEwotdGmfKLD7SArGUk2/5STU0k8LOBQ=="], + "filesize": ["filesize@11.0.22", "", {}, "sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "finalhandler": ["finalhandler@1.3.2", "", { "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" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], - "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], - - "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], - - "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], - "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], - "framer-motion": ["framer-motion@12.42.0", "", { "dependencies": { "motion-dom": "^12.42.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA=="], - - "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - - "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - - "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "framer-motion": ["framer-motion@12.43.0", "", { "dependencies": { "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="], "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], @@ -1416,58 +1240,34 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "gauge": ["gauge@2.7.4", "", { "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" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], - "glob": ["glob@7.2.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "got": ["got@9.6.0", "", { "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" } }, "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q=="], - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "growl": ["growl@1.10.5", "", {}, "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="], "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], - "happy-dom": ["happy-dom@20.11.1", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-XSt8tMzbW9ymE7687xztkO1ckR7qJNQ3LywY9vlYGhGi3zXrGBHuUo2Cl1ztZaICW+1eAGdkLbj6iwVqDT33kg=="], - - "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], - - "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + "happy-dom": ["happy-dom@20.11.6", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], - - "has-yarn": ["has-yarn@2.1.0", "", {}, "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], @@ -1480,24 +1280,16 @@ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - "http-proxy-agent": ["http-proxy-agent@4.0.1", "", { "dependencies": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg=="], - - "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], - - "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "ignore-walk": ["ignore-walk@8.0.0", "", { "dependencies": { "minimatch": "^10.0.3" } }, "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A=="], @@ -1508,56 +1300,32 @@ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "import-lazy": ["import-lazy@2.1.0", "", {}, "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], - - "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="], - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], - - "init-package-json": ["init-package-json@2.0.5", "", { "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" } }, "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA=="], - - "inquirer": ["inquirer@6.5.2", "", { "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" } }, "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="], - - "insight": ["insight@0.11.1", "", { "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" } }, "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw=="], + "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], - "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - "is-ci": ["is-ci@2.0.0", "", { "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], - - "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], - - "is-npm": ["is-npm@5.0.0", "", {}, "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], @@ -1572,18 +1340,12 @@ "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - - "is-yarn-global": ["is-yarn-global@0.3.0", "", {}, "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="], - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], "isobject": ["isobject@4.0.0", "", {}, "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA=="], - "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], - "java-parser": ["java-parser@3.0.1", "", { "dependencies": { "chevrotain": "11.0.3", "chevrotain-allstar": "0.3.1", "lodash": "4.17.21" } }, "sha512-sDIR7u9b7O2JViNUxiZRhnRz7URII/eE7g2B+BmGxDeS6Ex3OYAcCyz5oh0H4LQ+hL/BS8OJTz8apMy9xtGmrQ=="], "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], @@ -1594,54 +1356,34 @@ "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "jshint": ["jshint@2.13.6", "", { "dependencies": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", "lodash": "~4.17.21", "minimatch": "~3.0.2", "strip-json-comments": "1.0.x" }, "bin": { "jshint": "bin/jshint" } }, "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ=="], - "json-buffer": ["json-buffer@3.0.0", "", {}, "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "json-schema-typed": ["json-schema-typed@7.0.3", "", {}, "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A=="], - "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], - "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], - "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], - "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="], - "katex": ["katex@0.16.45", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA=="], - - "keyv": ["keyv@3.1.0", "", { "dependencies": { "json-buffer": "3.0.0" } }, "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA=="], + "katex": ["katex@0.16.47", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg=="], "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], - "latest-version": ["latest-version@5.1.0", "", { "dependencies": { "package-json": "^6.3.0" } }, "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA=="], - "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], - "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], - "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], @@ -1670,7 +1412,7 @@ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "linkify-it": ["linkify-it@5.0.1", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg=="], + "linkify-it": ["linkify-it@5.0.2", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="], "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], @@ -1684,39 +1426,23 @@ "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], - "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], - - "lodash.difference": ["lodash.difference@4.5.0", "", {}, "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="], - - "lodash.flatten": ["lodash.flatten@4.4.0", "", {}, "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="], - - "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], - - "lodash.union": ["lodash.union@4.6.0", "", {}, "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="], - "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], - "loud-rejection": ["loud-rejection@2.2.0", "", { "dependencies": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.2" } }, "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ=="], - "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], - "lowercase-keys": ["lowercase-keys@1.0.1", "", {}, "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="], - "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="], - "macos-release": ["macos-release@2.5.1", "", {}, "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], "make-fetch-happen": ["make-fetch-happen@15.0.5", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg=="], - "markdown-it": ["markdown-it@14.2.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ=="], + "markdown-it": ["markdown-it@14.3.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.5.0", "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw=="], - "markdown-it-anchor": ["markdown-it-anchor@9.2.0", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg=="], + "markdown-it-anchor": ["markdown-it-anchor@9.2.1", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ=="], - "markdown-it-emoji": ["markdown-it-emoji@3.0.0", "", {}, "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg=="], + "markdown-it-emoji": ["markdown-it-emoji@3.1.0", "", {}, "sha512-NhmMEH2ywduD4Nty1E8uB5NqfLhAT1VR0dyvoJyStKOqCzbZmVdn/+8wj7zpDsb/fLBikpCPsWwxqKlvMmbz4g=="], "markdown-it-footnote": ["markdown-it-footnote@4.0.0", "", {}, "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ=="], @@ -1728,42 +1454,26 @@ "marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "md5-file": ["md5-file@5.0.0", "", { "bin": { "md5-file": "cli.js" } }, "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw=="], - "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], - "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], - - "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "mermaid": ["mermaid@11.15.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.1.1", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.1", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.19", "dompurify": "^3.3.1", "es-toolkit": "^1.45.1", "katex": "^0.16.25", "khroma": "^2.1.0", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" } }, "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw=="], - "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], - "mini-css-extract-plugin": ["mini-css-extract-plugin@2.10.2", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg=="], "minimatch": ["minimatch@4.2.1", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g=="], - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], @@ -1772,23 +1482,19 @@ "minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="], - "minipass-json-stream": ["minipass-json-stream@1.0.2", "", { "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg=="], - "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], "minipass-sized": ["minipass-sized@2.0.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA=="], "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], - "mlly": ["mlly@1.8.1", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ=="], "mocha": ["mocha@9.2.2", "", { "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "4.2.1", "ms": "2.1.3", "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "mocha": "bin/mocha", "_mocha": "bin/_mocha" } }, "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g=="], - "motion": ["motion@12.42.0", "", { "dependencies": { "framer-motion": "^12.42.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA=="], + "motion": ["motion@12.43.0", "", { "dependencies": { "framer-motion": "^12.43.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ=="], - "motion-dom": ["motion-dom@12.42.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w=="], + "motion-dom": ["motion-dom@12.43.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="], "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], @@ -1796,11 +1502,9 @@ "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], - "mute-stream": ["mute-stream@0.0.7", "", {}, "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], - "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], @@ -1808,21 +1512,17 @@ "node-gyp": ["node-gyp@12.3.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg=="], - "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], + "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], - "normalize-package-data": ["normalize-package-data@3.0.3", "", { "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA=="], - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "normalize-url": ["normalize-url@4.5.1", "", {}, "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="], - "npm-bundled": ["npm-bundled@5.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^5.0.0" } }, "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw=="], "npm-install-checks": ["npm-install-checks@8.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA=="], - "npm-normalize-package-bin": ["npm-normalize-package-bin@1.0.1", "", {}, "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="], + "npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], "npm-package-arg": ["npm-package-arg@13.0.2", "", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="], @@ -1834,48 +1534,20 @@ "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], - - "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], - - "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "objectorarray": ["objectorarray@1.0.5", "", {}, "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg=="], "obug": ["obug@2.1.3", "", {}, "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - - "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], - - "os-name": ["os-name@4.0.1", "", { "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" } }, "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw=="], - - "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - - "p-cancelable": ["p-cancelable@1.1.0", "", {}, "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="], - - "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - - "package-json": ["package-json@6.5.0", "", { "dependencies": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" } }, "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], "pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="], @@ -1888,8 +1560,6 @@ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], @@ -1906,33 +1576,25 @@ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], - "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "pify": ["pify@5.0.0", "", {}, "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="], - "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], "postcss-loader": ["postcss-loader@8.2.1", "", { "dependencies": { "cosmiconfig": "^9.0.0", "jiti": "^2.5.1", "semver": "^7.6.2" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow=="], @@ -1948,8 +1610,6 @@ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - "prepend-http": ["prepend-http@2.0.0", "", {}, "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="], - "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "prettier-plugin-java": ["prettier-plugin-java@2.8.1", "", { "dependencies": { "java-parser": "3.0.1" }, "peerDependencies": { "prettier": "^3.0.0" } }, "sha512-tkteH5OSCEb0E7wKnhhUSitr1pGUCUt9M//CwerSNhoalL/qv0jXTeSVBPZ36KC+kZl3nbq4dxh144NuGchACg=="], @@ -1964,54 +1624,22 @@ "promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="], - "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], - - "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], - - "promzard": ["promzard@0.3.0", "", { "dependencies": { "read": "1" } }, "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw=="], - "properties-parser": ["properties-parser@0.6.0", "", {}, "sha512-qvr2cSmoA0dln0MARAKwBzPkkXn7FqwX+RVVNpMdMJc7rt9mqO2cXwluxtux9fHrLhjnPFaQkS8BM0kFrTCnSw=="], - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - - "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], - - "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], - "pupa": ["pupa@2.1.1", "", { "dependencies": { "escape-goat": "^2.0.0" } }, "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A=="], - - "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], - - "qs": ["qs@6.5.5", "", {}, "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ=="], - "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - - "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], - "raw-loader": ["raw-loader@4.0.2", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA=="], - "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], - - "read": ["read@1.0.7", "", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="], - - "read-chunk": ["read-chunk@3.2.0", "", { "dependencies": { "pify": "^4.0.1", "with-open-file": "^0.1.6" } }, "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ=="], - "read-cmd-shim": ["read-cmd-shim@6.0.0", "", {}, "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A=="], - "read-package-json": ["read-package-json@4.1.2", "", { "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" } }, "sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ=="], - - "read-package-json-fast": ["read-package-json-fast@2.0.3", "", { "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" } }, "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ=="], - "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], @@ -2022,16 +1650,10 @@ "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], - "registry-auth-token": ["registry-auth-token@4.2.2", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg=="], - - "registry-url": ["registry-url@5.1.0", "", { "dependencies": { "rc": "^1.2.8" } }, "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw=="], - "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], - "request": ["request@2.88.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" } }, "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -2042,35 +1664,23 @@ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "responselike": ["responselike@1.0.2", "", { "dependencies": { "lowercase-keys": "^1.0.0" } }, "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ=="], - - "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], - - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], "rolldown": ["rolldown@1.2.1", "", { "dependencies": { "@oxc-project/types": "=0.142.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.2.1", "@rolldown/binding-darwin-arm64": "1.2.1", "@rolldown/binding-darwin-x64": "1.2.1", "@rolldown/binding-freebsd-x64": "1.2.1", "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", "@rolldown/binding-linux-arm64-gnu": "1.2.1", "@rolldown/binding-linux-arm64-musl": "1.2.1", "@rolldown/binding-linux-ppc64-gnu": "1.2.1", "@rolldown/binding-linux-s390x-gnu": "1.2.1", "@rolldown/binding-linux-x64-gnu": "1.2.1", "@rolldown/binding-linux-x64-musl": "1.2.1", "@rolldown/binding-openharmony-arm64": "1.2.1", "@rolldown/binding-wasm32-wasi": "1.2.1", "@rolldown/binding-win32-arm64-msvc": "1.2.1", "@rolldown/binding-win32-x64-msvc": "1.2.1" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw=="], "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], - "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], - "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], - "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="], + "sass": ["sass@1.103.1", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw=="], "sass-loader": ["sass-loader@16.0.8", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA=="], @@ -2080,32 +1690,14 @@ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "semver-diff": ["semver-diff@3.1.1", "", { "dependencies": { "semver": "^6.3.0" } }, "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg=="], - - "send": ["send@0.19.2", "", { "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" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], - "serialize-javascript": ["serialize-javascript@6.0.0", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag=="], - "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], - - "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "side-channel": ["side-channel@1.1.1", "", { "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" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], - - "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "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" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], @@ -2118,7 +1710,7 @@ "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], - "socks-proxy-agent": ["socks-proxy-agent@6.2.1", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ=="], + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], @@ -2126,29 +1718,23 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], - "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], "sprintf": ["sprintf@0.1.5", "", {}, "sha512-4X5KsuXFQ7f+d7Y+bi4qSb6eI+YoifDTGr0MQJXRoYO7BO7evfRCjds6kk3z7l5CiJYxgDN1x5Er4WiyCt+zTQ=="], - "sshpk": ["sshpk@1.18.0", "", { "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" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], - "ssri": ["ssri@13.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "std-env": ["std-env@4.2.0", "", {}, "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw=="], "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -2156,8 +1742,6 @@ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], @@ -2178,54 +1762,36 @@ "tar": ["tar@7.5.22", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA=="], - "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - "terminal": ["terminal@0.1.4", "", { "dependencies": { "sprintf": ">= 0.1.1" } }, "sha512-w6OAFpUO+TimZUdQ46dK3fYYOCCBIsS2QUfIEkzX21oJ8tvJOJvJkcmrbleLH5KG02SNohYFDj81bL3VPaULsQ=="], "terser": ["terser@5.44.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw=="], "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="], - "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], "tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], - "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "tinyrainbow": ["tinyrainbow@3.1.1", "", {}, "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw=="], "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], - "to-readable-stream": ["to-readable-stream@1.0.0", "", {}, "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - - "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], - "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], - "ts-loader": ["ts-loader@9.5.7", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4", "source-map": "^0.7.4" }, "peerDependencies": { "typescript": "*", "webpack": "^5.0.0" } }, "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg=="], + "ts-loader": ["ts-loader@9.6.2", "", { "dependencies": { "chalk": "^4.1.0", "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "peerDependencies": { "loader-utils": "*", "typescript": "*", "webpack": "^4.0.0 || ^5.0.0" }, "optionalPeers": ["loader-utils"] }, "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tuf-js": ["tuf-js@4.1.0", "", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="], - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - - "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -2236,8 +1802,6 @@ "umd-tough-cookie": ["umd-tough-cookie@3.0.0", "", {}, "sha512-LgVV1jgzEPgC/zOj6T9OIDBTj7YCGEJkgoxV2gHYv1Crlst1X95lRIF48hFleGgv4v01Z86LxyyLyvl++M2Srg=="], - "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], - "undici": ["undici@6.25.0", "", {}, "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -2250,51 +1814,29 @@ "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], - "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="], - - "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="], - "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "untildify": ["untildify@4.0.0", "", {}, "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - - "update-notifier": ["update-notifier@5.1.0", "", { "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" } }, "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw=="], + "update-browserslist-db": ["update-browserslist-db@1.3.1", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], - "url-parse-lax": ["url-parse-lax@3.0.0", "", { "dependencies": { "prepend-http": "^2.0.0" } }, "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ=="], - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "valid-identifier": ["valid-identifier@0.0.2", "", {}, "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g=="], - "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], "vanilla-picker": ["vanilla-picker@2.12.3", "", { "dependencies": { "@sphinxxxx/color-conversion": "^2.2.2" } }, "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ=="], - "vargs": ["vargs@0.1.0", "", {}, "sha512-d/j1kMUt0YjLCQPAI+VMZ7IKwNGjk8dSHMCrHq9txFOCcCIDoe8ck9FmPvABJgxIaZO1tabXmNojQG6mBkLLCw=="], - - "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - - "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], - "vite": ["vite@8.2.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.23", "rolldown": "~1.2.0", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ=="], - "vitest": ["vitest@4.1.10", "", { "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", "@vitest/pretty-format": "4.1.10", "@vitest/runner": "4.1.10", "@vitest/snapshot": "4.1.10", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.10", "@vitest/browser-preview": "4.1.10", "@vitest/browser-webdriverio": "4.1.10", "@vitest/coverage-istanbul": "4.1.10", "@vitest/coverage-v8": "4.1.10", "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw=="], + "vitest": ["vitest@4.1.11", "", { "dependencies": { "@vitest/expect": "4.1.11", "@vitest/mocker": "4.1.11", "@vitest/pretty-format": "4.1.11", "@vitest/runner": "4.1.11", "@vitest/snapshot": "4.1.11", "@vitest/spy": "4.1.11", "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.11", "@vitest/browser-preview": "4.1.11", "@vitest/browser-webdriverio": "4.1.11", "@vitest/coverage-istanbul": "4.1.11", "@vitest/coverage-v8": "4.1.11", "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw=="], "vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="], @@ -2318,8 +1860,6 @@ "watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="], - "wd": ["wd@1.14.0", "", { "dependencies": { "archiver": "^3.0.0", "async": "^2.0.0", "lodash": "^4.0.0", "mkdirp": "^0.5.1", "q": "^1.5.1", "request": "2.88.0", "vargs": "^0.1.0" }, "bin": { "wd": "lib/bin.js" } }, "sha512-X7ZfGHHYlQ5zYpRlgP16LUsvYti+Al/6fz3T/ClVyivVCpCZQpESTDdz6zbK910O5OIvujO23Ym2DBBo3XsQlA=="], - "webpack": ["webpack@5.105.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.19.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.5.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw=="], "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], @@ -2330,14 +1870,6 @@ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], - - "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], - - "windows-release": ["windows-release@4.0.0", "", { "dependencies": { "execa": "^4.0.2" } }, "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg=="], - - "with-open-file": ["with-open-file@0.1.7", "", { "dependencies": { "p-finally": "^1.0.0", "p-try": "^2.1.0", "pify": "^4.0.1" } }, "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA=="], - "workerpool": ["workerpool@6.2.0", "", {}, "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A=="], "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], @@ -2346,7 +1878,7 @@ "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], - "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], "xdg-basedir": ["xdg-basedir@4.0.0", "", {}, "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="], @@ -2358,7 +1890,7 @@ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + "yargs": ["yargs@18.1.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="], "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -2366,15 +1898,15 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zip-stream": ["zip-stream@2.1.3", "", { "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^2.1.1", "readable-stream": "^3.4.0" } }, "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q=="], - "@babel/core/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], "@babel/core/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], "@babel/core/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], - "@babel/generator/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/generator/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "@babel/helper-create-class-features-plugin/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], @@ -2392,7 +1924,7 @@ "@babel/helper-wrap-function/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], - "@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/parser/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@babel/plugin-transform-async-generator-functions/@babel/traverse": ["@babel/traverse@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/template": "^8.0.0", "@babel/types": "^8.0.0", "obug": "^2.1.1" } }, "sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw=="], @@ -2402,11 +1934,11 @@ "@babel/template/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], - "@babel/traverse/@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + "@babel/traverse/@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], - "@babel/traverse/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@babel/traverse/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@chevrotain/cst-dts-gen/@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], @@ -2416,46 +1948,46 @@ "@chevrotain/gast/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "@codemirror/lang-angular/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/lang-angular/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], - "@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + "@codemirror/lang-jinja/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-liquid/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-markdown/@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="], + + "@codemirror/lang-php/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-vue/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], "@codemirror/lang-vue/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + "@codemirror/language-data/@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + "@codemirror/language-data/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], "@codemirror/language-data/@codemirror/lang-jinja": ["@codemirror/lang-jinja@6.0.0", "", { "dependencies": { "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.4.0" } }, "sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw=="], "@codemirror/language-data/@codemirror/lang-liquid": ["@codemirror/lang-liquid@6.3.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.1" } }, "sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw=="], - "@codemirror/language-data/@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw=="], - - "@npmcli/agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + "@codemirror/language-data/@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw=="], - "@npmcli/agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "@npmcli/agent/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + "@codemirror/language-data/@codemirror/lang-yaml": ["@codemirror/lang-yaml@6.1.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.0.0", "@lezer/yaml": "^1.0.0" } }, "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw=="], "@npmcli/arborist/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - "@npmcli/git/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], - - "@npmcli/installed-package-contents/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - "@npmcli/map-workspaces/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "@npmcli/map-workspaces/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@npmcli/metavuln-calculator/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], - "@npmcli/move-file/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - "@npmcli/package-json/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], - "@npmcli/package-json/spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], - "@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@2.0.0-alpha.3", "", { "dependencies": { "@emnapi/wasi-threads": "2.0.1", "tslib": "^2.4.0" } }, "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g=="], "@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@2.0.0-alpha.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA=="], @@ -2468,76 +2000,34 @@ "@vitest/expect/chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - - "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "archiver/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "archiver/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "archiver-utils/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "bin-links/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - "bin-links/write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "body-parser/qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], - - "boxen/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "boxen/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "cacache/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - - "cacheable-request/lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "chevrotain/@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], "chevrotain/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], - "chevrotain-allstar/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], - "cli/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "compression/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "conf/dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="], - - "content-disposition/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "cordova-fetch/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], "cordova-lib/write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], - "cordova-plugin-advanced-http/cordova": ["cordova@11.0.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" } }, "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg=="], - - "cordova-serve/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], - - "cordova-serve/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "core-js-compat/browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "cosmiconfig/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - "crc32-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "css-loader/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -2546,10 +2036,6 @@ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], - "debounce-fn/mimic-fn": ["mimic-fn@3.1.0", "", {}, "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ=="], - - "dep-graph/underscore": ["underscore@1.2.1", "", {}, "sha512-HRhh6FYh5I5/zTt7L9MnHRA/nlSFPiwymMCXEremmzT7tHR+8CNP0FXHPaUpafAPwvAlNrvZiH91kQwoo/CqUA=="], - "dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], "dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], @@ -2558,70 +2044,24 @@ "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "express/qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], - - "express/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "external-editor/tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - - "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], - - "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], - "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "got/get-stream": ["get-stream@4.1.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="], - - "har-validator/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "htmlparser2/entities": ["entities@1.0.0", "", {}, "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ=="], "htmlparser2/readable-stream": ["readable-stream@1.1.14", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ=="], - "http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - - "https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - "ignore-walk/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - "init-package-json/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "init-package-json/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "inquirer/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "inquirer/string-width": ["string-width@2.1.1", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="], - - "inquirer/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], - - "insight/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "jshint/minimatch": ["minimatch@3.0.8", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q=="], "jshint/strip-json-comments": ["strip-json-comments@1.0.4", "", { "bin": { "strip-json-comments": "cli.js" } }, "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg=="], - "jsprim/extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], - "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "make-fetch-happen/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "mermaid/dompurify": ["dompurify@3.4.2", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA=="], - "mermaid/marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -2630,10 +2070,10 @@ "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "minipass-json-stream/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "mlly/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "mocha/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], "mocha/debug": ["debug@4.3.3", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="], @@ -2648,99 +2088,55 @@ "mocha/yargs-parser": ["yargs-parser@20.2.4", "", {}, "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="], - "normalize-package-data/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "npm-bundled/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - - "npm-pick-manifest/npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="], - - "package-json/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "node-gyp/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], "parse-conflict-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="], "parse-json/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "plist/xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "raw-loader/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], - "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - - "read-chunk/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - - "read-package-json/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "request/tough-cookie": ["tough-cookie@2.4.3", "", { "dependencies": { "psl": "^1.1.24", "punycode": "^1.4.1" } }, "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ=="], - - "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], - - "rimraf/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - - "semver-diff/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "socks-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + "sass/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - - "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "terser/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "terser-webpack-plugin/serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], - "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], - - "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + "tinyglobby/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], "vite/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], - "vite/postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], - - "vite/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], - "webpack/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "webpack/browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], "webpack/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "wide-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "widest-line/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "windows-release/execa": ["execa@4.1.0", "", { "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" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="], + "@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], - "with-open-file/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "zip-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - "@babel/core/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], + + "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], - "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], - "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-compilation-targets/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], @@ -2790,9 +2186,9 @@ "@babel/helper-wrap-function/@babel/traverse/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/plugin-transform-async-generator-functions/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], @@ -2804,13 +2200,19 @@ "@babel/plugin-transform-classes/@babel/traverse/@babel/parser": ["@babel/parser@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" }, "bin": "./bin/babel-parser.js" }, "sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ=="], - "@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@codemirror/lang-jinja/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], - "@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@codemirror/lang-liquid/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + + "@codemirror/lang-php/@codemirror/lang-html/@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], "@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], @@ -2820,94 +2222,46 @@ "@rolldown/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@2.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ=="], - "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "archiver-utils/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "archiver/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "bin-links/write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "boxen/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "boxen/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "boxen/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "cacache/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "cli/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "cliui/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], "cordova-fetch/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "cordova-lib/write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "cordova-plugin-advanced-http/cordova/cordova-common": ["cordova-common@4.1.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" } }, "sha512-sYfOSfpYGQOmUDlsARUbpT/EvVKT/E+GI3zwTXt+C6DjZ7xs6ZQVHs3umHKSidjf9yVM2LLmvGFpGrGX7aGxug=="], - - "cordova-plugin-advanced-http/cordova/cordova-create": ["cordova-create@4.1.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" } }, "sha512-8VQohB5w5WwuxurQJ+2L+lAFVhBr//kFvlxLOmF0P3SzTdfIU02pNalbOeLalC0DXD7rfBXJZOxJ+KSM5TOq+Q=="], + "core-js-compat/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], - "cordova-plugin-advanced-http/cordova/cordova-lib": ["cordova-lib@11.1.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" } }, "sha512-/XM+/wFag72bD4SNSxwX8b3OWatHNNlnmJpgb5pepp2Pobb957nWyR0GPwIkKyOyszdZesWM3Vv8uH9e2Z1k2w=="], + "core-js-compat/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], - "cordova-plugin-advanced-http/cordova/nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="], + "core-js-compat/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.353", "", {}, "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w=="], - "cordova-serve/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "core-js-compat/browserslist/node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], - "cordova-serve/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "core-js-compat/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "css-loader/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], - "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], - - "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - - "har-validator/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "htmlparser2/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "htmlparser2/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], "ignore-walk/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "init-package-json/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "inquirer/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "inquirer/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "inquirer/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "inquirer/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], - - "inquirer/string-width/strip-ansi": ["strip-ansi@4.0.0", "", { "dependencies": { "ansi-regex": "^3.0.0" } }, "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="], - - "inquirer/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "minipass-json-stream/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "mocha/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -2920,33 +2274,17 @@ "mocha/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "node-gyp/tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "parse-json/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], "parse-json/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "raw-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "raw-loader/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - "read-package-json/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "request/tough-cookie/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], - - "restore-cursor/onetime/mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], - - "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "vite/postcss/nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + "sass/chokidar/readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "webpack/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], @@ -2956,19 +2294,11 @@ "webpack/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], - "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "wide-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "wide-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "widest-line/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "widest-line/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "webpack/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - "windows-release/execa/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "windows-release/execa/human-signals": ["human-signals@1.1.1", "", {}, "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="], + "wrap-ansi/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], "@npmcli/arborist/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], @@ -2978,42 +2308,10 @@ "@tufjs/models/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cacache/glob/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - "cordova-plugin-advanced-http/cordova/cordova-common/bplist-parser": ["bplist-parser@0.2.0", "", { "dependencies": { "big-integer": "^1.6.44" } }, "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/endent": ["endent@1.4.1", "", { "dependencies": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", "objectorarray": "^1.0.4" } }, "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-app-hello-world": ["cordova-app-hello-world@6.0.0", "", {}, "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch": ["cordova-fetch@3.1.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" } }, "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch": ["cordova-fetch@3.1.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" } }, "sha512-qOT3HlNzVWbsCZVvbkZ6PdvAG1byiK8vWG+/Z+7s+8ZB76rOYKdzMvrmmMwrTTX6nglDnz5uJ/4XjQHJB770GQ=="], - - "cordova-plugin-advanced-http/cordova/nopt/abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], - "ignore-walk/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "init-package-json/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "inquirer/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "inquirer/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "inquirer/string-width/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], - "mocha/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mocha/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -3024,256 +2322,14 @@ "mocha/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "normalize-package-data/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - - "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "raw-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "wide-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@npmcli/package-json/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "cordova-plugin-advanced-http/cordova/cordova-common/endent/dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], - - "cordova-plugin-advanced-http/cordova/cordova-common/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote": ["pacote@11.3.5", "", { "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" } }, "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote": ["pacote@11.3.5", "", { "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" } }, "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "init-package-json/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "inquirer/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "mocha/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "mocha/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git": ["@npmcli/git@2.1.0", "", { "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" } }, "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@1.0.7", "", { "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "installed-package-contents": "index.js" } }, "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/promise-spawn": ["@npmcli/promise-spawn@1.3.2", "", { "dependencies": { "infer-owner": "^1.0.4" } }, "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script": ["@npmcli/run-script@1.8.6", "", { "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" } }, "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache": ["cacache@15.3.0", "", { "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" } }, "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist": ["npm-packlist@2.2.2", "", { "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" } }, "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-pick-manifest": ["npm-pick-manifest@6.1.1", "", { "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", "npm-package-arg": "^8.1.2", "semver": "^7.3.4" } }, "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch": ["npm-registry-fetch@11.0.0", "", { "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" } }, "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git": ["@npmcli/git@2.1.0", "", { "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" } }, "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@1.0.7", "", { "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" }, "bin": { "installed-package-contents": "index.js" } }, "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/promise-spawn": ["@npmcli/promise-spawn@1.3.2", "", { "dependencies": { "infer-owner": "^1.0.4" } }, "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script": ["@npmcli/run-script@1.8.6", "", { "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" } }, "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache": ["cacache@15.3.0", "", { "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" } }, "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist": ["npm-packlist@2.2.2", "", { "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" } }, "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-pick-manifest": ["npm-pick-manifest@6.1.1", "", { "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", "npm-package-arg": "^8.1.2", "semver": "^7.3.4" } }, "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch": ["npm-registry-fetch@11.0.0", "", { "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" } }, "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/installed-package-contents/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/@npmcli/node-gyp": ["@npmcli/node-gyp@1.0.3", "", {}, "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp": ["node-gyp@7.1.2", "", { "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" } }, "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/@npmcli/fs": ["@npmcli/fs@1.1.1", "", { "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" } }, "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/ignore-walk": ["ignore-walk@3.0.4", "", { "dependencies": { "minimatch": "^3.0.4" } }, "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-pick-manifest/npm-install-checks": ["npm-install-checks@4.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen": ["make-fetch-happen@9.1.0", "", { "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" } }, "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch": ["minipass-fetch@1.4.1", "", { "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, "optionalDependencies": { "encoding": "^0.1.12" } }, "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/installed-package-contents/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/@npmcli/node-gyp": ["@npmcli/node-gyp@1.0.3", "", {}, "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp": ["node-gyp@7.1.2", "", { "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" } }, "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/@npmcli/fs": ["@npmcli/fs@1.1.1", "", { "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" } }, "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/ignore-walk": ["ignore-walk@3.0.4", "", { "dependencies": { "minimatch": "^3.0.4" } }, "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/npm-bundled": ["npm-bundled@1.1.2", "", { "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-pick-manifest/npm-install-checks": ["npm-install-checks@4.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen": ["make-fetch-happen@9.1.0", "", { "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" } }, "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch": ["minipass-fetch@1.4.1", "", { "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, "optionalDependencies": { "encoding": "^0.1.12" } }, "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/git/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request": ["request@2.88.2", "", { "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" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/cacache/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-packlist/ignore-walk/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch/minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/npm-package-arg/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/git/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request": ["request@2.88.2", "", { "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" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/cacache/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-packlist/ignore-walk/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minipass-fetch/minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/npm-registry-fetch/make-fetch-happen/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "cordova-plugin-advanced-http/cordova/cordova-create/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "cordova-plugin-advanced-http/cordova/cordova-lib/cordova-fetch/pacote/@npmcli/run-script/node-gyp/request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], } } diff --git a/config.xml b/config.xml index 45838a5aa0..5101e1fa59 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - @@ -204,4 +204,4 @@ - \ No newline at end of file + diff --git a/hooks/post-process.js b/hooks/post-process.js index 188e3c68bd..449669cf4c 100644 --- a/hooks/post-process.js +++ b/hooks/post-process.js @@ -33,6 +33,7 @@ copyDirRecursively( ); enableLegacyJni(); enableStaticContext(); +disableSplashFadeOnRealmeAndroid13(); removeLegacyKeyboardWorkaround(); patchTargetSdkVersion(); stripLauncherFilterFromMainActivity(); @@ -254,6 +255,79 @@ function enableStaticContext() { } } +function disableSplashFadeOnRealmeAndroid13() { + try { + const prefix = execSync('npm prefix').toString().trim(); + const packageName = getPackageName(); + const mainActivityPath = path.join( + prefix, + 'platforms/android/app/src/main/java', + packageName.replace(/\./g, '/'), + 'MainActivity.java' + ); + + if (!fs.existsSync(mainActivityPath)) { + console.warn('[Cordova Hook] ⚠️ MainActivity.java not found at', mainActivityPath); + return; + } + + let content = fs.readFileSync(mainActivityPath, 'utf-8'); + + if ( + content.includes('hasBrokenRealmeSplashTransfer()') && + content.includes('preferences.set("FadeSplashScreen", false);') + ) { + console.log('[Cordova Hook] ✅ realme splash workaround already enabled, skipping'); + return; + } + + if (!content.includes('import android.os.Build;')) { + content = content.replace( + /import android\.os\.Bundle;/, + 'import android.os.Build;\nimport android.os.Bundle;' + ); + } + + content = content.replace( + /\n\s*@Override\n\s*public void onCreate\(Bundle savedInstanceState\)/, + ` + + private static boolean hasBrokenRealmeSplashTransfer() { + return Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU + && ("realme".equalsIgnoreCase(Build.MANUFACTURER) + || "realme".equalsIgnoreCase(Build.BRAND)); + } + + @Override + protected void loadConfig() { + super.loadConfig(); + + // Some realme Android 13 builds pass a null SurfaceControl while handing the + // splash view to an app-provided exit animation. Avoid only that handoff. + if (hasBrokenRealmeSplashTransfer()) { + preferences.set("FadeSplashScreen", false); + } + } + + @Override + public void onCreate(Bundle savedInstanceState)` + ); + + if (!content.includes('preferences.set("FadeSplashScreen", false);')) { + console.warn('[Cordova Hook] ⚠️ Unable to inject realme splash workaround'); + return; + } + + fs.writeFileSync(mainActivityPath, content, 'utf-8'); + console.log('[Cordova Hook] ✅ Disabled splash fade on realme Android 13'); + } catch (err) { + console.error( + '[Cordova Hook] ❌ Failed to patch realme splash workaround:', + err.message + ); + } +} + function removeLegacyKeyboardWorkaround() { try { const prefix = execSync('npm prefix').toString().trim(); diff --git a/package-lock.json b/package-lock.json index 1115c34a9d..7550aea35f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,28 @@ { "name": "com.foxdebug.acode", - "version": "1.13.1", + "version": "1.13.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "com.foxdebug.acode", - "version": "1.13.1", + "version": "1.13.3", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -32,15 +32,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -55,57 +55,57 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -130,22 +130,22 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0" + "ws": "^8.21.3" } }, "node_modules/@antfu/install-pkg": { @@ -162,13 +162,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -365,14 +365,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -676,9 +676,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -1640,9 +1640,9 @@ "license": "MIT" }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -1650,9 +1650,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -1918,13 +1918,13 @@ "license": "MIT" }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -2979,9 +2979,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.1.tgz", - "integrity": "sha512-1WjCi/45Mn5e0uvz26FdvRe6bTAvN6WAtkHgIjl0w/LkBvrv4Y5bDR+8YY72r7cefXBfwYUXIHSoxQkrIfnjXQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.2.tgz", + "integrity": "sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==", "dev": true, "license": "MIT", "dependencies": { @@ -3213,9 +3213,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.1.tgz", - "integrity": "sha512-tiwl69ZQGIbPif28GK8vI/Nm1nYdP+UHXWRnqXl0fjfBS7DWmAs2XvlpVkZyZjVVDxcprcbzCnN93SbuSgz8WQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.2.tgz", + "integrity": "sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3268,7 +3268,7 @@ "@babel/plugin-transform-private-methods": "^8.0.1", "@babel/plugin-transform-private-property-in-object": "^8.0.1", "@babel/plugin-transform-property-literals": "^8.0.1", - "@babel/plugin-transform-regenerator": "^8.0.1", + "@babel/plugin-transform-regenerator": "^8.0.2", "@babel/plugin-transform-regexp-modifiers": "^8.0.1", "@babel/plugin-transform-reserved-words": "^8.0.1", "@babel/plugin-transform-shorthand-properties": "^8.0.1", @@ -3280,8 +3280,8 @@ "@babel/plugin-transform-unicode-property-regex": "^8.0.1", "@babel/plugin-transform-unicode-regex": "^8.0.1", "@babel/plugin-transform-unicode-sets-regex": "^8.0.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs3": "^1.0.0-rc.2", + "@babel/preset-modules": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^1.0.0", "core-js-compat": "^3.48.0", "semver": "^7.7.3" }, @@ -3306,28 +3306,54 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.2.0.tgz", + "integrity": "sha512-yz0RBN2fx4fjCeFcTWsWgL7PxSRltvTa0Qg14HkWCU3qS8MO7ZSJlBVbGceynd5C9NsJwwUHNQD3dc6tYO+jqQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-dotall-regex": "^8.0.1", + "@babel/plugin-transform-unicode-property-regex": "^8.0.1", + "@babel/types": "^8.0.0", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/preset-modules/node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "node_modules/@babel/preset-modules/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/preset-modules/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/preset-typescript": { @@ -3350,9 +3376,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -3360,9 +3386,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", + "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3373,33 +3399,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -3407,14 +3433,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3608,13 +3634,13 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", - "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", + "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } @@ -3670,9 +3696,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -3767,9 +3793,9 @@ } }, "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.7.1", @@ -3900,9 +3926,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", - "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -3992,9 +4018,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", - "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -4013,9 +4039,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.4", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.4.tgz", - "integrity": "sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg==", + "version": "6.43.9", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.9.tgz", + "integrity": "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -4083,21 +4109,21 @@ "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "dev": true, "license": "MIT", "optional": true, @@ -4106,9 +4132,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "dev": true, "license": "MIT", "optional": true, @@ -4212,9 +4238,9 @@ } }, "node_modules/@lezer/common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", - "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", "license": "MIT" }, "node_modules/@lezer/cpp": { @@ -4318,9 +4344,9 @@ } }, "node_modules/@lezer/lr": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", - "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.7.tgz", + "integrity": "sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -4403,29 +4429,29 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", "license": "MIT" }, "node_modules/@mermaid-js/parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", - "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz", + "integrity": "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==", "license": "MIT", "dependencies": { - "@chevrotain/types": "~11.1.1" + "@chevrotain/types": "~11.1.2" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -4770,9 +4796,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.142.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", - "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", "dev": true, "license": "MIT", "funding": { @@ -5089,10 +5115,27 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", - "integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", "cpu": [ "arm64" ], @@ -5107,9 +5150,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", - "integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", "cpu": [ "arm64" ], @@ -5124,9 +5167,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", - "integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", "cpu": [ "x64" ], @@ -5141,9 +5184,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", - "integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", "cpu": [ "x64" ], @@ -5158,9 +5201,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", - "integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", "cpu": [ "arm" ], @@ -5175,9 +5218,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", - "integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", "cpu": [ "arm64" ], @@ -5192,9 +5235,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", - "integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", "cpu": [ "arm64" ], @@ -5209,9 +5252,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", - "integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", "cpu": [ "ppc64" ], @@ -5226,9 +5269,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", - "integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", "cpu": [ "s390x" ], @@ -5243,9 +5286,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", - "integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", "cpu": [ "x64" ], @@ -5260,9 +5303,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", - "integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", "cpu": [ "x64" ], @@ -5277,9 +5320,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", - "integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", "cpu": [ "arm64" ], @@ -5293,82 +5336,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz", - "integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "2.0.0-alpha.3", - "@emnapi/runtime": "2.0.0-alpha.3", - "@napi-rs/wasm-runtime": "^1.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", - "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "2.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", - "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", - "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.1.tgz", - "integrity": "sha512-KjZdi8Q1wh89gsVmghvbrMgWl6ZWmRmHV6wjB7/g4Zf0dyO+hH3neZUtuDNPO00qq5YE5RITVWvrIZKRaAmzGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", - "integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", "cpu": [ "arm64" ], @@ -5383,9 +5354,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", - "integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", "cpu": [ "x64" ], @@ -5407,28 +5378,32 @@ "license": "MIT" }, "node_modules/@rspack/binding": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.3.tgz", - "integrity": "sha512-4exVNhGhW5RFHjK87XeTKbkA/qAgI5NHJlT1jNqiJv0gcUXLqTOEU3w7f8+f9zUo4JMFvPc0c9veOi4M19YYTg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.2.0.tgz", + "integrity": "sha512-nxZzJqqB0EmEKp6qjzFNkBb/SgGt0k0DSENrLvAJgvVvrm3waVsubD0cfxtPlZY/rd5SzadzxWGEHRyFcds5nA==", "dev": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "2.0.3", - "@rspack/binding-darwin-x64": "2.0.3", - "@rspack/binding-linux-arm64-gnu": "2.0.3", - "@rspack/binding-linux-arm64-musl": "2.0.3", - "@rspack/binding-linux-x64-gnu": "2.0.3", - "@rspack/binding-linux-x64-musl": "2.0.3", - "@rspack/binding-wasm32-wasi": "2.0.3", - "@rspack/binding-win32-arm64-msvc": "2.0.3", - "@rspack/binding-win32-ia32-msvc": "2.0.3", - "@rspack/binding-win32-x64-msvc": "2.0.3" + "@rspack/binding-darwin-arm64": "2.2.0", + "@rspack/binding-darwin-x64": "2.2.0", + "@rspack/binding-linux-arm64-gnu": "2.2.0", + "@rspack/binding-linux-arm64-musl": "2.2.0", + "@rspack/binding-linux-ppc64-gnu": "2.2.0", + "@rspack/binding-linux-riscv64-gnu": "2.2.0", + "@rspack/binding-linux-riscv64-musl": "2.2.0", + "@rspack/binding-linux-s390x-gnu": "2.2.0", + "@rspack/binding-linux-x64-gnu": "2.2.0", + "@rspack/binding-linux-x64-musl": "2.2.0", + "@rspack/binding-wasm32-wasi": "2.2.0", + "@rspack/binding-win32-arm64-msvc": "2.2.0", + "@rspack/binding-win32-ia32-msvc": "2.2.0", + "@rspack/binding-win32-x64-msvc": "2.2.0" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.3.tgz", - "integrity": "sha512-4UyCjLJwU/WxR6K1/gG4u3+jUsoaRHJ5rNu9fto/UbvrItwdlVNULChAApqZFw6mcSetMddSjSICeuj5pSB6sA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-KAVVT7hp3NBjtc/RY2UtOjzzc8i+s4pIhW1p52UV+Aev6ywQCu3dXwkHTonpPvJO3hqLXc4zIMH5l4HbMqBm4g==", "cpu": [ "arm64" ], @@ -5440,9 +5415,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.3.tgz", - "integrity": "sha512-K3evrbTgZNa8emEqk+AjDtbuoXZp5tPZz3pcEgETxuu3KanW8Zu+Fb+TUp1DEUcL0xOmHPPox8H2cZ3pF4Zmug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.2.0.tgz", + "integrity": "sha512-rzyJCX99aFwl540trsVMNZOgK4+IFm2d5+YeP+RdNo9Uprxloz8vHz0J4dYtaq6MRiCAyM60dAwEa3wJMwqWAQ==", "cpu": [ "x64" ], @@ -5454,9 +5429,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.3.tgz", - "integrity": "sha512-aPLDaaTtX1wqjLYAIHc2MGDQZtv1Hbjx47oaaefbWz5GbAnSA4P8jdYIeeGRyrqvQ0WqJXIWXgT0d/iXtes00A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.2.0.tgz", + "integrity": "sha512-0t8QOiOMcBV7RvPSsTJ5DQ4QCK6FIyUZy77qbxnS6asGTOXPZZn7V5cL26IxEv/wuHdQ6tQOXheau1fi+gGyBQ==", "cpu": [ "arm64" ], @@ -5468,9 +5443,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.3.tgz", - "integrity": "sha512-0WulUQPop6vmSDfrTxghmVlm+6crU8/XqD2f0dOWbEniZVuDZJ5/Y/cBqTRyk3rjl0vrmUv3lc87/t7UgQJQSw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.2.0.tgz", + "integrity": "sha512-BAvCukqcuHxUdE294ITCohvhVkEklW8RbkKkR36Uo0WyIiMPGrnvPjARPn0/4Q4xMAz7lUmC60sZrvJHlAOKMw==", "cpu": [ "arm64" ], @@ -5481,10 +5456,66 @@ "linux" ] }, + "node_modules/@rspack/binding-linux-ppc64-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-2.2.0.tgz", + "integrity": "sha512-nCHqZLv/E8nm2ccGkb00F5DQtXxzGy3W3X73ArA+N0+zXJUnzRcSRSwr7AE8pVgP/FYfX4yMFgUXy0g0YxYGRA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-riscv64-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-2.2.0.tgz", + "integrity": "sha512-CA3WEqKFDI6FAZTnCho2n9pmdPWZYAW/S8mqgxd0cx2Jix43at3VyLxhCC7ED5A9WBSFn/AdHaIbVtgoQHVhWA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-riscv64-musl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-2.2.0.tgz", + "integrity": "sha512-kHB960oClkoPRPZ6sdkhRvqbdRIlbpIMYd/Tbxfmn3DWQahiCk1pkUFJbOtFq3EgESxZISV4THl442W2Y57HvQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-s390x-gnu": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-2.2.0.tgz", + "integrity": "sha512-lVBdiffVo1jq0P0jT36jNou2suLB4ueQI4aWUs+HM+h67YPBtVKWu/mo5Wh59+8nowgcZmYaFM5hdH69963I9w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.3.tgz", - "integrity": "sha512-fAhiMuV5omT53YMft+f3Y9euAFgspuyBAk9ZpeW2buL2TkuUMwP07adhhvQfKdQ5gpELfzmjQaRDGqaIT8UWiA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.2.0.tgz", + "integrity": "sha512-M49UaWspE0YJ3268DsquD8idEQTfjBDMvO/I8qccV/Z5T+Q98FJ+kIs5liUaTWb48OIbDEK+8ZKx5QzLbfVN6g==", "cpu": [ "x64" ], @@ -5496,9 +5527,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.3.tgz", - "integrity": "sha512-0kcuFoZ8vy2iNWoISFOZt+/Ujo7LRLrzE7h07AV5r+oN/mv+/v14Sd/8NUtDIScCkrYOszYq/QS31e6t0UrVfw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.2.0.tgz", + "integrity": "sha512-YYbs0wmey+5blhEQDE4Dax3TwJtqfGwe2QBm3OLphlBHo/fcZVvimzKkMV0/pVrZTLy2z5ZAwNhGMY64bNr77w==", "cpu": [ "x64" ], @@ -5510,9 +5541,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.3.tgz", - "integrity": "sha512-x2fsw7GzNZEnw444ikj4/b8kVjM0Y0TllxmizHpYZ9gmaQrOk5OXo9RQdz+l4zzoGors0l2IZP5Cc4GJNCaSoQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.2.0.tgz", + "integrity": "sha512-rerLPTN/HD4EvLNWs3O2N+Eb37eGvLRIP3dXXc3n+UzTebOepAsahNn44vXeRBsE4m/pHkpDJjwgWTytgQ2gBw==", "cpu": [ "wasm32" ], @@ -5520,15 +5551,15 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "1.1.4" + "@emnapi/core": "1.11.3", + "@emnapi/runtime": "1.11.3", + "@napi-rs/wasm-runtime": "1.1.6" } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.3.tgz", - "integrity": "sha512-jqlxuVPdrgMuwj/HEjSkC/jmhl4fAuKyob36zJXq2uAusn2FRJ4kClGe1fLFpfxRXFVQAWwlAOwLJg8T0suuaA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.2.0.tgz", + "integrity": "sha512-JUAmnbOQYGTRyX28vls/MOMonZWcmcCi5YtEq6YMc8Xqh3Qx0HUwaLM/I1xr/N9BX3b8CV0dQDOpNuBc2ei+CA==", "cpu": [ "arm64" ], @@ -5540,9 +5571,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.3.tgz", - "integrity": "sha512-QM4JEuyk5QaZ5gnvnAIaCwVQzCkrD2E4Sud77kx/MVGDsRkcOlMx3blMC5QNHPDamRmWGk+7314YOQvRhKuWyg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.2.0.tgz", + "integrity": "sha512-wOmQRUaOG0eWH/fnfslA9yK9xKfaq9X+3Xa1TdTJnTqlo0ARJYs6A+Lzjbs7cxdY/o1f12Xe00BG3nQozReUOg==", "cpu": [ "ia32" ], @@ -5554,9 +5585,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.3.tgz", - "integrity": "sha512-vSQNnAy0wswG6AfNRuArTHQBiXOXl+A9ddQxBFup4PMHUzXxKtsBLQzw7BgFC0EgrPeHbt+30j7sXVZKYukj4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.2.0.tgz", + "integrity": "sha512-v6/3bFr9+i7hRpgulL9b5qCvZL0VgR4vQGQNqOWezUzZmPUj9LYpvB0L9xZIVwDQ2ug/xBiA58bfg5IbESgoyw==", "cpu": [ "x64" ], @@ -5568,9 +5599,9 @@ ] }, "node_modules/@rspack/cli": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.0.3.tgz", - "integrity": "sha512-h/Xbkupx82UaPr5Ye3hNORi5eXmpEGSPri7WkEOrKIcT+Y3h603kujCQziNIPX3G4UURWPiksIArp1GBTF+A9w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-2.2.0.tgz", + "integrity": "sha512-GSiQPG5v5tN8vYJdUMYX44sPiwVVG8H25fq3LWRydVB4WswDAD/N3qNgWZtFVliQdLH3ZWzFdFUoCyZmea0TMA==", "dev": true, "license": "MIT", "bin": { @@ -5587,20 +5618,20 @@ } }, "node_modules/@rspack/core": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.0.3.tgz", - "integrity": "sha512-2ufO/8FHIA/lX6UOgSsKPhpDvHr0sh9lYq/n/LsIZsTwu3973BGbu2fg1Akvuu3rEnskPqXjsqH2EPBzEA42uA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.2.0.tgz", + "integrity": "sha512-3W7oX0BAHbK4VlknH3lfyfRvupzxdZtyEa+DfKmdjzmIAcqYtHnFd0nLqp5dzitDPyDI1TIKkDhpB0AZJn0pVg==", "dev": true, "license": "MIT", "dependencies": { - "@rspack/binding": "2.0.3" + "@rspack/binding": "2.2.0" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { "@module-federation/runtime-tools": "^0.24.1 || ^2.0.0", - "@swc/helpers": ">=0.5.1" + "@swc/helpers": "^0.5.23" }, "peerDependenciesMeta": { "@module-federation/runtime-tools": { @@ -6150,16 +6181,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -6178,13 +6209,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", - "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.10", + "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -6205,9 +6236,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", - "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -6218,13 +6249,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", - "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.10", + "@vitest/utils": "4.1.11", "pathe": "^2.0.3" }, "funding": { @@ -6232,14 +6263,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", - "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -6248,9 +6279,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", "dev": true, "license": "MIT", "funding": { @@ -6258,13 +6289,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", - "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.10", + "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -6540,9 +6571,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6737,9 +6768,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -6757,8 +6788,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -6852,9 +6883,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.30", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", - "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "version": "2.11.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", + "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6980,9 +7011,9 @@ "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==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -7000,11 +7031,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -7078,9 +7109,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -7719,11 +7750,14 @@ } }, "node_modules/core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", "hasInstallScript": true, "license": "MIT", + "engines": { + "node": "*" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -7909,9 +7943,9 @@ } }, "node_modules/cytoscape": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", - "integrity": "sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==", + "version": "3.34.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.2.tgz", + "integrity": "sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g==", "license": "MIT", "engines": { "node": ">=0.10" @@ -8423,9 +8457,9 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", "license": "MIT" }, "node_modules/debug": { @@ -8596,9 +8630,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -8633,9 +8667,9 @@ "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", - "integrity": "sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==", + "version": "1.5.415", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", + "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", "dev": true, "license": "ISC" }, @@ -8716,6 +8750,7 @@ "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -8772,13 +8807,15 @@ "license": "MIT" }, "node_modules/es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.51.0.tgz", + "integrity": "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types", + "tests/browser-compat" ] }, "node_modules/escalade": { @@ -8983,9 +9020,9 @@ } }, "node_modules/filesize": { - "version": "11.0.17", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.17.tgz", - "integrity": "sha512-oHLTvMLw6imZUl1se/RBQrFlyy50nXce4sU7yGR6Qc0JgCwqnfiFsAnEwotdGmfKLD7SArGUk2/5STU0k8LOBQ==", + "version": "11.0.22", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.22.tgz", + "integrity": "sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==", "license": "BSD-3-Clause", "engines": { "node": ">= 10.8.0" @@ -9045,12 +9082,12 @@ } }, "node_modules/framer-motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.0.tgz", - "integrity": "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.43.0.tgz", + "integrity": "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g==", "license": "MIT", "dependencies": { - "motion-dom": "^12.42.0", + "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, @@ -9239,9 +9276,9 @@ "license": "MIT" }, "node_modules/happy-dom": { - "version": "20.11.1", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.11.1.tgz", - "integrity": "sha512-XSt8tMzbW9ymE7687xztkO1ckR7qJNQ3LywY9vlYGhGi3zXrGBHuUo2Cl1ztZaICW+1eAGdkLbj6iwVqDT33kg==", + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.11.6.tgz", + "integrity": "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg==", "dev": true, "license": "MIT", "dependencies": { @@ -10232,9 +10269,9 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "funding": [ { "type": "github", @@ -10385,9 +10422,9 @@ } }, "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "funding": [ { "type": "github", @@ -10401,8 +10438,8 @@ "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -10412,9 +10449,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", - "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.1.tgz", + "integrity": "sha512-p6APiLJDFAW2GEvaavDvhIBn7jrX2jLv77NkBGgNacFTurbORYc4pyYySg/mI6mpR6cHQuAtzKtmqgQr4K8dsQ==", "license": "Unlicense", "peerDependencies": { "@types/markdown-it": "*", @@ -10422,9 +10459,9 @@ } }, "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.1.0.tgz", + "integrity": "sha512-NhmMEH2ywduD4Nty1E8uB5NqfLhAT1VR0dyvoJyStKOqCzbZmVdn/+8wj7zpDsb/fLBikpCPsWwxqKlvMmbz4g==", "license": "MIT" }, "node_modules/markdown-it-footnote": { @@ -11212,12 +11249,12 @@ } }, "node_modules/motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.0.tgz", - "integrity": "sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.43.0.tgz", + "integrity": "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ==", "license": "MIT", "dependencies": { - "framer-motion": "^12.42.0", + "framer-motion": "^12.43.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -11238,9 +11275,9 @@ } }, "node_modules/motion-dom": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.0.tgz", - "integrity": "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==", + "version": "12.43.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.43.0.tgz", + "integrity": "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==", "license": "MIT", "dependencies": { "motion-utils": "^12.39.0" @@ -11268,9 +11305,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -11347,11 +11384,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { "version": "9.0.0", @@ -11809,9 +11849,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -11851,9 +11891,9 @@ } }, "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -11871,7 +11911,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -12386,13 +12426,13 @@ "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==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.142.0", + "@oxc-project/types": "=0.147.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12402,21 +12442,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.1", - "@rolldown/binding-darwin-arm64": "1.2.1", - "@rolldown/binding-darwin-x64": "1.2.1", - "@rolldown/binding-freebsd-x64": "1.2.1", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", - "@rolldown/binding-linux-arm64-gnu": "1.2.1", - "@rolldown/binding-linux-arm64-musl": "1.2.1", - "@rolldown/binding-linux-ppc64-gnu": "1.2.1", - "@rolldown/binding-linux-s390x-gnu": "1.2.1", - "@rolldown/binding-linux-x64-gnu": "1.2.1", - "@rolldown/binding-linux-x64-musl": "1.2.1", - "@rolldown/binding-openharmony-arm64": "1.2.1", - "@rolldown/binding-wasm32-wasi": "1.2.1", - "@rolldown/binding-win32-arm64-msvc": "1.2.1", - "@rolldown/binding-win32-x64-msvc": "1.2.1" + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" } }, "node_modules/roughjs": { @@ -12473,13 +12513,13 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", + "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -12487,7 +12527,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" @@ -12534,6 +12574,36 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", @@ -13106,37 +13176,28 @@ } }, "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", + "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", + "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "webpack": "^4.0.0 || ^5.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } } }, "node_modules/tslib": { @@ -13288,9 +13349,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -13345,16 +13406,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist-node/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/valid-identifier": { @@ -13382,16 +13443,16 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -13408,7 +13469,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -13460,19 +13521,19 @@ } }, "node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.10", - "@vitest/mocker": "4.1.10", - "@vitest/pretty-format": "4.1.10", - "@vitest/runner": "4.1.10", - "@vitest/snapshot": "4.1.10", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -13500,12 +13561,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.10", - "@vitest/browser-preview": "4.1.10", - "@vitest/browser-webdriverio": "4.1.10", - "@vitest/coverage-istanbul": "4.1.10", - "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -13812,9 +13873,9 @@ } }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { @@ -13891,15 +13952,15 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" }, @@ -13932,6 +13993,22 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 7e49faba2d..2a2a7deae2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.foxdebug.acode", "displayName": "Acode", - "version": "1.13.1", + "version": "1.13.3", "description": "Acode is a code editor for android", "scripts": { "lang": "node ./utils/lang.js", @@ -64,22 +64,22 @@ "homepage": "https://github.com/deadlyjack/acode#readme", "devDependencies": { "@babel/core": "^8.0.1", - "@babel/generator": "^7.29.1", - "@babel/parser": "^7.29.3", + "@babel/generator": "^7.29.8", + "@babel/parser": "^7.29.8", "@babel/plugin-transform-runtime": "^8.0.1", - "@babel/preset-env": "^8.0.1", + "@babel/preset-env": "^8.0.2", "@babel/preset-typescript": "^8.0.1", - "@babel/runtime": "^7.29.2", - "@babel/runtime-corejs3": "^7.29.2", - "@babel/traverse": "^7.29.0", + "@babel/runtime": "^7.29.7", + "@babel/runtime-corejs3": "^7.29.7", + "@babel/traverse": "^7.29.8", "@biomejs/biome": "2.4.11", "@lezer/generator": "^1.8.0", - "@rspack/cli": "^2.0.0", - "@rspack/core": "^2.0.0", + "@rspack/cli": "^2.2.0", + "@rspack/core": "^2.2.0", "@types/ace": "^0.0.52", "@types/cordova": "^11.0.3", "@types/url-parse": "^1.4.11", - "autoprefixer": "^10.5.0", + "autoprefixer": "^10.5.4", "babel-loader": "^10.1.1", "chokidar": "^4.0.3", "com.foxdebug.acode.rk.auth": "file:src/plugins/auth", @@ -104,38 +104,38 @@ "cordova-plugin-system": "file:src/plugins/system", "cordova-plugin-websocket": "file:src/plugins/websocket", "css-loader": "^7.1.4", - "happy-dom": "^20.11.1", + "happy-dom": "^20.11.6", "mini-css-extract-plugin": "^2.10.2", "path-browserify": "^1.0.1", "postcss-loader": "^8.2.1", "prettier": "^3.8.3", "prettier-plugin-java": "^2.8.1", "raw-loader": "^4.0.2", - "sass": "^1.99.0", + "sass": "^1.103.1", "sass-loader": "^16.0.8", "style-loader": "^4.0.0", "terminal": "^0.1.4", - "ts-loader": "^9.5.7", + "ts-loader": "^9.6.2", "typescript": "^5.9.3", - "vitest": "^4.1.10", + "vitest": "^4.1.11", "vscode-languageserver-types": "^3.17.5", - "ws": "^8.21.0" + "ws": "^8.21.3" }, "dependencies": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", + "@codemirror/commands": "^6.11.0", "@codemirror/lang-angular": "^0.1.4", "@codemirror/lang-cpp": "^6.0.3", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-go": "^6.0.1", - "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-java": "^6.0.2", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-jinja": "^6.0.1", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-less": "^6.0.2", "@codemirror/lang-liquid": "^6.3.2", - "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-markdown": "^6.5.2", "@codemirror/lang-php": "^6.0.2", "@codemirror/lang-python": "^6.2.1", "@codemirror/lang-rust": "^6.0.2", @@ -145,15 +145,15 @@ "@codemirror/lang-wast": "^6.0.2", "@codemirror/lang-xml": "^6.1.0", "@codemirror/lang-yaml": "^6.1.3", - "@codemirror/language": "^6.12.3", + "@codemirror/language": "^6.12.4", "@codemirror/language-data": "^6.5.2", "@codemirror/legacy-modes": "^6.5.3", "@codemirror/lint": "^6.9.7", "@codemirror/lsp-client": "github:Acode-Foundation/codemirror-lsp-client#db6930c2b6db67e14978f08ae8f5aeb149d29468", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", + "@codemirror/state": "^6.7.1", "@codemirror/theme-one-dark": "^6.1.3", - "@codemirror/view": "^6.43.4", + "@codemirror/view": "^6.43.9", "@deadlyjack/ajax": "^1.2.6", "@emmetio/codemirror6-plugin": "^0.4.1", "@lezer/common": "^1.5.0", @@ -168,47 +168,47 @@ "@xterm/addon-web-links": "^0.12.0", "@xterm/addon-webgl": "^0.19.0", "@xterm/xterm": "^6.0.0", - "acorn": "^8.16.0", + "acorn": "^8.18.0", "autosize": "^6.0.1", "codemirror": "^6.0.2", "cordova": "13.0.0", - "core-js": "^3.49.0", - "dayjs": "^1.11.20", - "dompurify": "^3.4.11", + "core-js": "^3.50.0", + "dayjs": "^1.11.23", + "dompurify": "^3.4.14", "escape-string-regexp": "^5.0.0", "esprima": "^4.0.1", - "filesize": "^11.0.17", + "filesize": "^11.0.22", "html-tag-js": "^2.4.16", "jszip": "^3.10.1", - "katex": "^0.16.45", - "markdown-it": "^14.2.0", - "markdown-it-anchor": "^9.2.0", - "markdown-it-emoji": "^3.0.0", + "katex": "^0.16.47", + "markdown-it": "^14.3.0", + "markdown-it-anchor": "^9.2.1", + "markdown-it-emoji": "^3.1.0", "markdown-it-footnote": "^4.0.0", "markdown-it-github-alerts": "^1.0.1", "markdown-it-task-lists": "^2.1.1", "markdown-it-texmath": "^1.0.0", "mermaid": "^11.14.0", "mime-types": "^3.0.2", - "motion": "^12.42.0", + "motion": "^12.43.0", "mustache": "^4.2.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.7", "url-parse": "^1.5.10", "vanilla-picker": "^2.12.3", "vscode-css-languageservice": "6.3.10", "vscode-html-languageservice": "5.6.2", "vscode-json-languageservice": "5.7.2", "vscode-languageserver-textdocument": "1.0.12", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "overrides": { "@codemirror/autocomplete": "^6.20.3", - "@codemirror/commands": "^6.10.3", - "@codemirror/language": "^6.12.3", + "@codemirror/commands": "^6.11.0", + "@codemirror/language": "^6.12.4", "@codemirror/lint": "^6.9.7", "@codemirror/search": "^6.7.1", - "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.43.4", + "@codemirror/state": "^6.7.1", + "@codemirror/view": "^6.43.9", "tar": "^7.5.22" }, "browserslist": "cover 100%", diff --git a/readme.md b/readme.md index f95dad8c33..ca69912401 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,8 @@ Welcome to Acode Editor - a powerful and versatile code editing tool designed sp - Edit and create websites, and instantly preview them in a browser. - Seamlessly modify source files for various languages like Python, Java, JavaScript, and more. - Built-in javascript console +- S/FTP and SSH terminal integration +- Built-in terminal(Alpine) - Enjoy multi-language editing support with easy management tools. - Enjoy a large collections of community plugins to enhance your coding experience. diff --git a/rspack.config.js b/rspack.config.js index a30e31154b..9efbf30197 100644 --- a/rspack.config.js +++ b/rspack.config.js @@ -144,6 +144,7 @@ module.exports = (env, options) => { boot: './src/boot.js', main: './src/main.js', console: './src/lib/console.js', + consoleWorker: './src/lib/consoleWorker.js', searchInFilesWorker: './src/sidebarApps/searchInFiles/worker.js', searchIndexWorker: './src/sidebarApps/searchInFiles/indexWorker.js', htmlLspWorker: './src/cm/lsp/workers/html.worker.ts', diff --git a/src/cm/commandRegistry.js b/src/cm/commandRegistry.js index 1446027cbb..5d53cb1747 100644 --- a/src/cm/commandRegistry.js +++ b/src/cm/commandRegistry.js @@ -63,13 +63,7 @@ import { } from "@codemirror/lint"; import { LSPPlugin, - closeReferencePanel as lspCloseReferencePanel, - findReferences as lspFindReferences, formatDocument as lspFormatDocument, - jumpToDeclaration as lspJumpToDeclaration, - jumpToDefinition as lspJumpToDefinition, - jumpToImplementation as lspJumpToImplementation, - jumpToTypeDefinition as lspJumpToTypeDefinition, } from "@codemirror/lsp-client"; import { Compartment, EditorSelection } from "@codemirror/state"; import { keymap } from "@codemirror/view"; @@ -91,6 +85,10 @@ import { renameSymbol as acodeRenameSymbol, clearDiagnosticsEffect, clientManager, + jumpToDeclaration as lspJumpToDeclaration, + jumpToDefinition as lspJumpToDefinition, + jumpToImplementation as lspJumpToImplementation, + jumpToTypeDefinition as lspJumpToTypeDefinition, nextSignature as lspNextSignature, prevSignature as lspPrevSignature, showSignatureHelp as lspShowSignatureHelp, diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index 11bb6f5401..efd9cb284d 100644 --- a/src/cm/lsp/clientManager.ts +++ b/src/cm/lsp/clientManager.ts @@ -24,6 +24,7 @@ import { supportsBuiltinFormatting } from "./formattingSupport"; import { documentColorsExtension } from "./documentColors"; import { inlayHintsExtension } from "./inlayHints"; import { addLspLog } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import { selectRuntimeProvider } from "./runtimeProviders"; import serverRegistry from "./serverRegistry"; import { @@ -804,6 +805,14 @@ export class LspClientManager { configuration: true, workspaceFolders: true, }, + textDocument: { + codeAction: { + dataSupport: true, + resolveSupport: { + properties: ["edit"], + }, + }, + }, }, }; @@ -1436,12 +1445,8 @@ function applyTextEdits( if (!edit?.range) continue; let fromBase: number; let toBase: number; - try { - fromBase = plugin.fromPosition(edit.range.start, plugin.syncedDoc); - toBase = plugin.fromPosition(edit.range.end, plugin.syncedDoc); - } catch (_) { - continue; - } + fromBase = safeLspPositionToOffset(plugin.syncedDoc, edit.range.start); + toBase = safeLspPositionToOffset(plugin.syncedDoc, edit.range.end); const fromResult = plugin.unsyncedChanges.mapPos( fromBase, 1, diff --git a/src/cm/lsp/codeActions.ts b/src/cm/lsp/codeActions.ts index 89811ac560..7e8996e5ad 100644 --- a/src/cm/lsp/codeActions.ts +++ b/src/cm/lsp/codeActions.ts @@ -12,8 +12,9 @@ import type { Range as LspRange, WorkspaceEdit, } from "vscode-languageserver-types"; -import type { Position, Range } from "./types"; +import type { Range } from "./types"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type AcodeWorkspace from "./workspace"; type CodeActionResponse = (CodeAction | Command)[] | null; @@ -62,13 +63,6 @@ function isCommand(item: CodeAction | Command): item is Command { ); } -function lspPositionToOffset( - doc: { line: (n: number) => { from: number } }, - pos: Position, -): number { - return doc.line(pos.line + 1).from + pos.character; -} - async function requestCodeActions( plugin: LSPPlugin, range: LspRange, @@ -157,7 +151,7 @@ async function applyChangesToFile( workspace: AcodeWorkspace, uri: string, changes: LspChange[], - mapping: { mapPosition: (uri: string, pos: Position) => number }, + mapping: { mapPos: (uri: string, pos: number, assoc?: number) => number }, ): Promise { const file = workspace.getFile(uri); if (file) { @@ -165,8 +159,16 @@ async function applyChangesToFile( if (view) { view.dispatch({ changes: changes.map((c) => ({ - from: mapping.mapPosition(uri, c.range.start), - to: mapping.mapPosition(uri, c.range.end), + from: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, c.range.start), + 1, + ), + to: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, c.range.end), + -1, + ), insert: c.newText, })), userEvent: "codeAction", @@ -188,8 +190,11 @@ async function applyChangesToFile( displayedView.dispatch({ changes: changes.map((c) => ({ - from: lspPositionToOffset(displayedView.state.doc, c.range.start), - to: lspPositionToOffset(displayedView.state.doc, c.range.end), + from: safeLspPositionToOffset( + displayedView.state.doc, + c.range.start, + ), + to: safeLspPositionToOffset(displayedView.state.doc, c.range.end), insert: c.newText, })), userEvent: "codeAction", diff --git a/src/cm/lsp/definition.ts b/src/cm/lsp/definition.ts new file mode 100644 index 0000000000..53d3726ed7 --- /dev/null +++ b/src/cm/lsp/definition.ts @@ -0,0 +1,147 @@ +import { LSPPlugin } from "@codemirror/lsp-client"; +import type { Command, EditorView } from "@codemirror/view"; +import { showReferencesPanel } from "components/referencesPanel"; +import { navigateToReference } from "components/referencesPanel/utils"; +import toast from "components/toast"; +import type { ServerCapabilities } from "vscode-languageserver-protocol"; +import { normalizeLocations, type LspLocationResult } from "./locationUtils"; +import { addLspLogFor } from "./logs"; +import { fetchLineText, getWordAtCursor } from "./references"; + +type DefinitionKind = + | "definition" + | "declaration" + | "implementation" + | "typeDefinition"; + +const CAPABILITY: Record = { + definition: "definitionProvider", + declaration: "declarationProvider", + implementation: "implementationProvider", + typeDefinition: "typeDefinitionProvider", +}; + +const LABEL: Record = { + definition: "definition", + declaration: "declaration", + implementation: "implementation", + typeDefinition: "type definition", +}; + +function locationKey(location: ReturnType[number]) { + const { start, end } = location.range; + return `${location.uri}:${start.line}:${start.character}:${end.line}:${end.character}`; +} + +async function fetchLocations( + view: EditorView, + kind: DefinitionKind, +): Promise | null> { + const plugins = LSPPlugin.getAll(view, kind).filter( + (plugin) => !!plugin.client.serverCapabilities?.[CAPABILITY[kind]], + ); + if (!plugins.length) { + toast(`Language server does not support go to ${LABEL[kind]}`); + return null; + } + + const position = view.state.selection.main.head; + const settled = await Promise.allSettled( + plugins.map(async (plugin) => { + plugin.client.sync(); + return plugin.client.request< + { + textDocument: { uri: string }; + position: { line: number; character: number }; + }, + LspLocationResult + >(`textDocument/${kind}`, { + textDocument: { uri: plugin.uri }, + position: plugin.toPosition(position), + }); + }), + ); + + const locations: ReturnType = []; + const seen = new Set(); + for (let index = 0; index < settled.length; index++) { + const result = settled[index]; + if (result.status === "rejected") { + addLspLogFor( + plugins[index], + "warn", + `Go to ${LABEL[kind]} failed`, + result.reason, + ); + continue; + } + for (const location of normalizeLocations(result.value)) { + const key = locationKey(location); + if (seen.has(key)) continue; + seen.add(key); + locations.push(location); + } + } + return locations; +} + +async function goTo(view: EditorView, kind: DefinitionKind): Promise { + try { + const locations = await fetchLocations(view, kind); + if (locations === null) return false; + if (!locations.length) { + toast(`No ${LABEL[kind]} found`); + return true; + } + + if (locations.length === 1) { + await navigateToReference(locations[0]); + return true; + } + + const symbolName = getWordAtCursor(view); + const panel = showReferencesPanel({ symbolName }); + panel.setReferences( + await Promise.all( + locations.map(async (location) => ({ + ...location, + lineText: await fetchLineText( + location.uri, + location.range.start.line, + ), + })), + ), + ); + return true; + } catch (error) { + console.error(`[LSP:Definition] Go to ${LABEL[kind]} failed:`, error); + return false; + } +} + +export const jumpToDefinition: Command = (view) => { + void goTo(view, "definition"); + return true; +}; + +export const jumpToDeclaration: Command = (view) => { + void goTo(view, "declaration"); + return true; +}; + +export const jumpToImplementation: Command = (view) => { + void goTo(view, "implementation"); + return true; +}; + +export const jumpToTypeDefinition: Command = (view) => { + void goTo(view, "typeDefinition"); + return true; +}; + +export const goToDefinition = (view: EditorView) => goTo(view, "definition"); +export const goToDeclaration = (view: EditorView) => goTo(view, "declaration"); +export const goToImplementation = (view: EditorView) => + goTo(view, "implementation"); +export const goToTypeDefinition = (view: EditorView) => + goTo(view, "typeDefinition"); diff --git a/src/cm/lsp/diagnostics.ts b/src/cm/lsp/diagnostics.ts index 906c505167..61e670ac73 100644 --- a/src/cm/lsp/diagnostics.ts +++ b/src/cm/lsp/diagnostics.ts @@ -10,6 +10,7 @@ import { } from "@codemirror/state"; import { type EditorView, ViewPlugin, type ViewUpdate } from "@codemirror/view"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type { DocumentDiagnosticParams, DocumentDiagnosticReport, @@ -186,13 +187,13 @@ function collectLspDiagnostics( let from: number; let to: number; try { - const mappedFrom = plugin.fromPosition( - diagnostic.range.start, + const mappedFrom = safeLspPositionToOffset( plugin.syncedDoc, + diagnostic.range.start, ); - const mappedTo = plugin.fromPosition( - diagnostic.range.end, + const mappedTo = safeLspPositionToOffset( plugin.syncedDoc, + diagnostic.range.end, ); const fromResult = plugin.unsyncedChanges.mapPos(mappedFrom); const toResult = plugin.unsyncedChanges.mapPos(mappedTo); diff --git a/src/cm/lsp/documentColors.ts b/src/cm/lsp/documentColors.ts index 11496259fd..6c64c7540d 100644 --- a/src/cm/lsp/documentColors.ts +++ b/src/cm/lsp/documentColors.ts @@ -36,6 +36,7 @@ import { type ColorChipPayload, } from "../colorChip"; import type { LSPPluginAPI } from "./types"; +import { safeLspPositionToOffset } from "./positionUtils"; export interface DocumentColorsConfig { enabled?: boolean; @@ -178,8 +179,8 @@ function mapLspRange( let from: number; let to: number; try { - const fromBase = lsp.fromPosition(range.start, lsp.syncedDoc); - const toBase = lsp.fromPosition(range.end, lsp.syncedDoc); + const fromBase = safeLspPositionToOffset(lsp.syncedDoc, range.start); + const toBase = safeLspPositionToOffset(lsp.syncedDoc, range.end); const fromMapped = lsp.unsyncedChanges.mapPos( fromBase, 1, diff --git a/src/cm/lsp/index.ts b/src/cm/lsp/index.ts index f3a8b4d36a..e165f91b17 100644 --- a/src/cm/lsp/index.ts +++ b/src/cm/lsp/index.ts @@ -89,6 +89,16 @@ export { findAllReferences, findAllReferencesInTab, } from "./references"; +export { + goToDeclaration, + goToDefinition, + goToImplementation, + goToTypeDefinition, + jumpToDeclaration, + jumpToDefinition, + jumpToImplementation, + jumpToTypeDefinition, +} from "./definition"; export { acodeRenameExtension, acodeRenameKeymap, diff --git a/src/cm/lsp/inlayHints.ts b/src/cm/lsp/inlayHints.ts index 477c82d1b2..112ec3e5b3 100644 --- a/src/cm/lsp/inlayHints.ts +++ b/src/cm/lsp/inlayHints.ts @@ -22,6 +22,7 @@ import type { Position, } from "vscode-languageserver-types"; import type { LSPPluginAPI } from "./types"; +import { safeLspPositionToOffset } from "./positionUtils"; // ============================================================================ // Types @@ -238,7 +239,7 @@ function createPlugin(config: InlayHintsConfig) { let pos: number; try { - pos = lsp.fromPosition(h.position, lsp.syncedDoc); + pos = safeLspPositionToOffset(lsp.syncedDoc, h.position); const mapped = lsp.unsyncedChanges.mapPos(pos); if (mapped === null) continue; pos = mapped; diff --git a/src/cm/lsp/locationUtils.ts b/src/cm/lsp/locationUtils.ts new file mode 100644 index 0000000000..672c6a2744 --- /dev/null +++ b/src/cm/lsp/locationUtils.ts @@ -0,0 +1,26 @@ +import type { + Location, + LocationLink, +} from "vscode-languageserver-protocol"; + +export type LspLocationResult = + | Location + | Location[] + | LocationLink[] + | null; + +/** Normalize definition-style responses to the Location shape used by Acode. */ +export function normalizeLocations(result: LspLocationResult): Location[] { + if (!result) return []; + const locations = Array.isArray(result) ? result : [result]; + + return locations.map((location) => { + if ("targetUri" in location) { + return { + uri: location.targetUri, + range: location.targetSelectionRange ?? location.targetRange, + }; + } + return location; + }); +} diff --git a/src/cm/lsp/positionUtils.ts b/src/cm/lsp/positionUtils.ts new file mode 100644 index 0000000000..158afe188e --- /dev/null +++ b/src/cm/lsp/positionUtils.ts @@ -0,0 +1,16 @@ +import type { Text } from "@codemirror/state"; + +/** Convert an LSP position to an offset without reading outside the document. */ +export function safeLspPositionToOffset( + doc: Pick, + position: { line: number; character: number }, +): number { + if (position.line < 0) return 0; + if (position.line >= doc.lines) return doc.length; + + const line = doc.line(position.line + 1); + const character = Number.isFinite(position.character) + ? Math.max(0, Math.min(position.character, line.length)) + : 0; + return line.from + character; +} diff --git a/src/cm/lsp/references.ts b/src/cm/lsp/references.ts index def69288c3..cb02fe207d 100644 --- a/src/cm/lsp/references.ts +++ b/src/cm/lsp/references.ts @@ -33,7 +33,7 @@ interface ReferenceParams { context: { includeDeclaration: boolean }; } -async function fetchLineText(uri: string, line: number): Promise { +export async function fetchLineText(uri: string, line: number): Promise { try { interface EditorManagerLike { getFile?: (uri: string, type: string) => EditorFileLike | null; @@ -89,7 +89,7 @@ async function fetchLineText(uri: string, line: number): Promise { return ""; } -function getWordAtCursor(view: EditorView): string { +export function getWordAtCursor(view: EditorView): string { const { state } = view; const pos = state.selection.main.head; const word = state.wordAt(pos); diff --git a/src/cm/lsp/rename.ts b/src/cm/lsp/rename.ts index 75b89693cb..5e4c93b50b 100644 --- a/src/cm/lsp/rename.ts +++ b/src/cm/lsp/rename.ts @@ -8,6 +8,7 @@ import { import prompt from "dialogs/prompt"; import type * as lsp from "vscode-languageserver-protocol"; import { addLspLogFor } from "./logs"; +import { safeLspPositionToOffset } from "./positionUtils"; import type AcodeWorkspace from "./workspace"; interface RenameParams { @@ -99,12 +100,24 @@ async function performRename(view: EditorView): Promise { ) { initialValue = word; } else if ("start" in prepareResult && "end" in prepareResult) { - const from = plugin.fromPosition(prepareResult.start); - const to = plugin.fromPosition(prepareResult.end); + const from = safeLspPositionToOffset( + view.state.doc, + prepareResult.start, + ); + const to = safeLspPositionToOffset( + view.state.doc, + prepareResult.end, + ); initialValue = view.state.sliceDoc(from, to); } else if ("range" in prepareResult && prepareResult.range) { - const from = plugin.fromPosition(prepareResult.range.start); - const to = plugin.fromPosition(prepareResult.range.end); + const from = safeLspPositionToOffset( + view.state.doc, + prepareResult.range.start, + ); + const to = safeLspPositionToOffset( + view.state.doc, + prepareResult.range.end, + ); initialValue = view.state.sliceDoc(from, to); } } @@ -148,19 +161,11 @@ async function performRename(view: EditorView): Promise { return true; } -function lspPositionToOffset( - doc: { line: (n: number) => { from: number } }, - pos: lsp.Position, -): number { - const line = doc.line(pos.line + 1); - return line.from + pos.character; -} - async function applyChangesToFile( workspace: AcodeWorkspace, uri: string, lspChanges: LspChange[], - mapping: { mapPosition: (uri: string, pos: lsp.Position) => number }, + mapping: { mapPos: (uri: string, pos: number, assoc?: number) => number }, ): Promise { const file = workspace.getFile(uri); @@ -169,8 +174,16 @@ async function applyChangesToFile( if (view) { view.dispatch({ changes: lspChanges.map((change) => ({ - from: mapping.mapPosition(uri, change.range.start), - to: mapping.mapPosition(uri, change.range.end), + from: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, change.range.start), + 1, + ), + to: mapping.mapPos( + uri, + safeLspPositionToOffset(file.doc, change.range.end), + -1, + ), insert: change.newText, })), userEvent: "rename", @@ -189,8 +202,8 @@ async function applyChangesToFile( const doc = displayedView.state.doc; displayedView.dispatch({ changes: lspChanges.map((change) => ({ - from: lspPositionToOffset(doc, change.range.start), - to: lspPositionToOffset(doc, change.range.end), + from: safeLspPositionToOffset(doc, change.range.start), + to: safeLspPositionToOffset(doc, change.range.end), insert: change.newText, })), userEvent: "rename", diff --git a/src/cm/lsp/serverLauncher.ts b/src/cm/lsp/serverLauncher.ts index ea39576d5a..b6c3058111 100644 --- a/src/cm/lsp/serverLauncher.ts +++ b/src/cm/lsp/serverLauncher.ts @@ -781,7 +781,7 @@ export async function installServer( icon: "zap", loading: () => loading, title: displayLabel, - message: `${actionLabel}ing ${displayLabel}...`, + message: `${isUpdate ? "Updating" : "Installing"} ${displayLabel}...`, }); await runForegroundCommand(command); resetInstallState(server.id); diff --git a/src/cm/lsp/servers/luau.ts b/src/cm/lsp/servers/luau.ts index 4d401ff4dc..f83113f098 100644 --- a/src/cm/lsp/servers/luau.ts +++ b/src/cm/lsp/servers/luau.ts @@ -164,7 +164,7 @@ esac && apk add --no-cache gcompat libstdc++ && TMP_DIR="$(mktemp -d)" && cleanu const loadingDialog = loader.create( label, - `${actionLabel}ing ${label}...`, + `${mode === "update" ? "Updating" : "Installing"} ${label}...`, ); try { loadingDialog.show(); diff --git a/src/cm/lsp/tooltipExtensions.ts b/src/cm/lsp/tooltipExtensions.ts index 2a9a157ea0..7332d12a2c 100644 --- a/src/cm/lsp/tooltipExtensions.ts +++ b/src/cm/lsp/tooltipExtensions.ts @@ -40,6 +40,7 @@ import type { MarkupContent, } from "vscode-languageserver-types"; import { getMode, getModeForPath, type Mode } from "../modelist"; +import { safeLspPositionToOffset } from "./positionUtils"; interface LspClientInternals { config?: { @@ -258,14 +259,6 @@ async function loadHoverContentLanguages(contents: Hover["contents"]): Promise"']/g, (match) => { switch (match) { @@ -401,8 +394,14 @@ function lspTooltipSource( let to = pos; for (const { result } of results) { if (!result.range) continue; - from = Math.min(from, fromPosition(view.state.doc, result.range.start)); - to = Math.max(to, fromPosition(view.state.doc, result.range.end)); + from = Math.min( + from, + safeLspPositionToOffset(view.state.doc, result.range.start), + ); + to = Math.max( + to, + safeLspPositionToOffset(view.state.doc, result.range.end), + ); } return { diff --git a/src/cm/lsp/types.ts b/src/cm/lsp/types.ts index ad47e72df0..6f39038a42 100644 --- a/src/cm/lsp/types.ts +++ b/src/cm/lsp/types.ts @@ -631,13 +631,8 @@ export interface LSPPluginAPI { client: LSPClient & { sync: () => void; connected?: boolean }; /** Convert a document offset to an LSP Position */ toPosition: (offset: number) => { line: number; character: number }; - /** Convert an LSP Position to a document offset */ - fromPosition: ( - pos: { line: number; character: number }, - doc?: unknown, - ) => number; /** The currently synced document state */ - syncedDoc: { length: number }; + syncedDoc: Text; /** Pending changes that haven't been synced yet */ unsyncedChanges: { mapPos: (pos: number, assoc?: number, mode?: MapMode) => number | null; diff --git a/src/cm/mainEditorExtensions.ts b/src/cm/mainEditorExtensions.ts index e445bf9b40..f825898d4a 100644 --- a/src/cm/mainEditorExtensions.ts +++ b/src/cm/mainEditorExtensions.ts @@ -1,5 +1,6 @@ import type { Extension } from "@codemirror/state"; import { EditorView } from "@codemirror/view"; +import searchMatchHighlighter from "./searchMatchHighlighter"; interface MainEditorExtensionOptions { emmetExtensions?: Extension[]; @@ -51,7 +52,9 @@ export function createMainEditorExtensions( pushExtension(extensions, options.multiCursorSelectionExtension); pushExtension(extensions, options.touchSelectionUpdateExtension); pushExtension(extensions, options.quickToolsModifierInputExtension); - pushExtension(extensions, options.searchExtension); + if (options.searchExtension != null) { + extensions.push(options.searchExtension, searchMatchHighlighter); + } pushExtension(extensions, options.readOnlyExtension); if (options.optionExtensions?.length) { diff --git a/src/cm/searchMatchHighlighter.ts b/src/cm/searchMatchHighlighter.ts new file mode 100644 index 0000000000..70449c54ab --- /dev/null +++ b/src/cm/searchMatchHighlighter.ts @@ -0,0 +1,140 @@ +import { + getSearchQuery, + searchPanelOpen, + type SearchQuery, +} from "@codemirror/search"; +import { RangeSetBuilder, type EditorState } from "@codemirror/state"; +import type { DecorationSet, ViewUpdate } from "@codemirror/view"; +import { Decoration, EditorView, ViewPlugin } from "@codemirror/view"; + +interface DocRange { + from: number; + to: number; +} + +// Keep the same regular-expression look-around used by CodeMirror's built-in +// search highlighter. Literal searches only need enough context to catch a +// match that crosses a viewport boundary. +const REGEXP_SCAN_MARGIN = 250; + +const matchMark = Decoration.mark({ class: "cm-searchMatch" }); +const selectedMatchMark = Decoration.mark({ + class: "cm-searchMatch cm-searchMatch-selected", +}); + +function scanMargin(query: SearchQuery): number { + return query.regexp ? REGEXP_SCAN_MARGIN : query.search.length; +} + +function sameHighlightQuery(left: SearchQuery, right: SearchQuery): boolean { + return ( + left.search === right.search && + left.caseSensitive === right.caseSensitive && + left.literal === right.literal && + left.regexp === right.regexp && + left.wholeWord === right.wholeWord && + left.test === right.test + ); +} + +function scanRanges( + visibleRanges: readonly DocRange[], + margin: number, + docLength: number, +): DocRange[] { + const ranges: DocRange[] = []; + + for (const visible of visibleRanges) { + const from = Math.max(0, visible.from - margin); + const to = Math.min(docLength, visible.to + margin); + const previous = ranges[ranges.length - 1]; + + if (previous && from <= previous.to) { + previous.to = Math.max(previous.to, to); + } else { + ranges.push({ from, to }); + } + } + + return ranges; +} + +/** + * Builds search marks only around rendered document ranges. Keeping this + * separate from the view plugin makes the viewport-only behavior testable. + */ +export function buildSearchMatchDecorations( + state: EditorState, + visibleRanges: readonly DocRange[], +): DecorationSet { + const query = getSearchQuery(state); + if (!query.search || !query.valid || searchPanelOpen(state)) { + return Decoration.none; + } + + const builder = new RangeSetBuilder(); + const ranges = scanRanges(visibleRanges, scanMargin(query), state.doc.length); + const selectedRanges = new Map>(); + for (const range of state.selection.ranges) { + let ends = selectedRanges.get(range.from); + if (!ends) selectedRanges.set(range.from, (ends = new Set())); + ends.add(range.to); + } + + for (const { from, to } of ranges) { + const cursor = query.getCursor(state, from, to); + for (let result = cursor.next(); !result.done; result = cursor.next()) { + const match = result.value; + const selected = selectedRanges.get(match.from)?.has(match.to) === true; + builder.add( + match.from, + match.to, + selected ? selectedMatchMark : matchMark, + ); + } + } + + return builder.finish(); +} + +class SearchMatchHighlighterPlugin { + decorations: DecorationSet; + + constructor(view: EditorView) { + this.decorations = buildSearchMatchDecorations( + view.state, + view.visibleRanges, + ); + } + + update(update: ViewUpdate): void { + const queryChanged = !sameHighlightQuery( + getSearchQuery(update.state), + getSearchQuery(update.startState), + ); + const panelChanged = + searchPanelOpen(update.state) !== searchPanelOpen(update.startState); + + if ( + queryChanged || + panelChanged || + update.docChanged || + update.selectionSet || + update.viewportChanged + ) { + this.decorations = buildSearchMatchDecorations( + update.state, + update.view.visibleRanges, + ); + } + } +} + +export const searchMatchHighlighter = ViewPlugin.fromClass( + SearchMatchHighlighterPlugin, + { + decorations: (plugin) => plugin.decorations, + }, +); + +export default searchMatchHighlighter; diff --git a/src/cm/selectionMenuUtils.ts b/src/cm/selectionMenuUtils.ts index 414dbfa836..65abc0ceda 100644 --- a/src/cm/selectionMenuUtils.ts +++ b/src/cm/selectionMenuUtils.ts @@ -1,4 +1,5 @@ export interface SelectionMenuItem { + id?: string; mode?: "selected" | "all"; readOnly?: boolean; } @@ -8,6 +9,70 @@ export interface SelectionMenuFilterOptions { hasSelection: boolean; } +const POINTER_MOVE_TOLERANCE = 8; + +/** Preserve editor focus during a pointer press and activate on release. */ +export function bindSelectionMenuButton( + button: HTMLButtonElement, + onActivate: (event: Event) => void, +): void { + let activePointerId: number | null = null; + let pointerStart: { x: number; y: number } | null = null; + + const stopEvent = (event: Event) => { + event.preventDefault(); + event.stopPropagation(); + }; + const clearPointer = () => { + activePointerId = null; + pointerStart = null; + button.classList.remove("is-pressed"); + }; + const pointerMoved = (event: PointerEvent) => { + if (!pointerStart) return false; + const xDistance = event.clientX - pointerStart.x; + const yDistance = event.clientY - pointerStart.y; + return ( + xDistance ** 2 + yDistance ** 2 > + POINTER_MOVE_TOLERANCE ** 2 + ); + }; + + button.addEventListener("pointerdown", (event) => { + if (event.isPrimary === false) return; + if (event.pointerType === "mouse" && event.button !== 0) return; + activePointerId = event.pointerId; + pointerStart = { x: event.clientX, y: event.clientY }; + button.classList.add("is-pressed"); + stopEvent(event); + try { + button.setPointerCapture?.(event.pointerId); + } catch { + // Pointer capture is optional in older Android WebViews. + } + }); + + button.addEventListener("pointermove", (event) => { + if (event.pointerId !== activePointerId || !pointerStart) return; + if (pointerMoved(event)) clearPointer(); + }); + + button.addEventListener("pointerup", (event) => { + if (event.pointerId !== activePointerId || !pointerStart) return; + const moved = pointerMoved(event); + clearPointer(); + stopEvent(event); + if (!moved) onActivate(event); + }); + + button.addEventListener("pointercancel", clearPointer); + button.addEventListener("lostpointercapture", clearPointer); + button.addEventListener("click", (event) => { + stopEvent(event); + if (event.detail === 0) onActivate(event); + }); +} + /** Filter selection actions using Acode's read-only and selection rules. */ export function filterSelectionMenuItems( items: readonly T[], @@ -23,3 +88,29 @@ export function filterSelectionMenuItems( return true; }); } + +const SELECTION_PRIMARY_ACTIONS = new Set([ + "copy", + "cut", + "paste", + "select-all", +]); +const CARET_PRIMARY_ACTIONS = new Set(["paste", "select-all"]); + +/** Keep the touch toolbar compact by moving secondary/plugin actions into More. */ +export function partitionSelectionMenuItems( + items: readonly T[], + options: Pick, +): { primary: T[]; overflow: T[] } { + const primaryIds = options.hasSelection + ? SELECTION_PRIMARY_ACTIONS + : CARET_PRIMARY_ACTIONS; + const primary: T[] = []; + const overflow: T[] = []; + + for (const item of items) { + (primaryIds.has(item.id ?? "") ? primary : overflow).push(item); + } + + return { primary, overflow }; +} diff --git a/src/cm/themes/catppuccin.js b/src/cm/themes/catppuccin.js index d83e90f3a7..6b1e9a5330 100644 --- a/src/cm/themes/catppuccin.js +++ b/src/cm/themes/catppuccin.js @@ -113,7 +113,8 @@ function createConfig(name, caption, palette) { cursor: palette.rosewater, dropdownBackground: palette.mantle, dropdownBorder: palette.overlay0, - activeLine: palette.surface0, + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: `${palette.surface0}40`, lineNumber: palette.subtext0, lineNumberActive: palette.mauve, matchingBracket: `${palette.surface2}47`, diff --git a/src/cm/themes/tokyoNight.js b/src/cm/themes/tokyoNight.js index efc55889c4..3ec2548e70 100644 --- a/src/cm/themes/tokyoNight.js +++ b/src/cm/themes/tokyoNight.js @@ -11,7 +11,8 @@ export const config = { cursor: "#c0caf5", dropdownBackground: "#1a1b26", dropdownBorder: "#414868", - activeLine: "#24283b", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#6a83ce20", lineNumber: "#414868", lineNumberActive: "#a9b1d6", matchingBracket: "#24283b", diff --git a/src/cm/themes/tomorrowNight.js b/src/cm/themes/tomorrowNight.js index ef09700e7c..0ff0d39c0b 100644 --- a/src/cm/themes/tomorrowNight.js +++ b/src/cm/themes/tomorrowNight.js @@ -12,7 +12,8 @@ export const config = { cursor: "#AEAFAD", dropdownBackground: "#1D1F21", dropdownBorder: "#4B4E55", - activeLine: "#282A2E", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#75778920", lineNumber: "#4B4E55", lineNumberActive: "#C5C8C6", matchingBracket: "#282A2E", diff --git a/src/cm/themes/tomorrowNightBright.js b/src/cm/themes/tomorrowNightBright.js index 7fb6b25bfd..26bfacf9de 100644 --- a/src/cm/themes/tomorrowNightBright.js +++ b/src/cm/themes/tomorrowNightBright.js @@ -12,7 +12,8 @@ export const config = { cursor: "#9F9F9F", dropdownBackground: "#000000", dropdownBorder: "#343434", - activeLine: "#2A2A2A", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#D2D2D233", lineNumber: "#343434", lineNumberActive: "#DEDEDE", matchingBracket: "#2A2A2A", diff --git a/src/cm/themes/vscodeDark.js b/src/cm/themes/vscodeDark.js index 2045621f5f..8790b32b19 100644 --- a/src/cm/themes/vscodeDark.js +++ b/src/cm/themes/vscodeDark.js @@ -12,7 +12,8 @@ export const config = { cursor: "#c6c6c6", dropdownBackground: "#202020", dropdownBorder: "#454545", - activeLine: "#282828", + // Keep this translucent: CodeMirror draws selections behind line backgrounds. + activeLine: "#67676720", lineNumber: "#6e7681", lineNumberActive: "#cccccc", matchingBracket: "#add6ff26", diff --git a/src/cm/touchSelectionMenu.js b/src/cm/touchSelectionMenu.js index f99badae35..b017acb1fb 100644 --- a/src/cm/touchSelectionMenu.js +++ b/src/cm/touchSelectionMenu.js @@ -1,3 +1,4 @@ +import { LSPPlugin } from "@codemirror/lsp-client"; import { EditorSelection } from "@codemirror/state"; import { focusEditorIfEditable, @@ -5,8 +6,13 @@ import { resolveReadOnlyContextSelection, shouldCommitReadOnlyTap, } from "cm/editorReadOnly"; -import { filterSelectionMenuItems } from "cm/selectionMenuUtils"; +import { + bindSelectionMenuButton, + filterSelectionMenuItems, + partitionSelectionMenuItems, +} from "cm/selectionMenuUtils"; import selectionMenu from "lib/selectionMenu"; +import { animate } from "motion"; export { filterSelectionMenuItems } from "cm/selectionMenuUtils"; @@ -18,6 +24,7 @@ const MENU_SHOW_DELAY = 120; const MENU_CARET_GAP = 10; const MENU_SELECTION_GAP = 12; const MENU_HANDLE_CLEARANCE = 28; +const OVERFLOW_GRID_THRESHOLD = 10; const TAP_MAX_COLUMN_DELTA = 2; const TAP_MAX_POS_DELTA = 2; @@ -127,6 +134,44 @@ function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } +function hasCodeActionProvider(view) { + return LSPPlugin.getAll(view, "codeAction").some( + (plugin) => !!plugin.client.serverCapabilities?.codeActionProvider, + ); +} + +function hasLspActions(view) { + const capabilities = [ + ["definition", "definitionProvider"], + ["declaration", "declarationProvider"], + ["implementation", "implementationProvider"], + ["typeDefinition", "typeDefinitionProvider"], + ["references", "referencesProvider"], + ]; + if ( + capabilities.some(([feature, capability]) => + LSPPlugin.getAll(view, feature).some( + (plugin) => !!plugin.client.serverCapabilities?.[capability], + ), + ) + ) { + return true; + } + return ( + !view.state.readOnly && + LSPPlugin.getAll(view, "rename").some( + (plugin) => !!plugin.client.serverCapabilities?.renameProvider, + ) + ); +} + +function animationsDisabled() { + return ( + document.body.classList.contains("no-animation") || + globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches + ); +} + export default function createTouchSelectionMenu(view, options = {}) { return new TouchSelectionMenuController(view, options); } @@ -149,6 +194,12 @@ class TouchSelectionMenuController { #handlingMenuAction = false; #menuShowTimer = null; #tooltipObserver = null; + #dismissedSelection = null; + #renderedMenuKey = ""; + #menuAnchor = null; + #menuAnimation = null; + #viewAnimations = []; + #overflowExpanded = false; constructor(view, options = {}) { this.#view = view; @@ -226,6 +277,7 @@ class TouchSelectionMenuController { this.#pointerSelectionSession = null; this.#readOnlyTapSession = null; this.#pendingPointerSelectionClick = null; + this.#dismissedSelection = null; this.#menuRequested = false; this.#isPointerInteracting = false; this.#isScrolling = false; @@ -238,6 +290,7 @@ class TouchSelectionMenuController { setSelection(value) { if (!this.#enabled) return; if (value) { + this.#dismissedSelection = null; this.#menuRequested = true; } this.onStateChanged({ @@ -254,6 +307,7 @@ class TouchSelectionMenuController { this.#hideMenu(); return; } + this.#dismissedSelection = null; this.#scheduleMenuShow(MENU_SHOW_DELAY); } @@ -279,6 +333,12 @@ class TouchSelectionMenuController { onStateChanged(meta = {}) { if (!this.#enabled) return; if (meta.selectionChanged) this.#cancelReadOnlyTap(); + if ( + meta.selectionChanged && + this.#dismissedSelection !== this.#selectionSignature() + ) { + this.#dismissedSelection = null; + } if (this.#handlingMenuAction) return; if (!this.#shouldShowMenu()) { if (!this.#hasSelection()) { @@ -298,6 +358,7 @@ class TouchSelectionMenuController { this.#pointerSelectionSession = null; this.#readOnlyTapSession = null; this.#pendingPointerSelectionClick = null; + this.#dismissedSelection = null; this.#menuRequested = false; this.#isPointerInteracting = false; this.#isScrolling = false; @@ -321,6 +382,7 @@ class TouchSelectionMenuController { } event.preventDefault(); event.stopPropagation(); + this.#dismissedSelection = null; this.#menuRequested = true; this.#scheduleMenuShow(MENU_SHOW_DELAY); }; @@ -337,6 +399,7 @@ class TouchSelectionMenuController { return; } if (target instanceof Node && this.#view.dom.contains(target)) { + this.#dismissedSelection = null; this.#capturePointerSelection(event); this.#captureReadOnlyTap(event); this.#isPointerInteracting = true; @@ -549,6 +612,12 @@ class TouchSelectionMenuController { #shouldShowMenu() { if (this.#isScrolling || this.#isPointerInteracting) return false; if (!this.#view.hasFocus && !this.#isReadOnly()) return false; + if ( + !this.#menuRequested && + this.#dismissedSelection === this.#selectionSignature() + ) { + return false; + } return this.#hasSelection() || this.#menuRequested; } @@ -616,52 +685,310 @@ class TouchSelectionMenuController { } #showMenu(anchor) { + this.#menuAnchor = anchor; const hasSelection = this.#hasSelection(); - const items = filterSelectionMenuItems(selectionMenu(), { - readOnly: this.#isReadOnly(), - hasSelection, - }); + const items = filterSelectionMenuItems( + selectionMenu({ + codeActionsAvailable: hasCodeActionProvider(this.#view), + lspActionsAvailable: hasLspActions(this.#view), + }), + { + readOnly: this.#isReadOnly(), + hasSelection, + }, + ); - this.$menu.innerHTML = ""; if (!items.length) { this.#menuRequested = false; this.#hideMenu(true); return; } - items.forEach(({ onclick, text }) => { - const $item = document.createElement("div"); - if (typeof text === "string") { - $item.textContent = text; - } else if (text instanceof Node) { - $item.append(text.cloneNode(true)); - } - let handled = false; - const runAction = (event) => { - if (handled) return; - handled = true; - event.preventDefault(); - event.stopPropagation(); - this.#handlingMenuAction = true; - try { - onclick?.(); - } finally { - this.#handlingMenuAction = false; - this.#menuRequested = false; - this.#hideMenu(); - focusEditorIfEditable(this.#view); - } - }; - $item.addEventListener("pointerdown", runAction); - $item.addEventListener("click", runAction); - this.$menu.append($item); - }); + const menuKey = `${hasSelection}:${items + .map((item) => item.id || this.#getItemLabel(item)) + .join("|")}`; + const menuChanged = menuKey !== this.#renderedMenuKey; + if (menuChanged) { + const groups = partitionSelectionMenuItems(items, { hasSelection }); + this.#renderMenu(groups.primary, groups.overflow); + this.#renderedMenuKey = menuKey; + } if (!this.$menu.isConnected) { this.#container.append(this.$menu); } + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + const isOpening = !this.#menuActive; + this.#positionMenu(anchor); + this.#menuActive = true; + this.#menuRequested = false; + if (isOpening) this.#animateMenuIn(); + } + + #renderMenu(primaryItems, overflowItems) { + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#viewAnimations = []; + this.#overflowExpanded = false; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.replaceChildren(); + this.$menu.setAttribute("aria-label", "Text selection actions"); + + const $primary = document.createElement("div"); + $primary.className = "cursor-menu__primary"; + $primary.setAttribute("role", "toolbar"); + for (const item of primaryItems) { + $primary.append(this.#createActionButton(item, false)); + } + + if (overflowItems.length) { + const $overflow = document.createElement("div"); + $overflow.className = "cursor-menu__overflow"; + if (overflowItems.length > OVERFLOW_GRID_THRESHOLD) { + $overflow.classList.add("cursor-menu__overflow--grid"); + } + $overflow.setAttribute("role", "toolbar"); + $overflow.setAttribute("aria-label", "More text actions"); + $overflow.hidden = true; + + const backLabel = globalThis.strings?.back || "Back"; + const $back = document.createElement("button"); + $back.type = "button"; + $back.className = "cursor-menu__action cursor-menu__back"; + $back.setAttribute("aria-label", backLabel); + $back.append(this.#createIcon("arrow_back")); + + const $overflowActions = document.createElement("div"); + $overflowActions.className = "cursor-menu__overflow-actions"; + for (const item of overflowItems) { + $overflowActions.append(this.#createActionButton(item, true)); + } + $overflow.append($back, $overflowActions); + + const moreLabel = globalThis.strings?.more || "More"; + const $more = document.createElement("button"); + $more.type = "button"; + $more.className = "cursor-menu__action cursor-menu__more"; + $more.setAttribute("aria-label", moreLabel); + $more.setAttribute("aria-expanded", "false"); + $more.append(this.#createIcon("keyboard_control")); + bindSelectionMenuButton($more, () => { + $more.setAttribute("aria-expanded", "true"); + this.#setOverflowExpanded($primary, $overflow, true); + }); + bindSelectionMenuButton($back, () => { + $more.setAttribute("aria-expanded", "false"); + this.#setOverflowExpanded($primary, $overflow, false); + }); + + $primary.append($more); + this.$menu.append($primary, $overflow); + return; + } + + this.$menu.append($primary); + } + + #createActionButton(item, isOverflow) { + const $item = document.createElement("button"); + const label = this.#getItemLabel(item); + $item.type = "button"; + $item.className = `cursor-menu__action${ + isOverflow ? " cursor-menu__overflow-action" : "" + }`; + $item.setAttribute("aria-label", label); + if (label !== "More action") $item.title = label; + + if (isOverflow) { + if (item.text instanceof Node) { + $item.append(item.text.cloneNode(true)); + } else { + $item.textContent = label; + } + } else if (item.text instanceof Node) { + $item.append(item.text.cloneNode(true)); + } else { + $item.textContent = label; + } + + let handled = false; + const runAction = (event) => { + if (handled) return; + handled = true; + event.preventDefault(); + event.stopPropagation(); + this.#clearMenuShowTimer(); + cancelAnimationFrame(this.#stateSyncRaf); + this.#stateSyncRaf = 0; + this.#handlingMenuAction = true; + try { + item.onclick?.(); + } finally { + this.#handlingMenuAction = false; + this.#menuRequested = false; + this.#dismissedSelection = this.#selectionSignature(); + this.#hideMenu(); + focusEditorIfEditable(this.#view); + } + }; + bindSelectionMenuButton($item, runAction); + return $item; + } + + #animateMenuIn() { + this.#menuAnimation?.cancel?.(); + if (animationsDisabled()) { + this.$menu.style.opacity = "1"; + this.$menu.style.transform = "none"; + return; + } + + const y = this.$menu.dataset.placement === "above" ? 3 : -3; + this.#menuAnimation = animate( + this.$menu, + { + opacity: [0, 1], + scale: [0.96, 1], + y: [y, 0], + }, + { duration: 0.14, ease: "easeOut" }, + ); + } + + #setOverflowExpanded($primary, $overflow, expanded) { + if (expanded === this.#overflowExpanded) return; + const initialRect = this.$menu.getBoundingClientRect(); + this.#menuAnimation?.cancel?.(); + this.#menuAnimation = null; + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#viewAnimations = []; + $primary.hidden = this.#overflowExpanded; + $overflow.hidden = !this.#overflowExpanded; + const outgoing = this.#overflowExpanded ? $overflow : $primary; + const incoming = expanded ? $overflow : $primary; + const direction = expanded ? 1 : -1; + for (const $view of [$primary, $overflow]) { + $view.style.opacity = ""; + $view.style.transform = ""; + $view.style.visibility = ""; + $view.style.position = ""; + $view.style.inset = ""; + $view.style.pointerEvents = ""; + $view.style.transformOrigin = ""; + } + this.#overflowExpanded = expanded; + outgoing.style.position = "absolute"; + outgoing.style.inset = "0 auto auto 0"; + outgoing.style.pointerEvents = "none"; + incoming.hidden = false; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.style.transform = ""; + if (this.#menuAnchor) this.#positionMenu(this.#menuAnchor); + const finalRect = this.$menu.getBoundingClientRect(); + const menuScaleX = finalRect.width + ? initialRect.width / finalRect.width + : 1; + const menuScaleY = finalRect.height + ? initialRect.height / finalRect.height + : 1; + const viewScaleX = menuScaleX ? 1 / menuScaleX : 1; + const viewScaleY = menuScaleY ? 1 / menuScaleY : 1; + this.$menu.style.transformOrigin = "left top"; + for (const $view of [outgoing, incoming]) { + $view.style.transformOrigin = "left top"; + } + + const clearMenuGeometry = () => { + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu.style.transform = ""; + this.$menu.style.transformOrigin = ""; + }; + const finish = () => { + outgoing.hidden = true; + for (const $view of [$primary, $overflow]) { + $view.style.opacity = ""; + $view.style.transform = ""; + $view.style.position = ""; + $view.style.inset = ""; + $view.style.pointerEvents = ""; + $view.style.transformOrigin = ""; + } + clearMenuGeometry(); + this.#viewAnimations = []; + }; + + if (animationsDisabled()) { + finish(); + return; + } + const outgoingAnimation = animate( + outgoing, + { + opacity: [1, 0], + x: [0, -6 * direction], + scaleX: [viewScaleX, 1], + scaleY: [viewScaleY, 1], + }, + { duration: 0.12, ease: "easeIn" }, + ); + const incomingAnimation = animate( + incoming, + { + opacity: [0, 1], + x: [6 * direction, 0], + scaleX: [viewScaleX, 1], + scaleY: [viewScaleY, 1], + }, + { duration: 0.18, ease: "easeOut" }, + ); + const animations = [outgoingAnimation, incomingAnimation]; + if ( + initialRect.width !== finalRect.width || + initialRect.height !== finalRect.height || + initialRect.left !== finalRect.left || + initialRect.top !== finalRect.top + ) { + animations.push( + animate( + this.$menu, + { + x: [initialRect.left - finalRect.left, 0], + y: [initialRect.top - finalRect.top, 0], + scaleX: [menuScaleX, 1], + scaleY: [menuScaleY, 1], + }, + { + duration: 0.18, + ease: [0.2, 0, 0, 1], + onComplete: clearMenuGeometry, + }, + ), + ); + } + this.#viewAnimations = animations; + Promise.allSettled( + animations.map((animation) => animation.finished ?? animation), + ).then(() => { + if (this.#viewAnimations !== animations) return; + finish(); + }); + } + + #positionMenu(anchor) { + if (!this.$menu.isConnected) return; const containerRect = this.#container.getBoundingClientRect(); + this.$menu.style.setProperty( + "--cursor-menu-max-width", + `${Math.max(0, containerRect.width - MENU_MARGIN * 2)}px`, + ); + this.$menu.style.setProperty( + "--cursor-menu-grid-max-height", + `${Math.max(40, Math.min(240, containerRect.height - MENU_MARGIN * 2))}px`, + ); this.$menu.style.left = "0px"; this.$menu.style.top = "0px"; this.$menu.style.visibility = "hidden"; @@ -679,10 +1006,11 @@ class TouchSelectionMenuController { containerRect.top + containerRect.height - menuRect.height - MENU_MARGIN; const fitsAbove = topAbove >= minTop; const fitsBelow = topBelow <= maxTop; + const placedAbove = fitsAbove || !fitsBelow; const clamped = clampMenuPosition( { left: preferredLeft, - top: fitsAbove || !fitsBelow ? topAbove : topBelow, + top: placedAbove ? topAbove : topBelow, width: menuRect.width, height: menuRect.height, }, @@ -698,9 +1026,29 @@ class TouchSelectionMenuController { this.$menu.style.left = `${clamped.left - containerRect.left}px`; this.$menu.style.top = `${clamped.top - containerRect.top}px`; + this.$menu.dataset.placement = placedAbove ? "above" : "below"; this.$menu.style.visibility = ""; - this.#menuActive = true; - this.#menuRequested = false; + } + + #getItemLabel(item) { + if (item.label) return item.label; + if (typeof item.text === "string" && item.text.trim()) return item.text; + if (item.text instanceof Element) { + return ( + item.text.getAttribute("aria-label") || + item.text.getAttribute("title") || + item.text.textContent?.trim() || + "More action" + ); + } + return "More action"; + } + + #createIcon(name) { + const $icon = document.createElement("span"); + $icon.className = `icon ${name}`; + $icon.setAttribute("aria-hidden", "true"); + return $icon; } #showMenuDeferred() { @@ -771,9 +1119,44 @@ class TouchSelectionMenuController { #hideMenu(force = false) { if (!force && !this.#menuActive && !this.$menu.isConnected) return; + this.#menuAnimation?.cancel?.(); + for (const animation of this.#viewAnimations) animation.cancel?.(); + this.#menuAnimation = null; + this.#viewAnimations = []; if (this.$menu.isConnected) { this.$menu.remove(); } + const overflow = this.$menu.querySelector(".cursor-menu__overflow"); + if (overflow) overflow.hidden = true; + if (overflow) { + overflow.style.opacity = ""; + overflow.style.transform = ""; + overflow.style.pointerEvents = ""; + overflow.style.position = ""; + overflow.style.inset = ""; + overflow.style.transformOrigin = ""; + } + const primary = this.$menu.querySelector(".cursor-menu__primary"); + if (primary) { + primary.hidden = false; + primary.style.opacity = ""; + primary.style.transform = ""; + primary.style.pointerEvents = ""; + primary.style.position = ""; + primary.style.inset = ""; + primary.style.transformOrigin = ""; + } + this.$menu.style.opacity = ""; + this.$menu.style.transform = ""; + this.$menu.style.transformOrigin = ""; + this.$menu.style.removeProperty("width"); + this.$menu.style.removeProperty("height"); + this.$menu + .querySelector(".cursor-menu__more") + ?.setAttribute("aria-expanded", "false"); + this.#renderedMenuKey = ""; + this.#overflowExpanded = false; + this.#menuAnchor = null; this.#menuActive = false; } @@ -817,4 +1200,10 @@ class TouchSelectionMenuController { const selection = this.#view.state.selection.main; return selection.from !== selection.to; } + + #selectionSignature() { + return this.#view.state.selection.ranges + .map((range) => `${range.anchor}:${range.head}`) + .join("|"); + } } diff --git a/src/components/referencesPanel/utils.js b/src/components/referencesPanel/utils.js index d88a9ca84f..d02de6ca54 100644 --- a/src/components/referencesPanel/utils.js +++ b/src/components/referencesPanel/utils.js @@ -1,5 +1,5 @@ -import { EditorView } from "@codemirror/view"; import { focusEditorIfEditable } from "cm/editorReadOnly"; +import { safeLspPositionToOffset } from "cm/lsp/positionUtils"; import Sidebar from "components/sidebar"; import DOMPurify from "dompurify"; import openFile from "lib/openFile"; @@ -117,19 +117,22 @@ export async function navigateToReference(ref) { if (!editor) return; const doc = editor.state.doc; - const startLine = doc.line(ref.range.start.line + 1); - const endLine = doc.line(ref.range.end.line + 1); - const from = Math.min( - startLine.from + ref.range.start.character, - startLine.to, - ); - const to = Math.min(endLine.from + ref.range.end.character, endLine.to); + const from = safeLspPositionToOffset(doc, ref.range.start); + const to = safeLspPositionToOffset(doc, ref.range.end); - editor.dispatch({ - selection: { anchor: from, head: to }, - effects: EditorView.scrollIntoView(from, { y: "center" }), - }); - focusEditorIfEditable(editor); + if (typeof editorManager.revealRange === "function") { + editorManager.revealRange(from, to, { + y: "center", + userEvent: "select.definition", + }); + } else { + editor.dispatch({ + selection: { anchor: from, head: to }, + scrollIntoView: true, + userEvent: "select.definition", + }); + focusEditorIfEditable(editor); + } } catch (error) { console.error("Failed to navigate to reference:", error); } diff --git a/src/components/settingsPage.scss b/src/components/settingsPage.scss index bfe722e73e..e0e9f34b55 100644 --- a/src/components/settingsPage.scss +++ b/src/components/settingsPage.scss @@ -60,6 +60,11 @@ wc-page.main-settings-page { .main-settings-list>.list-item, .settings-section-card>.list-item { display: flex; + + &[hidden] { + display: none; + } + width: 100%; min-height: 64px; margin: 0; diff --git a/src/components/virtualList/index.js b/src/components/virtualList/index.js index bf7b7db4b1..c1ff5bafcf 100644 --- a/src/components/virtualList/index.js +++ b/src/components/virtualList/index.js @@ -1,6 +1,8 @@ import "./style.scss"; import tag from "html-tag-js"; +export { default as VariableVirtualList } from "./variable"; + /** * @typedef {object} VirtualListOptions * @property {number} [itemHeight=30] - Height of each item in pixels diff --git a/src/components/virtualList/style.scss b/src/components/virtualList/style.scss index 9af4e0df05..3ef86ce953 100644 --- a/src/components/virtualList/style.scss +++ b/src/components/virtualList/style.scss @@ -7,3 +7,13 @@ position: relative; min-width: 100%; } + +.variable-virtual-spacer { + width: 100%; + pointer-events: none; +} + +.variable-virtual-items { + position: relative; + min-width: 100%; +} diff --git a/src/components/virtualList/variable.js b/src/components/virtualList/variable.js new file mode 100644 index 0000000000..e2cf193c6d --- /dev/null +++ b/src/components/virtualList/variable.js @@ -0,0 +1,411 @@ +const DEFAULT_ESTIMATED_HEIGHT = 52; +const DEFAULT_OVERSCAN = 360; +const BOTTOM_THRESHOLD = 48; + +/** + * Variable-height virtual list for retained HTMLElement items. + * + * Every item stays in the model, while only the visible window and a small pixel + * overscan are mounted. ResizeObserver keeps changing item heights measured + * without losing the reader's scroll anchor. + */ +export default class VariableVirtualList { + constructor( + container, + { + estimatedHeight = DEFAULT_ESTIMATED_HEIGHT, + overscan = DEFAULT_OVERSCAN, + activeOverscan = overscan * 4, + maxOverscan = overscan * 10, + footer = null, + } = {}, + ) { + this.container = container; + this.estimatedHeight = estimatedHeight; + this.overscan = overscan; + this.activeOverscan = Math.max(overscan, activeOverscan); + this.maxOverscan = Math.max(this.activeOverscan, maxOverscan); + this.dynamicOverscan = overscan; + this.footer = footer; + this.footerHeight = 0; + this.viewportHeight = this.container.clientHeight; + this.items = []; + this.itemByElement = new WeakMap(); + this.offsets = [0]; + this.offsetsDirty = false; + this.renderedRange = { start: 0, end: 0 }; + this.frame = null; + this.stickToBottom = true; + this.lastScrollTop = this.container.scrollTop; + this.lastScrollTime = this.now(); + this.touching = false; + this.releaseTimer = null; + this.destroyed = false; + + this.topSpacer = document.createElement("div"); + this.topSpacer.className = "variable-virtual-spacer"; + this.itemContainer = document.createElement("div"); + this.itemContainer.className = "variable-virtual-items"; + this.bottomSpacer = document.createElement("div"); + this.bottomSpacer.className = "variable-virtual-spacer"; + this.container.append( + this.topSpacer, + this.itemContainer, + this.bottomSpacer, + ); + if (this.footer) this.container.append(this.footer); + + this.onScroll = () => { + this.stickToBottom = this.isNearBottom(); + const now = this.now(); + const elapsed = Math.max(8, now - this.lastScrollTime); + const distance = Math.abs(this.container.scrollTop - this.lastScrollTop); + const projectedDistance = distance * (32 / elapsed); + this.dynamicOverscan = Math.min( + this.maxOverscan, + this.activeOverscan + projectedDistance * 2, + ); + this.lastScrollTop = this.container.scrollTop; + this.lastScrollTime = now; + // Scroll rendering is intentionally synchronous. Android WebView can move + // the compositor several rows before the next animation frame. + this.render(); + this.scheduleOverscanRelease(); + }; + this.onTouchStart = () => { + this.touching = true; + this.clearOverscanRelease(); + this.dynamicOverscan = this.activeOverscan; + // Pre-paint the fling guard before compositor scrolling begins. + this.render(); + }; + this.onTouchEnd = () => { + this.touching = false; + this.scheduleOverscanRelease(); + }; + this.container.addEventListener("scroll", this.onScroll, { passive: true }); + this.container.addEventListener("touchstart", this.onTouchStart, { + passive: true, + }); + this.container.addEventListener("touchend", this.onTouchEnd, { + passive: true, + }); + this.container.addEventListener("touchcancel", this.onTouchEnd, { + passive: true, + }); + + this.resizeObserver = + typeof ResizeObserver === "function" + ? new ResizeObserver((entries) => this.onResize(entries)) + : null; + this.resizeObserver?.observe(this.container); + } + + now() { + return ( + this.container.ownerDocument.defaultView?.performance?.now?.() ?? + Date.now() + ); + } + + scheduleOverscanRelease() { + this.clearOverscanRelease(); + this.releaseTimer = this.container.ownerDocument.defaultView?.setTimeout( + () => { + this.releaseTimer = null; + if (this.destroyed || this.touching) return; + this.dynamicOverscan = this.overscan; + this.render(); + }, + 500, + ); + } + + clearOverscanRelease() { + if (this.releaseTimer === null) return; + this.container.ownerDocument.defaultView?.clearTimeout(this.releaseTimer); + this.releaseTimer = null; + } + + get length() { + return this.items.length; + } + + get mountedCount() { + return this.itemContainer.childElementCount; + } + + append(element) { + const wasNearBottom = this.isNearBottom(); + const item = { + element, + height: this.estimatedHeight, + index: this.items.length, + }; + this.items.push(item); + this.itemByElement.set(element, item); + this.offsetsDirty = true; + if (wasNearBottom || this.items.length === 1) this.stickToBottom = true; + this.scheduleRender(); + } + + clear() { + this.items = []; + this.itemByElement = new WeakMap(); + this.offsets = [0]; + this.offsetsDirty = false; + this.renderedRange = { start: 0, end: 0 }; + this.stickToBottom = true; + this.dynamicOverscan = this.overscan; + this.topSpacer.style.height = "0px"; + this.bottomSpacer.style.height = "0px"; + this.itemContainer.replaceChildren(); + this.container.scrollTop = 0; + this.footerHeight = this.getFooterHeight(); + this.observeResizeTargets(); + } + + invalidate() { + this.scheduleRender(); + } + + scrollToBottom() { + this.stickToBottom = true; + this.scheduleRender(); + } + + scheduleRender() { + if (this.frame !== null || this.destroyed) return; + this.frame = requestAnimationFrame(() => { + this.frame = null; + this.render(); + }); + } + + rebuildOffsets() { + if (!this.offsetsDirty) return; + + const offsets = new Array(this.items.length + 1); + offsets[0] = 0; + for (let index = 0; index < this.items.length; index++) { + offsets[index + 1] = offsets[index] + this.items[index].height; + } + this.offsets = offsets; + this.offsetsDirty = false; + } + + findIndexAt(offset) { + let low = 0; + let high = this.items.length; + while (low < high) { + const middle = Math.floor((low + high + 1) / 2); + if (this.offsets[middle] <= offset) low = middle; + else high = middle - 1; + } + return Math.min(low, Math.max(0, this.items.length - 1)); + } + + getFooterHeight() { + if (!this.footer) return 0; + return Math.ceil( + this.footer.getBoundingClientRect().height || + this.footer.offsetHeight || + 0, + ); + } + + observeResizeTargets() { + if (!this.resizeObserver) return; + this.resizeObserver.disconnect(); + this.resizeObserver.observe(this.container); + for (const element of this.itemContainer.children) { + this.resizeObserver.observe(element); + } + if (this.footer) this.resizeObserver.observe(this.footer); + } + + render() { + if (this.destroyed) return; + this.rebuildOffsets(); + if (!this.items.length) { + this.footerHeight = this.getFooterHeight(); + this.itemContainer.replaceChildren(); + this.topSpacer.style.height = "0px"; + this.bottomSpacer.style.height = "0px"; + this.renderedRange = { start: 0, end: 0 }; + this.observeResizeTargets(); + return; + } + + const viewportHeight = Math.max( + 1, + this.container.clientHeight || window.innerHeight, + ); + this.viewportHeight = viewportHeight; + const totalHeight = this.offsets[this.items.length]; + this.footerHeight = this.getFooterHeight(); + const targetScrollTop = this.stickToBottom + ? Math.max(0, totalHeight + this.footerHeight - viewportHeight) + : this.container.scrollTop; + const start = this.findIndexAt( + Math.max(0, targetScrollTop - this.dynamicOverscan), + ); + const end = Math.min( + this.items.length, + this.findIndexAt( + targetScrollTop + viewportHeight + this.dynamicOverscan, + ) + 1, + ); + + this.updateMountedRange(start, end); + this.observeResizeTargets(); + this.topSpacer.style.height = `${this.offsets[start]}px`; + this.bottomSpacer.style.height = `${Math.max( + 0, + totalHeight - this.offsets[end], + )}px`; + this.renderedRange = { start, end }; + + if (this.stickToBottom) { + this.container.scrollTop = Math.max( + 0, + this.container.scrollHeight - viewportHeight, + ); + } + if (!this.resizeObserver) this.measureMountedItems(); + } + + updateMountedRange(start, end) { + let oldStart = this.renderedRange.start; + let oldEnd = this.renderedRange.end; + const rangesOverlap = oldStart < end && start < oldEnd; + + if (!this.itemContainer.childElementCount || !rangesOverlap) { + const fragment = document.createDocumentFragment(); + for (let index = start; index < end; index++) { + fragment.append(this.items[index].element); + } + this.itemContainer.replaceChildren(fragment); + return; + } + + while (oldStart < start) { + this.itemContainer.firstElementChild?.remove(); + oldStart++; + } + while (oldEnd > end) { + this.itemContainer.lastElementChild?.remove(); + oldEnd--; + } + + if (start < oldStart) { + const leading = document.createDocumentFragment(); + for (let index = start; index < oldStart; index++) { + leading.append(this.items[index].element); + } + this.itemContainer.insertBefore(leading, this.itemContainer.firstChild); + } + if (end > oldEnd) { + const trailing = document.createDocumentFragment(); + for (let index = oldEnd; index < end; index++) { + trailing.append(this.items[index].element); + } + this.itemContainer.append(trailing); + } + } + + measureMountedItems() { + for (const element of this.itemContainer.children) { + const item = this.itemByElement.get(element); + if (item) this.updateHeight(item, element.getBoundingClientRect().height); + } + } + + onResize(entries) { + const wasNearBottom = this.stickToBottom || this.isNearBottom(); + let footerChanged = false; + let viewportChanged = false; + for (const entry of entries) { + if (entry.target === this.container) { + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + const height = Math.ceil( + borderBox?.blockSize || + entry.contentRect?.height || + this.container.clientHeight, + ); + viewportChanged = Math.abs(height - this.viewportHeight) >= 1; + this.viewportHeight = height; + continue; + } + if (entry.target === this.footer) { + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + const height = Math.ceil( + borderBox?.blockSize || + entry.contentRect?.height || + this.getFooterHeight(), + ); + footerChanged = Math.abs(height - this.footerHeight) >= 1; + this.footerHeight = height; + continue; + } + const item = this.itemByElement.get(entry.target); + if (!item) continue; + const borderBox = Array.isArray(entry.borderBoxSize) + ? entry.borderBoxSize[0] + : entry.borderBoxSize; + this.updateHeight( + item, + borderBox?.blockSize || + entry.contentRect?.height || + entry.target.offsetHeight, + ); + } + if (wasNearBottom) this.stickToBottom = true; + if (viewportChanged || (wasNearBottom && footerChanged)) { + this.scheduleRender(); + } + } + + updateHeight(item, measuredHeight) { + const height = Math.max(1, Math.ceil(measuredHeight || 0)); + if (Math.abs(height - item.height) < 1) return; + + const delta = height - item.height; + item.height = height; + this.offsetsDirty = true; + if (!this.stickToBottom && item.index < this.renderedRange.start) { + this.container.scrollTop += delta; + } + this.scheduleRender(); + } + + isNearBottom() { + if (!this.items.length) return true; + return ( + this.container.scrollHeight - + this.container.scrollTop - + this.container.clientHeight <= + BOTTOM_THRESHOLD + ); + } + + destroy() { + this.destroyed = true; + if (this.frame !== null) cancelAnimationFrame(this.frame); + this.frame = null; + this.clearOverscanRelease(); + this.resizeObserver?.disconnect(); + this.container.removeEventListener("scroll", this.onScroll); + this.container.removeEventListener("touchstart", this.onTouchStart); + this.container.removeEventListener("touchend", this.onTouchEnd); + this.container.removeEventListener("touchcancel", this.onTouchEnd); + this.topSpacer.remove(); + this.itemContainer.remove(); + this.bottomSpacer.remove(); + this.items = []; + } +} diff --git a/src/dialogs/confirm.js b/src/dialogs/confirm.js index d9d187a0cf..2145c22ba2 100644 --- a/src/dialogs/confirm.js +++ b/src/dialogs/confirm.js @@ -10,7 +10,7 @@ let nextConfirmId = 0; * @param {string} titleText Title text * @param {string} [message] Alert message * @param {boolean} [isHTML] Whether the message is HTML - * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal}} [options] + * @param {{checkboxText?: string, returnState?: boolean, signal?: AbortSignal, direction?: "ltr" | "rtl", aboveOverlay?: boolean}} [options] * @returns {Promise} */ function confirm(titleText, message, isHTML, options = {}) { @@ -59,7 +59,8 @@ function confirm(titleText, message, isHTML, options = {}) { onclick: cancel, }); const confirmDiv = tag("div", { - className: "prompt confirm", + className: `prompt confirm${options.aboveOverlay ? " above-overlay" : ""}`, + dir: options.direction, children: [ titleSpan, messageSpan, diff --git a/src/dialogs/loader.js b/src/dialogs/loader.js index e7a34cea40..dfb98946fe 100644 --- a/src/dialogs/loader.js +++ b/src/dialogs/loader.js @@ -6,14 +6,15 @@ import restoreTheme from "lib/restoreTheme"; let loaderIsImmortal = false; let onCancelCallback = null; +let cancelButtonTimeout = null; let $currentDialog = null; let $currentMask = null; const titleLoaderId = "__title-loader"; /** * @typedef {object} LoaderOptions - * @property {number} timeout Timeout in milliseconds after which the loader will be shown - * @property {function():void} oncancel Callback function to be called when the loader is shown + * @property {number} timeout Delay before the cancel button is shown, in milliseconds + * @property {function():void} oncancel Callback invoked only when the user cancels */ /** @@ -64,19 +65,21 @@ function create(titleText, message = "", options = {}) { ); - const { timeout, oncancel } = options; - if (typeof oncancel === "function") { - onCancelCallback = oncancel; - } + clearTimeout(cancelButtonTimeout); + cancelButtonTimeout = null; + onCancelCallback = + typeof options.oncancel === "function" ? options.oncancel : null; - if (typeof timeout === "number") { - setTimeout(() => { + if (typeof options.timeout === "number") { + cancelButtonTimeout = setTimeout(() => { + cancelButtonTimeout = null; + if (!$dialog.isConnected) return; $dialog.append(
- +
, ); - }, timeout); + }, options.timeout); } if (!$oldLoader) { @@ -98,6 +101,13 @@ function create(titleText, message = "", options = {}) { }; } +function cancel() { + const callback = onCancelCallback; + onCancelCallback = null; + destroy(); + callback?.(); +} + function createTitleLoader() { const $titleLoader = tag.get(`#${titleLoaderId}`) || ( @@ -116,6 +126,9 @@ function createTitleLoader() { function destroy() { const loaderDiv = tag.get("#__loader"); const mask = tag.get("#__loader-mask"); + clearTimeout(cancelButtonTimeout); + cancelButtonTimeout = null; + onCancelCallback = null; restoreTheme(); if (!loaderDiv && !mask) { @@ -128,7 +141,6 @@ function destroy() { actionStack.unfreeze(); if (loaderDiv?.isConnected) loaderDiv.remove(); if (mask?.isConnected) mask.remove(); - onCancelCallback?.(); }, 300); } diff --git a/src/dialogs/style.scss b/src/dialogs/style.scss index 91fe9ab802..0380b5c0d5 100644 --- a/src/dialogs/style.scss +++ b/src/dialogs/style.scss @@ -49,6 +49,14 @@ z-index: 113; } + &.above-overlay { + z-index: 1001; + + & + .mask { + z-index: 1000; + } + } + &.multi { textarea:not(:first-of-type) { margin-top: 20px; diff --git a/src/fileSystem/sftp.js b/src/fileSystem/sftp.js index 41bff24af7..803be8af45 100644 --- a/src/fileSystem/sftp.js +++ b/src/fileSystem/sftp.js @@ -407,6 +407,23 @@ class SftpClient { } } + /** + * Tests a profile once without the normal remote-filesystem retry policy. + * @param {string} requestID Native request ID used for cancellation + */ + testConnection(requestID) { + return new Promise((resolve, reject) => { + sftp.testProfile(this.#profileID, requestID, 10000, resolve, reject); + }); + } + + /** Cancel an in-flight profile test. */ + cancelConnection(requestID) { + return new Promise((resolve) => { + sftp.cancelConnection(requestID, resolve, resolve); + }); + } + async #connectWithRetry() { const attempts = settings.value.retryRemoteFsAfterFail ? this.#MAX_TRY + 1 diff --git a/src/handlers/intent.js b/src/handlers/intent.js index fc5f5b9cb1..78c0009ab6 100644 --- a/src/handlers/intent.js +++ b/src/handlers/intent.js @@ -17,11 +17,14 @@ const pendingIntents = []; * @param {Intent} intent */ export default async function HandleIntent(intent = {}) { - const type = intent.action.split(".").slice(-1)[0]; + const type = intent.action?.split(".").slice(-1)[0]; if (["SEND", "VIEW", "EDIT"].includes(type)) { /**@type {string} */ - const url = intent.fileUri || intent.data; + const url = + intent.fileUri || + intent.data || + intent.extras?.["android.intent.extra.STREAM"]; if (!url) return; if (url.startsWith("acode://")) { @@ -72,19 +75,19 @@ export default async function HandleIntent(intent = {}) { return; } + const options = { + mode: "single", + render: true, + persistInSession: false, + }; + if (sessionStorage.getItem("isfilesRestored") === "true") { - await openFile(url, { - mode: "single", - render: true, - }); + await openFile(url, options); } else { // Store the intent for later processing when files are restored pendingIntents.push({ url, - options: { - mode: "single", - render: true, - }, + options, }); } } diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index e96e78e135..f593714cca 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -842,5 +842,37 @@ "confirm app icon reward": "هل تريد مشاهدة إعلان بمكافأة لتطبيق أيقونة التطبيق هذه؟", "rewarded ad unavailable": "الإعلانات بمكافأة غير متاحة الآن. يُرجى المحاولة مرة أخرى.", "rewarded ad failed": "تعذر إكمال الإعلان. يُرجى المحاولة مرة أخرى.", - "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة." + "rewarded ad incomplete": "شاهد الإعلان حتى النهاية للحصول على المكافأة.", + "plugin-review:dialog-label": "تقييمات الإضافة", + "plugin-review:account-check-failed": "تعذّر التحقق من حسابك. حاول مرة أخرى.", + "plugin-review:sign-in": "سجّل الدخول لكتابة تقييم", + "plugin-review:edit": "عدّل تقييمك", + "plugin-review:add": "أضف تقييمًا...", + "plugin-review:placeholder": "شارك تجربتك...", + "plugin-review:input-label": "تقييم الإضافة", + "plugin-review:vote-group-label": "التصويت", + "plugin-review:thumbs-up": "أعجبني", + "plugin-review:thumbs-down": "لم يعجبني", + "plugin-review:delete": "حذف التقييم", + "plugin-review:load-failed": "تعذّر تحميل التقييمات.", + "plugin-review:retry": "إعادة المحاولة", + "plugin-review:empty-title": "لا توجد تقييمات بعد", + "plugin-review:empty-description": "كن أول من يشارك تجربته.", + "plugin-review:yours": "تقييمك", + "plugin-review:community": "تقييمات المجتمع", + "plugin-review:no-other-reviews": "لا توجد تقييمات أخرى بعد.", + "plugin-review:login-incomplete": "لم يكتمل تسجيل الدخول.", + "plugin-review:sign-in-failed": "تعذّر تسجيل الدخول.", + "plugin-review:session-expired-review": "انتهت جلستك. سجّل الدخول مجددًا لكتابة تقييم.", + "plugin-review:save-failed": "تعذّر حفظ التقييم.", + "plugin-review:delete-confirmation": "هل تريد حذف تقييمك؟ لا يمكن التراجع عن هذا الإجراء.", + "plugin-review:session-expired-continue": "انتهت جلستك. سجّل الدخول مجددًا للمتابعة.", + "plugin-review:delete-failed": "تعذّر حذف التقييم.", + "plugin-review:you": "أنت", + "plugin-review:edit-action": "تعديل التقييم", + "plugin-review:recommended": "أوصى بهذه الإضافة", + "plugin-review:error-max-length": "يجب ألا يتجاوز التقييم {max} حرفًا.", + "plugin-review:error-downvote-comment": "أخبر المطوّر بما يمكن تحسينه.", + "plugin-review:error-empty": "أضف تعليقًا أو اختر «أعجبني».", + "plugin-review:unrated": "غير مقيّم" } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index 6cddef6f07..14562075a7 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Паглядзець рэкламу з узнагародай, каб ужыць гэты значок праграмы?", "rewarded ad unavailable": "Рэклама з узнагародай зараз недаступная. Паспрабуйце яшчэ раз.", "rewarded ad failed": "Не ўдалося завяршыць прагляд рэкламы. Паспрабуйце яшчэ раз.", - "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду." + "rewarded ad incomplete": "Даглядзіце рэкламу да канца, каб атрымаць узнагароду.", + "plugin-review:dialog-label": "Водгукі пра плагін", + "plugin-review:account-check-failed": "Не ўдалося праверыць ваш уліковы запіс. Паспрабуйце яшчэ раз.", + "plugin-review:sign-in": "Увайсці, каб пакінуць водгук", + "plugin-review:edit": "Рэдагаваць свой водгук", + "plugin-review:add": "Дадаць водгук…", + "plugin-review:placeholder": "Падзяліцеся сваім досведам…", + "plugin-review:input-label": "Водгук пра плагін", + "plugin-review:vote-group-label": "Ацэнка", + "plugin-review:thumbs-up": "Падабаецца", + "plugin-review:thumbs-down": "Не падабаецца", + "plugin-review:delete": "Выдаліць водгук", + "plugin-review:load-failed": "Не ўдалося загрузіць водгукі.", + "plugin-review:retry": "Паспрабаваць яшчэ раз", + "plugin-review:empty-title": "Водгукаў пакуль няма", + "plugin-review:empty-description": "Падзяліцеся сваім досведам першымі.", + "plugin-review:yours": "Ваш водгук", + "plugin-review:community": "Водгукі супольнасці", + "plugin-review:no-other-reviews": "Іншых водгукаў пакуль няма.", + "plugin-review:login-incomplete": "Уваход не быў завершаны.", + "plugin-review:sign-in-failed": "Не ўдалося ўвайсці.", + "plugin-review:session-expired-review": "Сеанс скончыўся. Увайдзіце зноў, каб пакінуць водгук.", + "plugin-review:save-failed": "Не ўдалося захаваць водгук.", + "plugin-review:delete-confirmation": "Выдаліць ваш водгук? Гэта дзеянне нельга скасаваць.", + "plugin-review:session-expired-continue": "Сеанс скончыўся. Увайдзіце зноў, каб працягнуць.", + "plugin-review:delete-failed": "Не ўдалося выдаліць водгук.", + "plugin-review:you": "Вы", + "plugin-review:edit-action": "Рэдагаваць водгук", + "plugin-review:recommended": "Рэкамендуе гэты плагін", + "plugin-review:error-max-length": "Водгук павінен змяшчаць не больш за {max} сімвалаў.", + "plugin-review:error-downvote-comment": "Раскажыце распрацоўшчыку, што можна палепшыць.", + "plugin-review:error-empty": "Дадайце каментарый або выберыце «Падабаецца».", + "plugin-review:unrated": "Без ацэнкі" } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index 166738aff1..75cc364b1f 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -842,5 +842,37 @@ "confirm app icon reward": "এই অ্যাপ আইকনটি প্রয়োগ করতে একটি পুরস্কারযুক্ত বিজ্ঞাপন দেখবেন?", "rewarded ad unavailable": "পুরস্কারযুক্ত বিজ্ঞাপন এখন উপলভ্য নেই। অনুগ্রহ করে আবার চেষ্টা করুন।", "rewarded ad failed": "বিজ্ঞাপনটি সম্পূর্ণ করা যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", - "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।" + "rewarded ad incomplete": "পুরস্কার পেতে বিজ্ঞাপনটি সম্পূর্ণ দেখুন।", + "plugin-review:dialog-label": "প্লাগইন পর্যালোচনা", + "plugin-review:account-check-failed": "আপনার অ্যাকাউন্ট যাচাই করা যায়নি। আবার চেষ্টা করুন।", + "plugin-review:sign-in": "পর্যালোচনা দিতে সাইন ইন করুন", + "plugin-review:edit": "আপনার পর্যালোচনা সম্পাদনা করুন", + "plugin-review:add": "পর্যালোচনা যোগ করুন...", + "plugin-review:placeholder": "আপনার অভিজ্ঞতা শেয়ার করুন...", + "plugin-review:input-label": "প্লাগইন পর্যালোচনা", + "plugin-review:vote-group-label": "ভোট", + "plugin-review:thumbs-up": "পছন্দ", + "plugin-review:thumbs-down": "অপছন্দ", + "plugin-review:delete": "পর্যালোচনা মুছুন", + "plugin-review:load-failed": "পর্যালোচনাগুলো লোড করা যায়নি।", + "plugin-review:retry": "আবার চেষ্টা করুন", + "plugin-review:empty-title": "এখনও কোনো পর্যালোচনা নেই", + "plugin-review:empty-description": "সবার আগে আপনার অভিজ্ঞতা শেয়ার করুন।", + "plugin-review:yours": "আপনার পর্যালোচনা", + "plugin-review:community": "কমিউনিটির পর্যালোচনা", + "plugin-review:no-other-reviews": "এখনও অন্য কোনো পর্যালোচনা নেই।", + "plugin-review:login-incomplete": "সাইন ইন সম্পন্ন হয়নি।", + "plugin-review:sign-in-failed": "সাইন ইন করা যায়নি।", + "plugin-review:session-expired-review": "আপনার সেশনের মেয়াদ শেষ। পর্যালোচনা দিতে আবার সাইন ইন করুন।", + "plugin-review:save-failed": "পর্যালোচনা সংরক্ষণ করা যায়নি।", + "plugin-review:delete-confirmation": "আপনার পর্যালোচনা মুছবেন? এটি আর ফিরিয়ে আনা যাবে না।", + "plugin-review:session-expired-continue": "আপনার সেশনের মেয়াদ শেষ। চালিয়ে যেতে আবার সাইন ইন করুন।", + "plugin-review:delete-failed": "পর্যালোচনা মোছা যায়নি।", + "plugin-review:you": "আপনি", + "plugin-review:edit-action": "পর্যালোচনা সম্পাদনা করুন", + "plugin-review:recommended": "এই প্লাগইনটি সুপারিশ করেছেন", + "plugin-review:error-max-length": "পর্যালোচনা {max} অক্ষর বা তার কম হতে হবে।", + "plugin-review:error-downvote-comment": "কী উন্নত করা যায় তা ডেভেলপারকে জানান।", + "plugin-review:error-empty": "একটি মন্তব্য যোগ করুন বা পছন্দ নির্বাচন করুন।", + "plugin-review:unrated": "এখনও মূল্যায়ন নেই" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index 69a1605a87..38b332d152 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Pro získání odměny zhlédněte reklamu až do konce.", + "plugin-review:dialog-label": "Recenze pluginu", + "plugin-review:account-check-failed": "Váš účet se nepodařilo ověřit. Zkuste to znovu.", + "plugin-review:sign-in": "Přihlásit se a napsat recenzi", + "plugin-review:edit": "Upravit vaši recenzi", + "plugin-review:add": "Přidat recenzi…", + "plugin-review:placeholder": "Podělte se o své zkušenosti…", + "plugin-review:input-label": "Recenze pluginu", + "plugin-review:vote-group-label": "Hlas", + "plugin-review:thumbs-up": "Líbí se mi", + "plugin-review:thumbs-down": "Nelíbí se mi", + "plugin-review:delete": "Smazat recenzi", + "plugin-review:load-failed": "Recenze se nepodařilo načíst.", + "plugin-review:retry": "Zkusit znovu", + "plugin-review:empty-title": "Zatím žádné recenze", + "plugin-review:empty-description": "Podělte se o zkušenost jako první.", + "plugin-review:yours": "Vaše recenze", + "plugin-review:community": "Recenze komunity", + "plugin-review:no-other-reviews": "Zatím žádné další recenze.", + "plugin-review:login-incomplete": "Přihlášení nebylo dokončeno.", + "plugin-review:sign-in-failed": "Přihlášení se nezdařilo.", + "plugin-review:session-expired-review": "Vaše relace vypršela. Chcete-li napsat recenzi, přihlaste se znovu.", + "plugin-review:save-failed": "Recenzi se nepodařilo uložit.", + "plugin-review:delete-confirmation": "Smazat vaši recenzi? Tuto akci nelze vrátit zpět.", + "plugin-review:session-expired-continue": "Vaše relace vypršela. Chcete-li pokračovat, přihlaste se znovu.", + "plugin-review:delete-failed": "Recenzi se nepodařilo smazat.", + "plugin-review:you": "Vy", + "plugin-review:edit-action": "Upravit recenzi", + "plugin-review:recommended": "Doporučuje tento plugin", + "plugin-review:error-max-length": "Recenze může mít nejvýše {max} znaků.", + "plugin-review:error-downvote-comment": "Sdělte vývojáři, co by se dalo zlepšit.", + "plugin-review:error-empty": "Přidejte komentář nebo zvolte Líbí se mi.", + "plugin-review:unrated": "Nehodnoceno" } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index 1efd40fe58..a3c9447c7f 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Sieh dir die Anzeige bis zum Ende an, um die Belohnung zu erhalten.", + "plugin-review:dialog-label": "Plugin-Bewertungen", + "plugin-review:account-check-failed": "Dein Konto konnte nicht überprüft werden. Versuche es erneut.", + "plugin-review:sign-in": "Zum Bewerten anmelden", + "plugin-review:edit": "Deine Bewertung bearbeiten", + "plugin-review:add": "Bewertung hinzufügen…", + "plugin-review:placeholder": "Teile deine Erfahrung…", + "plugin-review:input-label": "Plugin-Bewertung", + "plugin-review:vote-group-label": "Stimme", + "plugin-review:thumbs-up": "Gefällt mir", + "plugin-review:thumbs-down": "Gefällt mir nicht", + "plugin-review:delete": "Bewertung löschen", + "plugin-review:load-failed": "Bewertungen konnten nicht geladen werden.", + "plugin-review:retry": "Erneut versuchen", + "plugin-review:empty-title": "Noch keine Bewertungen", + "plugin-review:empty-description": "Teile als Erste oder Erster deine Erfahrung.", + "plugin-review:yours": "Deine Bewertung", + "plugin-review:community": "Bewertungen der Community", + "plugin-review:no-other-reviews": "Noch keine weiteren Bewertungen.", + "plugin-review:login-incomplete": "Die Anmeldung wurde nicht abgeschlossen.", + "plugin-review:sign-in-failed": "Anmeldung nicht möglich.", + "plugin-review:session-expired-review": "Deine Sitzung ist abgelaufen. Melde dich erneut an, um eine Bewertung abzugeben.", + "plugin-review:save-failed": "Bewertung konnte nicht gespeichert werden.", + "plugin-review:delete-confirmation": "Deine Bewertung löschen? Dies kann nicht rückgängig gemacht werden.", + "plugin-review:session-expired-continue": "Deine Sitzung ist abgelaufen. Melde dich erneut an, um fortzufahren.", + "plugin-review:delete-failed": "Bewertung konnte nicht gelöscht werden.", + "plugin-review:you": "Du", + "plugin-review:edit-action": "Bewertung bearbeiten", + "plugin-review:recommended": "Empfiehlt dieses Plugin", + "plugin-review:error-max-length": "Die Bewertung darf höchstens {max} Zeichen lang sein.", + "plugin-review:error-downvote-comment": "Sage dem Entwickler, was verbessert werden könnte.", + "plugin-review:error-empty": "Füge einen Kommentar hinzu oder wähle „Gefällt mir“.", + "plugin-review:unrated": "Nicht bewertet" } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 53063bc74c..2f7a159f7e 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Finish watching the ad to earn the reward.", + "plugin-review:dialog-label": "Plugin reviews", + "plugin-review:account-check-failed": "Unable to check your account. Try again.", + "plugin-review:sign-in": "Sign in to review", + "plugin-review:edit": "Edit your review", + "plugin-review:add": "Add a review...", + "plugin-review:placeholder": "Share your experience...", + "plugin-review:input-label": "Plugin review", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "Thumbs up", + "plugin-review:thumbs-down": "Thumbs down", + "plugin-review:delete": "Delete review", + "plugin-review:load-failed": "Unable to load reviews.", + "plugin-review:retry": "Retry", + "plugin-review:empty-title": "No reviews yet", + "plugin-review:empty-description": "Be the first to share your experience.", + "plugin-review:yours": "Your review", + "plugin-review:community": "Community reviews", + "plugin-review:no-other-reviews": "No other reviews yet.", + "plugin-review:login-incomplete": "Login was not completed.", + "plugin-review:sign-in-failed": "Unable to sign in.", + "plugin-review:session-expired-review": "Your session expired. Sign in again to review.", + "plugin-review:save-failed": "Unable to save review.", + "plugin-review:delete-confirmation": "Delete your review? This cannot be undone.", + "plugin-review:session-expired-continue": "Your session expired. Sign in again to continue.", + "plugin-review:delete-failed": "Unable to delete review.", + "plugin-review:you": "You", + "plugin-review:edit-action": "Edit review", + "plugin-review:recommended": "Recommended this plugin", + "plugin-review:error-max-length": "Review must be {max} characters or less.", + "plugin-review:error-downvote-comment": "Tell the developer what could be improved.", + "plugin-review:error-empty": "Add a comment or choose thumbs up.", + "plugin-review:unrated": "Unrated" } diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 2147ba35fe..276965e483 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Termina de ver el anuncio para obtener la recompensa.", + "plugin-review:dialog-label": "Reseñas del complemento", + "plugin-review:account-check-failed": "No se pudo verificar tu cuenta. Inténtalo de nuevo.", + "plugin-review:sign-in": "Inicia sesión para opinar", + "plugin-review:edit": "Editar tu reseña", + "plugin-review:add": "Agregar una reseña...", + "plugin-review:placeholder": "Comparte tu experiencia...", + "plugin-review:input-label": "Reseña del complemento", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Me gusta", + "plugin-review:thumbs-down": "No me gusta", + "plugin-review:delete": "Eliminar reseña", + "plugin-review:load-failed": "No se pudieron cargar las reseñas.", + "plugin-review:retry": "Reintentar", + "plugin-review:empty-title": "Aún no hay reseñas", + "plugin-review:empty-description": "Sé la primera persona en compartir tu experiencia.", + "plugin-review:yours": "Tu reseña", + "plugin-review:community": "Reseñas de la comunidad", + "plugin-review:no-other-reviews": "Aún no hay otras reseñas.", + "plugin-review:login-incomplete": "No se completó el inicio de sesión.", + "plugin-review:sign-in-failed": "No se pudo iniciar sesión.", + "plugin-review:session-expired-review": "Tu sesión venció. Inicia sesión de nuevo para opinar.", + "plugin-review:save-failed": "No se pudo guardar la reseña.", + "plugin-review:delete-confirmation": "¿Eliminar tu reseña? Esta acción no se puede deshacer.", + "plugin-review:session-expired-continue": "Tu sesión venció. Inicia sesión de nuevo para continuar.", + "plugin-review:delete-failed": "No se pudo eliminar la reseña.", + "plugin-review:you": "Tú", + "plugin-review:edit-action": "Editar reseña", + "plugin-review:recommended": "Recomendó este complemento", + "plugin-review:error-max-length": "La reseña debe tener {max} caracteres o menos.", + "plugin-review:error-downvote-comment": "Dile al desarrollador qué podría mejorar.", + "plugin-review:error-empty": "Agrega un comentario o elige Me gusta.", + "plugin-review:unrated": "Sin calificar" } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index ac2403ef35..5cf8f8b56f 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Regardez la publicité jusqu’à la fin pour obtenir la récompense.", + "plugin-review:dialog-label": "Avis sur l’extension", + "plugin-review:account-check-failed": "Impossible de vérifier votre compte. Réessayez.", + "plugin-review:sign-in": "Se connecter pour donner un avis", + "plugin-review:edit": "Modifier votre avis", + "plugin-review:add": "Ajouter un avis…", + "plugin-review:placeholder": "Partagez votre expérience…", + "plugin-review:input-label": "Avis sur l’extension", + "plugin-review:vote-group-label": "Vote", + "plugin-review:thumbs-up": "J’aime", + "plugin-review:thumbs-down": "Je n’aime pas", + "plugin-review:delete": "Supprimer l’avis", + "plugin-review:load-failed": "Impossible de charger les avis.", + "plugin-review:retry": "Réessayer", + "plugin-review:empty-title": "Aucun avis pour le moment", + "plugin-review:empty-description": "Soyez la première personne à partager votre expérience.", + "plugin-review:yours": "Votre avis", + "plugin-review:community": "Avis de la communauté", + "plugin-review:no-other-reviews": "Aucun autre avis pour le moment.", + "plugin-review:login-incomplete": "La connexion n’a pas abouti.", + "plugin-review:sign-in-failed": "Impossible de se connecter.", + "plugin-review:session-expired-review": "Votre session a expiré. Reconnectez-vous pour donner un avis.", + "plugin-review:save-failed": "Impossible d’enregistrer l’avis.", + "plugin-review:delete-confirmation": "Supprimer votre avis ? Cette action est irréversible.", + "plugin-review:session-expired-continue": "Votre session a expiré. Reconnectez-vous pour continuer.", + "plugin-review:delete-failed": "Impossible de supprimer l’avis.", + "plugin-review:you": "Vous", + "plugin-review:edit-action": "Modifier l’avis", + "plugin-review:recommended": "Recommande cette extension", + "plugin-review:error-max-length": "L’avis doit contenir au maximum {max} caractères.", + "plugin-review:error-downvote-comment": "Indiquez au développeur ce qui pourrait être amélioré.", + "plugin-review:error-empty": "Ajoutez un commentaire ou choisissez J’aime.", + "plugin-review:unrated": "Non évalué" } diff --git a/src/lang/he-il.json b/src/lang/he-il.json index 56b2071a6e..4c306eb535 100644 --- a/src/lang/he-il.json +++ b/src/lang/he-il.json @@ -842,5 +842,37 @@ "confirm app icon reward": "לצפות בפרסומת מתגמלת כדי להחיל את סמל האפליקציה הזה?", "rewarded ad unavailable": "פרסומות מתגמלות אינן זמינות כרגע. יש לנסות שוב.", "rewarded ad failed": "לא ניתן היה להשלים את הפרסומת. יש לנסות שוב.", - "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול." + "rewarded ad incomplete": "יש לצפות בפרסומת עד הסוף כדי לקבל את התגמול.", + "plugin-review:dialog-label": "ביקורות על התוסף", + "plugin-review:account-check-failed": "לא ניתן לבדוק את החשבון שלך. נסה שוב.", + "plugin-review:sign-in": "יש להתחבר כדי לכתוב ביקורת", + "plugin-review:edit": "עריכת הביקורת שלך", + "plugin-review:add": "הוספת ביקורת...", + "plugin-review:placeholder": "שתף את החוויה שלך...", + "plugin-review:input-label": "ביקורת על התוסף", + "plugin-review:vote-group-label": "הצבעה", + "plugin-review:thumbs-up": "אהבתי", + "plugin-review:thumbs-down": "לא אהבתי", + "plugin-review:delete": "מחיקת ביקורת", + "plugin-review:load-failed": "לא ניתן לטעון את הביקורות.", + "plugin-review:retry": "נסה שוב", + "plugin-review:empty-title": "אין עדיין ביקורות", + "plugin-review:empty-description": "היה הראשון לשתף את החוויה שלך.", + "plugin-review:yours": "הביקורת שלך", + "plugin-review:community": "ביקורות הקהילה", + "plugin-review:no-other-reviews": "אין עדיין ביקורות נוספות.", + "plugin-review:login-incomplete": "ההתחברות לא הושלמה.", + "plugin-review:sign-in-failed": "לא ניתן להתחבר.", + "plugin-review:session-expired-review": "פג תוקף ההפעלה שלך. התחבר שוב כדי לכתוב ביקורת.", + "plugin-review:save-failed": "לא ניתן לשמור את הביקורת.", + "plugin-review:delete-confirmation": "למחוק את הביקורת שלך? לא ניתן לבטל פעולה זו.", + "plugin-review:session-expired-continue": "פג תוקף ההפעלה שלך. התחבר שוב כדי להמשיך.", + "plugin-review:delete-failed": "לא ניתן למחוק את הביקורת.", + "plugin-review:you": "אתה", + "plugin-review:edit-action": "עריכת ביקורת", + "plugin-review:recommended": "המליץ על התוסף הזה", + "plugin-review:error-max-length": "הביקורת צריכה להכיל עד {max} תווים.", + "plugin-review:error-downvote-comment": "ספר למפתח מה אפשר לשפר.", + "plugin-review:error-empty": "הוסף תגובה או בחר באהבתי.", + "plugin-review:unrated": "ללא דירוג" } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index a26d5eaae9..97857b6bc6 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "क्या इस ऐप आइकन को लागू करने के लिए इनाम वाला एक विज्ञापन देखना चाहते हैं?", "rewarded ad unavailable": "इनाम वाले विज्ञापन अभी उपलब्ध नहीं हैं। कृपया फिर से कोशिश करें।", "rewarded ad failed": "विज्ञापन पूरा नहीं हो सका। कृपया फिर से कोशिश करें।", - "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।" + "rewarded ad incomplete": "इनाम पाने के लिए विज्ञापन पूरा देखें।", + "plugin-review:dialog-label": "प्लगइन समीक्षाएँ", + "plugin-review:account-check-failed": "आपके खाते की जाँच नहीं हो सकी। फिर से कोशिश करें।", + "plugin-review:sign-in": "समीक्षा देने के लिए साइन इन करें", + "plugin-review:edit": "अपनी समीक्षा संपादित करें", + "plugin-review:add": "समीक्षा जोड़ें...", + "plugin-review:placeholder": "अपना अनुभव साझा करें...", + "plugin-review:input-label": "प्लगइन समीक्षा", + "plugin-review:vote-group-label": "वोट", + "plugin-review:thumbs-up": "पसंद", + "plugin-review:thumbs-down": "नापसंद", + "plugin-review:delete": "समीक्षा हटाएँ", + "plugin-review:load-failed": "समीक्षाएँ लोड नहीं हो सकीं।", + "plugin-review:retry": "फिर से कोशिश करें", + "plugin-review:empty-title": "अभी कोई समीक्षा नहीं है", + "plugin-review:empty-description": "अपना अनुभव साझा करने वाले पहले व्यक्ति बनें।", + "plugin-review:yours": "आपकी समीक्षा", + "plugin-review:community": "समुदाय की समीक्षाएँ", + "plugin-review:no-other-reviews": "अभी कोई अन्य समीक्षा नहीं है।", + "plugin-review:login-incomplete": "साइन इन पूरा नहीं हुआ।", + "plugin-review:sign-in-failed": "साइन इन नहीं हो सका।", + "plugin-review:session-expired-review": "आपका सत्र समाप्त हो गया। समीक्षा देने के लिए फिर से साइन इन करें।", + "plugin-review:save-failed": "समीक्षा सहेजी नहीं जा सकी।", + "plugin-review:delete-confirmation": "अपनी समीक्षा हटाएँ? इसे वापस नहीं किया जा सकता।", + "plugin-review:session-expired-continue": "आपका सत्र समाप्त हो गया। जारी रखने के लिए फिर से साइन इन करें।", + "plugin-review:delete-failed": "समीक्षा हटाई नहीं जा सकी।", + "plugin-review:you": "आप", + "plugin-review:edit-action": "समीक्षा संपादित करें", + "plugin-review:recommended": "इस प्लगइन की सिफ़ारिश की", + "plugin-review:error-max-length": "समीक्षा {max} वर्णों या उससे कम की होनी चाहिए।", + "plugin-review:error-downvote-comment": "डेवलपर को बताएँ कि क्या बेहतर किया जा सकता है।", + "plugin-review:error-empty": "टिप्पणी जोड़ें या पसंद चुनें।", + "plugin-review:unrated": "अभी रेटिंग नहीं" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index 086b82bb69..5616f4f889 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Nézd végig a hirdetést a jutalom megszerzéséhez.", + "plugin-review:dialog-label": "Bővítményértékelések", + "plugin-review:account-check-failed": "Nem sikerült ellenőrizni a fiókját. Próbálja újra.", + "plugin-review:sign-in": "Megjegyzés írásához be kell jelentkezni", + "plugin-review:edit": "Megjegyzés szerkesztése", + "plugin-review:add": "Megjegyzés hozzáadása…", + "plugin-review:placeholder": "Ossza meg a tapasztalatait…", + "plugin-review:input-label": "Megjegyzés hozzáadása", + "plugin-review:vote-group-label": "Szavazás", + "plugin-review:thumbs-up": "Tetszik", + "plugin-review:thumbs-down": "Nem tetszik", + "plugin-review:delete": "Megjegyzés törlése", + "plugin-review:load-failed": "Nem sikerült betölteni a megjegyzéseket.", + "plugin-review:retry": "Újrapróbálkozás", + "plugin-review:empty-title": "Még nincsenek megjegyzések", + "plugin-review:empty-description": "Ossza meg elsőként a tapasztalatait.", + "plugin-review:yours": "Saját megjegyzés", + "plugin-review:community": "Közösségi megjegyzések", + "plugin-review:no-other-reviews": "Még nincsenek további megjegyzések.", + "plugin-review:login-incomplete": "A bejelentkezési folyamat még nem fejeződött be.", + "plugin-review:sign-in-failed": "Nem sikerült bejelentkezni.", + "plugin-review:session-expired-review": "A munkamenet lejárt. Jelentkezzen be újra a megjegyzés írásához.", + "plugin-review:save-failed": "Nem sikerült menteni a megjegyzést.", + "plugin-review:delete-confirmation": "Biztosan törli a megjegyzést? Ez a művelet nem vonható vissza.", + "plugin-review:session-expired-continue": "A munkamenet lejárt. A folytatáshoz jelentkezzen be újra.", + "plugin-review:delete-failed": "Nem sikerült törölni a megjegyzést.", + "plugin-review:you": "Ön", + "plugin-review:edit-action": "Megjegyzés szerkesztése", + "plugin-review:recommended": "Bővítmény ajánlása", + "plugin-review:error-max-length": "A megjegyzés szövege legfeljebb {max} karakter lehet.", + "plugin-review:error-downvote-comment": "Írja meg a fejlesztőknek, hogy min lehetne javítani.", + "plugin-review:error-empty": "Adjon hozzá megjegyzést vagy válassza a „Tetszik” lehetőséget.", + "plugin-review:unrated": "Még nem értékelte senki" } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index dd62d02bb0..9b38fe0ef1 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -8,18 +8,18 @@ "autosave": "Simpan Otomatis", "cancel": "Batal", "change language": "Ubah Bahasa", - "choose color": "Pilih warna", + "choose color": "Pilih Warna", "clear": "Kosongkan", - "close app": "Tutup aplikasi?", - "commit message": "Pesan komit", + "close app": "Tutup Aplikasi?", + "commit message": "Pesan Komit", "console": "Konsol", "conflict error": "Terjadi konflik! Harap tunggu sebelum melakukan komit lain.", "copy": "Salin", - "create folder error": "Maaf, tidak dapat membuat folder baru", + "create folder error": "Maaf, tidak dapat membuat folder baru.", "cut": "Potong", "delete": "Hapus", - "dependencies": "Ketergantungan", - "delay": "Waktu dalam milidetik", + "dependencies": "Dependensi", + "delay": "Waktu dalam Milidetik", "editor settings": "Pengaturan Editor", "editor theme": "Tema Editor", "enter file name": "Masukkan nama berkas", @@ -34,13 +34,13 @@ "file deleted": "Berkas dihapus", "file is not supported": "Berkas tidak didukung", "file not supported": "Jenis berkas ini tidak didukung.", - "file too large": "Berkas terlalu besar untuk ditangani. Ukuran maksimal berkas yang diizinkan adalah {size}", + "file too large": "Berkas terlalu besar untuk ditangani. Ukuran maksimal berkas yang diizinkan adalah {size}.", "file renamed": "Berkas berganti nama", "file saved": "Berkas disimpan", "folder added": "Folder ditambahkan", "folder already added": "Folder sudah ditambahkan", "font size": "Ukuran Font", - "goto": "Pergi ke baris", + "goto": "Pergi ke Baris", "icons definition": "Definisi ikon", "info": "Info", "invalid value": "Nilai tidak valid", @@ -48,23 +48,23 @@ "linting": "Cek kesalahan sintaks", "logout": "Keluar", "loading": "Memuat", - "my profile": "Profil saya", + "my profile": "Profil Saya", "new file": "Berkas baru", "new folder": "Folder baru", "no": "Tidak", - "no editor message": "Buka atau buat berkas dan folder baru dari menu", + "no editor message": "Buka atau buat berkas dan folder baru dari menu.", "not set": "Tidak diatur", "unsaved files close app": "Ada berkas yang belum disimpan. Tutup Aplikasi?", "notice": "Pemberitahuan", "open file": "Buka berkas", "open files and folders": "Buka berkas dan folder", "open folder": "Buka folder", - "open recent": "Buka baru-baru ini", + "open recent": "Buka Yang Baru-Baru Ini", "ok": "OK", "overwrite": "Timpa", "paste": "Tempel", "preview mode": "Mode Pratinjau", - "read only file": "Tidak dapat menyimpan berkas hanya baca. Silakan coba simpan sebagai", + "read only file": "Tidak dapat menyimpan berkas hanya-baca. Silakan coba simpan sebagai.", "reload": "Muat Ulang", "rename": "Ubah Nama", "replace": "Ganti", @@ -73,7 +73,7 @@ "save": "Simpan", "saving": "Menyimpan", "save as": "Simpan sebagai", - "save file to run": "Silakan simpan berkas ini untuk berjalan di peramban", + "save file to run": "Silakan simpan berkas ini agar dapat berjalan di peramban.", "search": "Cari", "see logs and errors": "Lihat log dan kesalahan", "select folder": "Pilih folder", @@ -160,7 +160,7 @@ "dark": "Gelap", "file browser": "Penjelajah Berkas", "operation not permitted": "Operasi tidak diizinkan", - "no such file or directory": "Tidak ada berkas atau direktori seperti itu", + "no such file or directory": "Tidak ada berkas atau direktori seperti itu.", "input/output error": "Kesalahan masukan/keluaran", "permission denied": "Izin ditolak", "bad address": "Alamat tidak valid", @@ -177,7 +177,7 @@ "too many users": "Terlalu banyak pengguna", "connection timed out": "Waktu koneksi habis", "connection refused": "Koneksi ditolak", - "owner died": "Proses induk terhenti", + "owner died": "Proses induk berhenti.", "an error occurred": "Terjadi kesalahan", "add ftp": "Tambahkan FTP", "add sftp": "Tambahkan SFTP", @@ -191,7 +191,7 @@ "deleted file": "Berkas yang dihapus", "line height": "Tinggi baris", "preview info": "Jika Anda ingin menjalankan berkas aktif, ketuk dan tahan ikon Putar.", - "manage all files": "Izinkan Acode Editor untuk mengelola semua berkas dalam pengaturan untuk mengedit berkas di perangkat Anda dengan mudah.", + "manage all files": "Izinkan Acode Editor untuk mengelola semua berkas di pengaturan agar dapat mengedit berkas di perangkat Anda dengan mudah.", "close file": "Tutup berkas", "reset connections": "Atur ulang koneksi", "check file changes": "Periksa perubahan berkas", @@ -252,25 +252,25 @@ "select key file": "Pilih berkas kunci", "passphrase": "Frasa sandi", "connecting...": "Menghubungkan...", - "type filename": "Jenis nama berkas", + "type filename": "Ketik nama berkas", "unable to load files": "Tidak dapat memuat berkas", "preview port": "Port pratinjau", "find file": "Temukan berkas", "system": "Sistem", "please select a formatter": "Mohon pilih pemformat", "case sensitive": "Sensitif huruf besar", - "regular expression": "Ekspresi Regular", + "regular expression": "Ekspresi Reguler", "whole word": "Seluruh kata", "edit with": "Edit dengan", "open with": "Buka dengan", "no app found to handle this file": "Tidak ditemukan aplikasi untuk menangani berkas ini", - "restore default settings": "Kembalikan pengaturan default", + "restore default settings": "Kembalikan Pengaturan Bawaan", "server port": "Port server", "preview settings": "Pengaturan pratinjau", - "preview settings note": "Jika port pratinjau dan port server berbeda, aplikasi tidak akan memulai server dan sebaliknya akan membuka https://: di peramban atau peramban-dalam-aplikasi. Ini berguna ketika Anda menjalankan server di tempat lain.", + "preview settings note": "Jika port pratinjau dan port server berbeda, aplikasi tidak akan memulai server dan sebaliknya akan membuka https://: di peramban atau peramban-dalam-aplikasi. Ini berguna ketika Anda menjalankan server di tempat lain.", "backup/restore note": "Ini hanya akan membuat cadangan pengaturan Anda, tema khusus, plugin yang dipasang, dan pemetaan tombol. Ini tidak akan membuat cadangan FTP/SFTP atau status aplikasi Anda.", "host": "Host", - "retry ftp/sftp when fail": "Ulangi FTP/SFTP ketika gagal", + "retry ftp/sftp when fail": "Ulangi FTP/SFTP saat gagal", "more": "Lebih banyak", "thank you :)": "Terima kasih :)", "purchase pending": "Pembelian Tertunda", @@ -292,42 +292,42 @@ "quicktools trigger mode": "Mode Pemicu Alat Cepat", "print margin": "Cetak margin", "touch move threshold": "Ambang pergerakan sentuh", - "info-retryremotefsafterfail": "Ulangi koneksi FTP/SFTP ketika gagal.", - "info-fullscreen": "Sembunyikan Bilah Judul di Layar Beranda.", - "info-checkfiles": "Periksa perubahan berkas ketika aplikasi di latar belakang.", - "info-console": "Pilih konsol JavaScript. Legacy adalah konsol default, Eruda adalah konsol pihak ketiga.", - "info-keyboardmode": "Mode keyboard untuk input teks, tidak ada saran akan menyembunyikan saran dan koreksi otomatis. Jika tidak ada saran tidak berfungsi, cobalah untuk mengubah nilai ke tanpa saran yang agresif.", - "info-rememberfiles": "Ingat berkas yang dibuka ketika aplikasi ditutup.", - "info-rememberfolders": "Ingat folder yang dibuka ketika aplikasi ditutup.", + "info-retryremotefsafterfail": "Ulangi koneksi FTP/SFTP saat gagal.", + "info-fullscreen": "Sembunyikan bilah judul di layar beranda.", + "info-checkfiles": "Periksa perubahan berkas saat aplikasi berjalan di latar belakang.", + "info-console": "Pilih konsol JavaScript. Legacy adalah konsol bawaan, Eruda adalah konsol pihak ketiga.", + "info-keyboardmode": "Mode papan ketik untuk input teks. Pilihan tanpa saran akan menyembunyikan saran dan koreksi otomatis. Jika tidak ada saran tidak berfungsi, coba ubah nilainya ke tanpa saran yang agresif.", + "info-rememberfiles": "Ingat berkas yang dibuka saat aplikasi ditutup.", + "info-rememberfolders": "Ingat folder yang dibuka saat aplikasi ditutup.", "info-floatingbutton": "Tampilkan atau sembunyikan tombol apung Alat Cepat.", - "info-openfilelistpos": "Di mana untuk menampilkan daftar berkas aktif.", + "info-openfilelistpos": "Lokasi untuk menampilkan daftar berkas aktif.", "info-touchmovethreshold": "Jika sensitivitas sentuhan perangkat Anda terlalu tinggi, Anda dapat meningkatkan nilai ini untuk mencegah gerakan sentuh yang tidak disengaja.", - "info-scroll-settings": "Pengaturan ini berisi pengaturan gulir termasuk bungkus teks.", + "info-scroll-settings": "Pengaturan ini mencakup pengaturan gulir termasuk bungkus teks.", "info-animation": "Jika aplikasi terasa lag, nonaktifkan animasi.", - "info-quicktoolstriggermode": "Jika tombol dalam alat cepat tidak berfungsi, cobalah untuk mengubah nilai ini.", + "info-quicktoolstriggermode": "Jika tombol dalam alat cepat tidak berfungsi, coba ubah nilai ini.", "info-checkForAppUpdates": "Periksa pembaruan aplikasi secara otomatis.", "info-quickTools": "Tampilkan atau sembunyikan alat cepat.", - "info-showHiddenFiles": "Tampilkan berkas dan folder tersembunyi. (Berawal dengan .)", - "info-listFiles": "Otomatis daftarkan semua berkas saat folder dibuka", + "info-showHiddenFiles": "Tampilkan berkas dan folder tersembunyi. (Diawali dengan .)", + "info-listFiles": "Secara otomatis daftarkan semua berkas saat folder dibuka.", "info-all_file_access": "Aktifkan akses ke /sdcard dan /storage di terminal.", "info-fontSize": "Ukuran font yang digunakan untuk menampilkan teks.", "info-fontFamily": "Jenis font yang digunakan untuk menampilkan teks.", "info-theme": "Tema warna terminal.", "info-cursorStyle": "Gaya kursor saat terminal sedang aktif.", "info-cursorInactiveStyle": "Gaya kursor saat terminal tidak terfokus.", - "info-fontWeight": "Ketebalan font yang digunakan untuk menampilkan teks tidak tebal.", + "info-fontWeight": "Ketebalan font yang digunakan untuk menampilkan teks biasa.", "info-cursorBlink": "Apakah kursor berkedip.", - "info-scrollback": "Jumlah scrollback di terminal. Scrollback adalah jumlah baris yang dipertahankan ketika baris digulirkan melampaui tampilan awal.", - "info-tabStopWidth": "Ukuran tab berhenti di terminal.", + "info-scrollback": "Jumlah gulir balik di terminal. Gulir balik adalah jumlah baris yang dipertahankan saat baris digulirkan melampaui tampilan awal.", + "info-tabStopWidth": "Ukuran hentian tab di terminal.", "info-letterSpacing": "Jarak antar karakter dalam piksel penuh.", "info-imageSupport": "Apakah gambar didukung di terminal.", "info-fontLigatures": "Apakah ligatur font diaktifkan di terminal.", - "info-confirmTabClose": "Mintalah konfirmasi sebelum menutup tab terminal.", + "info-confirmTabClose": "Minta konfirmasi sebelum menutup tab terminal.", "info-backup": "Membuat cadangan instalasi terminal.", "info-restore": "Memulihkan cadangan instalasi terminal.", "info-uninstall": "Menghapus instalasi terminal.", "owned": "Dimiliki", - "api_error": "API server turun, silakan coba setelah beberapa waktu.", + "api_error": "Server API sedang down, silakan coba beberapa saat lagi.", "installed": "Terpasang", "all": "Semua", "medium": "Sedang", @@ -345,10 +345,10 @@ "bottom": "Bawah", "save all": "Simpan semua", "close all": "Tutup semua", - "unsaved files warning": "Beberapa berkas tidak disimpan. Klik 'Oke' pilih apa yang harus dilakukan atau tekan 'Batal' untuk kembali.", - "save all warning": "Apakah Anda yakin ingin menyimpan semua berkas dan tutup? Tindakan ini tidak dapat dibalik.", + "unsaved files warning": "Beberapa berkas belum disimpan. Klik 'Oke' untuk memilih tindakan atau tekan 'Batal' untuk kembali.", + "save all warning": "Apakah Anda yakin ingin menyimpan semua berkas dan menutupnya? Tindakan ini tidak dapat diurungkan.", "save all changes warning": "Apakah Anda yakin ingin menyimpan semua berkas?", - "close all warning": "Apakah Anda yakin ingin menutup semua berkas? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat dibalik.", + "close all warning": "Apakah Anda yakin ingin menutup semua berkas? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat diurungkan.", "refresh": "Segarkan", "shortcut buttons": "Tombol pintasan", "no result": "Tidak ada hasil", @@ -387,17 +387,17 @@ "quicktools:search-settings": "Pengaturan Pencarian", "quicktools:search-replace": "Mengganti", "quicktools:search-replace-all": "Ganti Semua", - "info-quicktoolssettings": "Kustomisasi tombol pintas dan tombol keyboard dalam wadah alat cepat di bawah editor untuk meningkatkan pengalaman pengkodean Anda.", - "info-excludefolders": "Gunakan pola **/node_modules/** untuk mengabaikan semua berkas dari folder node_modules. Ini akan mengecualikan berkas dari terdaftar dan juga akan mencegah mereka dimasukkan dalam pencarian berkas.", - "missed files": "Memindai {count} berkas setelah pencarian dimulai dan tidak akan dimasukkan dalam pencarian.", + "info-quicktoolssettings": "Sesuaikan tombol pintasan dan tombol papan ketik dalam wadah alat cepat di bawah editor untuk meningkatkan pengalaman pengkodean Anda.", + "info-excludefolders": "Gunakan pola **/node_modules/** untuk mengabaikan semua berkas dari folder node_modules. Ini akan mengecualikan berkas dari daftar dan juga mencegahnya diikutsertakan dalam pencarian berkas.", + "missed files": "Memindai {count} berkas setelah pencarian dimulai dan tidak akan dimasukkan dalam hasil pencarian.", "remove": "Hapus", "quicktools:command-palette": "Palet perintah", "default file encoding": "Enkoding berkas default", - "remove entry": "Apakah Anda yakin ingin menghapus '{name}' dari jalur yang disimpan? Harap dicatat bahwa menghapusnya tidak akan menghapus jalur itu sendiri.", - "delete entry": "Konfirmasikan penghapusan: '{name}'. Tindakan ini tidak dapat diurungkan. Melanjutkan?", - "change encoding": "Buka kembali '{file}' dengan enkoding '{encoding}'? Tindakan ini akan mengakibatkan hilangnya perubahan yang belum disimpan yang dilakukan pada berkas. Apakah Anda ingin melanjutkan pembukaan kembali?", - "reopen file": "Apakah Anda yakin ingin membuka kembali '{file}'? Setiap perubahan yang belum disimpan akan hilang.", - "plugin min version": "{name} hanya tersedia dalam Acode - {v-code} dan di atas. Klik di sini untuk memperbarui.", + "remove entry": "Apakah Anda yakin ingin menghapus '{name}' dari jalur yang disimpan? Perlu diketahui bahwa menghapusnya tidak akan menghapus jalur itu sendiri.", + "delete entry": "Konfirmasi penghapusan: '{name}'. Tindakan ini tidak dapat diurungkan. Lanjutkan?", + "change encoding": "Buka kembali '{file}' dengan enkoding '{encoding}'? Tindakan ini akan mengakibatkan hilangnya perubahan yang belum disimpan pada berkas ini. Apakah Anda ingin melanjutkan?", + "reopen file": "Apakah Anda yakin ingin membuka kembali '{file}'? Semua perubahan yang belum disimpan akan hilang.", + "plugin min version": "{name} hanya tersedia di Acode - {v-code} ke atas. Klik di sini untuk memperbarui.", "color preview": "Pratinjau warna", "confirm": "Konfirmasi", "problems": "Masalah", @@ -407,16 +407,16 @@ "most_downloaded": "Paling Banyak Diunduh", "newly_added": "Baru Ditambahkan", "top_rated": "Peringkat Teratas", - "rename not supported": "Mengganti nama pada direktori Termux tidak didukung", + "rename not supported": "Mengganti nama pada direktori Termux tidak didukung.", "compress": "Kompres", "copy uri": "Salin Uri", "delete entries": "Apakah Anda yakin ingin menghapus {count} item?", - "deleting items": "menghapus {count} item...", + "deleting items": "Menghapus {count} item...", "import project zip": "Impor Proyek (zip)", "changelog": "Catatan Perubahan", "notifications": "Notifikasi", "no_unread_notifications": "Tidak ada pemberitahuan yang belum dibaca", - "should_use_current_file_for_preview": "Harus menggunakan berkas saat ini untuk pratinjau alih-alih default (index.html)", + "should_use_current_file_for_preview": "Gunakan berkas saat ini untuk pratinjau, alih-alih default (index.html).", "fade fold widgets": "Widget Lipat Pudar", "quicktools:home-key": "Kunci Home", "quicktools:end-key": "Kunci End", @@ -513,7 +513,7 @@ "add to home screen": "Tambah ke layar beranda", "pin shortcuts not supported": "Pintasan layar beranda tidak didukung di perangkat ini.", "save file before home shortcut": "Simpan berkas sebelum menambahkannya ke layar beranda.", - "terminal_required_message_for_lsp": "Terminal tidak terpasang. Mohon pasang Terminal terlebih dahulu untuk menggunakan server LSP.", + "terminal_required_message_for_lsp": "Terminal belum terpasang. Mohon pasang Terminal terlebih dahulu untuk menggunakan server LSP.", "shift click selection": "Pemilihan Shift + tekan/klik", "earn ad-free time": "Ambil waktu bebas iklan", "indent guides": "Panduan indentasi", @@ -534,7 +534,7 @@ "lsp-empty": "Kosong", "lsp-enabled": "Diaktifkan", "lsp-error-add-server-failed": "Gagal menambahkan server", - "lsp-error-args-must-be-array": "Argumen harus berupa sebuah senarai JSON", + "lsp-error-args-must-be-array": "Argumen harus berupa senarai JSON.", "lsp-error-binary-command-required": "Perintah biner diperlukan", "lsp-error-language-id-required": "Setidaknya satu ID bahasa diperlukan", "lsp-error-package-required": "Setidaknya satu paket diperlukan", @@ -552,14 +552,14 @@ "lsp-feature-signature": "Bantuan parameter fungsi", "lsp-feature-signature-info": "Tampilkan petunjuk parameter fungsi saat mengetik.", "lsp-feature-state-toast": "{feature} {state}", - "lsp-initialization-options": "Opsi inisiasi", - "lsp-initialization-options-json": "Opsi inisiasi (JSON)", - "lsp-initialization-options-updated": "Opsi inisiasi diperbarui", - "lsp-install-command": "Perintah pasang", - "lsp-install-command-unavailable": "Perintah pasang tidak tersedia", + "lsp-initialization-options": "Opsi Inisialisasi", + "lsp-initialization-options-json": "Opsi Inisialisasi (JSON)", + "lsp-initialization-options-updated": "Opsi inisialisasi diperbarui.", + "lsp-install-command": "Perintah Pasang", + "lsp-install-command-unavailable": "Perintah pasang tidak tersedia.", "lsp-install-info-check-failed": "Acode tidak dapat memverifikasi status pemasangan.", - "lsp-install-info-missing": "Server bahasa tidak terpasang di dalam lingkungan terminal.", - "lsp-install-info-ready": "Server bahasa terpasang dan siap.", + "lsp-install-info-missing": "Server bahasa belum terpasang di dalam lingkungan terminal.", + "lsp-install-info-ready": "Server bahasa terpasang dan siap digunakan.", "lsp-install-info-unknown": "Status pemasangan tidak dapat diperiksa secara otomatis.", "lsp-install-info-version-available": "Versi {version} tersedia.", "lsp-install-notification": "{server} belum terpasang. Ketuk untuk memasang.", @@ -570,8 +570,8 @@ "lsp-install-method-pip": "Paket pip", "lsp-install-method-shell": "Shell kustom", "lsp-install-method-title": "Metode pasang", - "lsp-install-repair": "Pasang / perbaiki", - "lsp-installation-status": "Status pemasangan", + "lsp-install-repair": "Pasang / Perbaiki", + "lsp-installation-status": "Status Pemasangan", "lsp-installed": "Terpasang", "lsp-invalid-timeout": "Nilai timeout tidak valid", "lsp-language-ids": "ID bahasa (dipisah koma)", @@ -582,10 +582,10 @@ "lsp-server-id": "ID server", "lsp-server-label": "Label server", "lsp-server-not-found": "Server tidak ditemukan", - "lsp-server-uninstalled": "Server dicopot pemasangannya", - "lsp-startup-timeout": "Batas waktu mulai", - "lsp-startup-timeout-ms": "Batas waktu mulai (milidetik)", - "lsp-startup-timeout-set": "Batas waktu mulai diatur ke {timeout} ms", + "lsp-server-uninstalled": "Server dicopot pemasangannya.", + "lsp-startup-timeout": "Batas Waktu Mulai", + "lsp-startup-timeout-ms": "Batas Waktu Mulai (Milidetik)", + "lsp-startup-timeout-set": "Batas waktu mulai diatur ke {timeout} ms.", "lsp-state-disabled": "dinonaktifkan", "lsp-state-enabled": "diaktifkan", "lsp-status": "Status", @@ -596,14 +596,14 @@ "lsp-status-not-installed": "Tidak terpasang", "lsp-status-unknown": "Tidak diketahui", "lsp-timeout-ms": "{timeout} ms", - "lsp-uninstall-command-unavailable": "Perintah copot pemasangan tidak tersedia", + "lsp-uninstall-command-unavailable": "Perintah copot pemasangan tidak tersedia.", "lsp-uninstall-notification": "Ketuk untuk menghapus {server}.", - "lsp-uninstall-server": "Copot pemasangan server", + "lsp-uninstall-server": "Copot Pemasangan Server", "lsp-update-command-optional": "Perintah perbarui (opsional)", "lsp-update-command-unavailable": "Perintah perbarui tidak tersedia", - "lsp-update-server": "Perbarui server", + "lsp-update-server": "Perbarui Server", "lsp-version-line": "Versi: {version}", - "lsp-view-initialization-options": "Lihat opsi inisiasi", + "lsp-view-initialization-options": "Lihat Opsi Inisialisasi", "settings-category-about-acode": "Tentang Acode", "settings-category-discover-apps": "Temukan lebih banyak aplikasi", "settings-category-advanced": "Lanjutan", @@ -632,63 +632,63 @@ "settings-category-support-acode": "Dukung Acode", "settings-category-text-layout": "Teks & tampilan", "settings-info-app-animation": "Kendalikan animasi transisi di seluruh aplikasi.", - "settings-info-app-check-files": "Segarkan ulang editor ketika berkas berubah di luar Acode.", + "settings-info-app-check-files": "Segarkan editor saat berkas berubah di luar Acode.", "settings-info-app-clean-install-state": "Hapus status instalasi yang tersimpan yang digunakan oleh alur orientasi dan pengaturan.", "settings-info-app-confirm-on-exit": "Tanyakan sebelum menutup aplikasi.", - "settings-info-app-console": "Pilih mana integrasi konsol debug yang Acode gunakan.", + "settings-info-app-console": "Pilih integrasi konsol debug yang digunakan Acode.", "settings-info-app-default-file-encoding": "Enkoding bawaan ketika membuka atau membuat berkas.", "settings-info-app-exclude-folders": "Lewati folder dan pola ketika mencari atau memindai.", "settings-info-app-floating-button": "Tampilkan tombol aksi cepat yang melayang.", - "settings-info-app-font-manager": "Pasang, kelola, atau menghapus font aplikasi.", - "settings-info-app-fullscreen": "Sembunyikan bar status sistem ketika menggunakan Acode.", + "settings-info-app-font-manager": "Pasang, kelola, atau hapus font aplikasi.", + "settings-info-app-fullscreen": "Sembunyikan bilah status sistem saat menggunakan Acode.", "settings-info-app-keybindings": "Edit berkas pemetaan tombol atau atur ulang pintasan.", - "settings-info-app-keyboard-mode": "Pilih bagaimana papan ketik perangkat lunak berperilaku ketika mengedit.", + "settings-info-app-keyboard-mode": "Pilih perilaku papan ketik perangkat lunak saat mengedit.", "settings-info-app-language": "Pilih bahasa aplikasi dan label yang diterjemahkan.", - "settings-info-app-open-file-list-position": "Pilih dimana daftar berkas aktif muncul.", - "settings-info-app-quick-tools-settings": "Urutkan ulang dan kustomisaikan pintasan alat cepat.", - "settings-info-app-quick-tools-trigger-mode": "Pilih bagaimana alat cepat terbuka saat ditekan atau disentuh.", - "settings-info-app-remember-files": "Buka ulang berkas yang dibuka terakhir kali.", - "settings-info-app-remember-folders": "Buka ulang folder dari sesi sebelumnya.", - "settings-info-app-retry-remote-fs": "Ulangi lagi operasi berkas jarak jauh setelah transfer gagal.", + "settings-info-app-open-file-list-position": "Pilih di mana daftar berkas aktif muncul.", + "settings-info-app-quick-tools-settings": "Urutkan ulang dan sesuaikan pintasan alat cepat.", + "settings-info-app-quick-tools-trigger-mode": "Pilih cara alat cepat terbuka saat ditekan atau disentuh.", + "settings-info-app-remember-files": "Buka kembali berkas yang terakhir dibuka.", + "settings-info-app-remember-folders": "Buka kembali folder dari sesi sebelumnya.", + "settings-info-app-retry-remote-fs": "Ulangi operasi berkas jarak jauh setelah transfer gagal.", "settings-info-app-side-buttons": "Tampilkan tombol aksi ekstra di samping editor.", "settings-info-app-sponsor-sidebar": "Tampilkan entri sponsor di bar samping.", - "settings-info-app-touch-move-threshold": "Pergerakan minimum sebelum penyeretan sentuh terdeteksi.", - "settings-info-app-vibrate-on-tap": "Aktifkan umpan balik getar untuk tekan dan kendali.", + "settings-info-app-touch-move-threshold": "Pergerakan minimum sebelum gestur seret sentuh terdeteksi.", + "settings-info-app-vibrate-on-tap": "Aktifkan umpan balik getar untuk ketukan dan kontrol.", "settings-info-editor-autosave": "Simpan perubahan secara otomatis setelah jeda.", - "settings-info-editor-color-preview": "Pratinjau nilai warna langsung di dalam editor.", - "settings-info-editor-fade-fold-widgets": "Redupkan penanda lipatan hingga dibutuhkan.", + "settings-info-editor-color-preview": "Pratinjau nilai warna secara langsung di dalam editor.", + "settings-info-editor-fade-fold-widgets": "Redupkan penanda lipatan hingga diperlukan.", "settings-info-editor-font-family": "Pilih tipe font yang digunakan di dalam editor.", "settings-info-editor-font-size": "Atur ukuran teks di editor.", - "settings-info-editor-format-on-save": "Jalankan pemformat ketika sebuah berkas tersimpan.", - "settings-info-editor-hard-wrap": "Masukkan pemotong baris asli daripada hanya membungkusnya secara visual.", - "settings-info-editor-indent-guides": "Tampilkan baris panduan indentasi.", - "settings-info-editor-line-height": "Atur jarak vertikal diantara baris.", + "settings-info-editor-format-on-save": "Jalankan pemformat saat berkas disimpan.", + "settings-info-editor-hard-wrap": "Sisipkan pemotong baris asli daripada hanya membungkusnya secara visual.", + "settings-info-editor-indent-guides": "Tampilkan garis panduan indentasi.", + "settings-info-editor-line-height": "Atur jarak vertikal antarbaris.", "settings-info-editor-line-numbers": "Tampilkan nomor baris di dalam gutter.", "settings-info-editor-lint-gutter": "Tampilkan alat diagnostik dan penanda lint di gutter.", "settings-info-editor-live-autocomplete": "Tampilkan saran ketika Anda mengetik.", - "settings-info-editor-rainbow-brackets": "Warna menyamakan kurung dari kedalaman bersarang.", + "settings-info-editor-rainbow-brackets": "Warnai tanda kurung berdasarkan kedalaman bersarang.", "settings-info-editor-relative-line-numbers": "Tampilkan jarak dari baris saat ini.", - "settings-info-editor-rtl-text": "Ganti perilaku kanan-ke-kiri setiap baris.", - "settings-info-editor-scroll-settings": "Atur ukuran bar gulir, kecepatan, dan perilaku gestur.", - "settings-info-editor-shift-click-selection": "Perluas pemilihan dengan Shift + tekan atau klik.", - "settings-info-editor-show-spaces": "Tampilkan penanda spasi dan jeda baris yang terlihat.", - "settings-info-editor-soft-tab": "Masukkan spasi daripada karakter tab.", - "settings-info-editor-tab-size": "Atur seberapa banyak spasi setiap langkah tab digunakan.", + "settings-info-editor-rtl-text": "Ganti perilaku kanan-ke-kiri per baris.", + "settings-info-editor-scroll-settings": "Atur ukuran bilah gulir, kecepatan, dan perilaku gestur.", + "settings-info-editor-shift-click-selection": "Perluas pemilihan dengan Shift + ketuk atau klik.", + "settings-info-editor-show-spaces": "Tampilkan penanda spasi dan pemotong baris yang terlihat.", + "settings-info-editor-soft-tab": "Sisipkan spasi sebagai pengganti karakter tab.", + "settings-info-editor-tab-size": "Atur jumlah spasi yang digunakan setiap langkah tab.", "settings-info-editor-teardrop-size": "Atur ukuran penangan kursor untuk pengeditan sentuh.", "settings-info-editor-text-wrap": "Bungkus baris panjang di dalam editor.", - "settings-info-lsp-add-custom-server": "Daftarkan server bahasa kustom dengan perintah pasang, perbarui, dan luncur.", - "settings-info-lsp-edit-init-options": "Edit opsi inisiasi sebagai JSON.", + "settings-info-lsp-add-custom-server": "Daftarkan server bahasa kustom dengan perintah pasang, perbarui, dan luncurkan.", + "settings-info-lsp-edit-init-options": "Edit opsi inisialisasi sebagai JSON.", "settings-info-lsp-install-server": "Pasang atau perbaiki server bahasa ini.", "settings-info-lsp-server-enabled": "Aktifkan atau nonaktifkan server bahasa ini.", - "settings-info-lsp-startup-timeout": "Atur seberapa lama Acode menunggu untuk server memulai.", + "settings-info-lsp-startup-timeout": "Atur durasi tunggu Acode untuk server mulai.", "settings-info-lsp-uninstall-server": "Hapus paket terpasang atau biner dari server ini.", - "settings-info-lsp-update-server": "Perbarui server bahasa ini jika alur pembaruan tersedia.", - "settings-info-lsp-view-init-options": "Lihat opsi inisiasi efektif sebagai JSON.", + "settings-info-lsp-update-server": "Perbarui server bahasa ini jika jalur pembaruan tersedia.", + "settings-info-lsp-view-init-options": "Lihat opsi inisialisasi efektif sebagai JSON.", "settings-info-main-ad-rewards": "Tonton iklan untuk membuka akses bebas iklan sementara.", "settings-info-main-app-settings": "Bahasa, perilaku aplikasi, dan alat akses cepat.", - "settings-info-main-backup-restore": "Ekspor pengaturan ke pencadangan atau atur ulang mereka nanti.", - "settings-info-main-changelog": "Lihat perbaruan saat ini dan catatan rilis.", - "settings-info-main-edit-settings": "Edit berkas mentah settings.json secara langsung.", + "settings-info-main-backup-restore": "Ekspor pengaturan ke cadangan atau pulihkan nanti.", + "settings-info-main-changelog": "Lihat pembaruan saat ini dan catatan rilis.", + "settings-info-main-edit-settings": "Edit berkas settings.json secara langsung.", "settings-info-main-editor-settings": "Font, tab, saran, dan tampilan editor.", "settings-info-main-formatter": "Pilih pemformat untuk setiap bahasa yang didukung.", "settings-info-main-lsp-settings": "Konfigurasi server bahasa dan kecerdasan editor.", @@ -697,25 +697,25 @@ "settings-info-main-rateapp": "Nilai Acode di Google Play.", "settings-info-main-remove-ads": "Buka akses permanen bebas iklan.", "settings-info-main-reset": "Atur ulang Acode ke konfigurasi bawaannya.", - "settings-info-main-sponsors": "Mendukung pengembangan Acode yang berkelanjutan.", + "settings-info-main-sponsors": "Dukung pengembangan Acode secara berkelanjutan.", "settings-info-main-terminal-settings": "Tema Terminal, font, kursor, dan perilaku sesi.", "settings-info-main-theme": "Tema aplikasi, kontras, dan warna kustom.", "settings-info-preview-disable-cache": "Selalu muat ulang konten di dalam peramban-dalam-aplikasi.", "settings-info-preview-host": "Nama host yang digunakan ketika membuka URL pratinjau.", - "settings-info-preview-mode": "Pilih dimana pratinjau dibuka ketika Anda meluncurkannya.", + "settings-info-preview-mode": "Pilih di mana pratinjau dibuka saat Anda meluncurkannya.", "settings-info-preview-preview-port": "Port yang digunakan oleh server pratinjau langsung.", "settings-info-preview-server-port": "Port yang digunakan oleh server internal aplikasi.", "settings-info-preview-show-console-toggler": "Tampilkan tombol konsol di dalam pratinjau.", "settings-info-preview-use-current-file": "Utamakan berkas saat ini ketika memulai pratinjau.", - "settings-info-terminal-convert-eol": "Konversikan akhiran baris saat menempelkan atau menampilkan output terminal.", + "settings-info-terminal-convert-eol": "Konversikan akhir baris saat menempel atau menampilkan keluaran terminal.", "settings-note-formatter-settings": "Tetapkan pemformat untuk setiap bahasa. Pasang plugin pemformat untuk membuka lebih banyak opsi.", - "settings-note-lsp-settings": "Server bahasa menambahkan penyelesaian otomatis, diagnostik, detail melayang, dan sebagainya. Mereka bekerja lebih baik dengan folder yang bisa diakses langsung oleh terminal bawaan Acode, seperti folder terminal/publik. Lokasi SAF, eksternal, dan jarak jauh dilewati secara default karena mereka mungkin menggunakan jalur yang di-cache atau virtual; aktifkan opsi kompatibilitas hanya jika Anda ingin mencobanya.", + "settings-note-lsp-settings": "Server bahasa menambahkan penyelesaian otomatis, diagnostik, informasi saat kursor diarahkan, dan sebagainya. Server bekerja lebih baik dengan folder yang dapat diakses langsung oleh terminal bawaan Acode, seperti folder terminal/publik. Lokasi SAF, eksternal, dan jarak jauh dilewati secara bawaan karena mungkin menggunakan jalur yang di-cache atau virtual; aktifkan opsi kompatibilitas hanya jika Anda ingin mencobanya.", "search result label singular": "hasil", "search result label plural": "hasil", "pin tab": "Sematkan tab", "unpin tab": "Lepas sematan tab", "pinned tab": "Tab yang tersematkan", - "unpin tab before closing": "Lepas sematan tab sebelum ditutup.", + "unpin tab before closing": "Lepas sematan tab sebelum menutupnya.", "app font": "Font Aplikasi", "app icon": "App icon", "app icon changed": "App icon changed", @@ -724,52 +724,52 @@ "lsp-transport-method-stdio": "STDIO (luncurkan perintah biner)", "lsp-transport-method-websocket": "WebSocket (hubungkan ke sebuah URL ws/wss)", "lsp-websocket-url": "URL WebSocket", - "lsp-websocket-server-managed-externally": "Server ini dikelola secara eksternal lewat WebSocket.", - "lsp-error-websocket-url-invalid": "URL WebSocket harus berawalan ws:// atau wss://", - "lsp-error-websocket-url-required": "URL WebSocket diperlukan", + "lsp-websocket-server-managed-externally": "Server ini dikelola secara eksternal melalui WebSocket.", + "lsp-error-websocket-url-invalid": "URL WebSocket harus diawali dengan ws:// atau wss://.", + "lsp-error-websocket-url-required": "URL WebSocket diperlukan.", "lsp-remove-custom-server": "Hapus server kustom", "lsp-remove-custom-server-confirm": "Hapus server bahasa kustom {server}?", "lsp-custom-server-removed": "Server kustom dihapus", "settings-info-lsp-remove-custom-server": "Hapus server bahasa kustom ini dari Acode.", - "unsaved selected tabs warning": "Beberapa tab terpilih tidak disimpan. Pilih apa yang harus dilakukan.", + "unsaved selected tabs warning": "Beberapa tab yang dipilih belum disimpan. Pilih tindakan yang akan dilakukan.", "save selected tabs": "Simpan tab terpilih", "close selected tabs": "Tutup tab terpilih", - "save selected tabs warning": "Apakah Anda yakin ingin menyimpan dan menutup tab terpilih?", - "close selected tabs warning": "Apakah Anda yakin ingin menutup tab terpilih? Anda akan kehilangan perubahan yang belum disimpan dan aksi ini tidak dapat dibatalkan.", + "save selected tabs warning": "Apakah Anda yakin ingin menyimpan dan menutup tab yang dipilih?", + "close selected tabs warning": "Apakah Anda yakin ingin menutup tab yang dipilih? Anda akan kehilangan perubahan yang belum disimpan dan tindakan ini tidak dapat diurungkan.", "close tabs to right": "Tutup Kanan", "close tabs to left": "Tutup Kiri", "close other tabs": "Tutup Lainnya", "auto close tags": "Penutup tag otomatis", - "settings-info-editor-auto-close-tags": "Menyisipkan tag penutup di berkas HTML, XML, Vue, Angular, dan templat PHP secara otomatis.", + "settings-info-editor-auto-close-tags": "Sisipkan tag penutup secara otomatis di berkas HTML, XML, Vue, Angular, dan templat PHP.", "ui zoom": "Pembesaran UI", "settings-info-app-ui-zoom": "Skalakan teks di seluruh antarmuka Acode.", "show share button": "Tampilkan tombol bagikan", "settings-info-editor-show-share-button": "Tampilkan tombol bagikan di menu pemilihan.", "plugin-not-supported": "Plugin tidak didukung", "plugin-not-supported-info": "Plugin dibuat untuk versi lama dari Acode.", - "login-to-view": "Mohon login untuk melihat ini...", + "login-to-view": "Mohon masuk untuk melihat ini...", "iap-plugin-purchase-warning": "Plugin yang dibeli tidak disinkronkan ke akun Acode Anda. Gunakan akun Google yang sama di Play Store untuk memulihkan pembelian Anda.", "iap-pro-purchase-warning": "Pembelian ini tidak akan disinkronkan ke akun Acode Anda. Gunakan akun Google yang sama di Play Store untuk memulihkan pembelian Anda.", "confirm-login": "Anda belum masuk ke Acode, masuk sekarang?", "local word completion": "Penyelesaian kata lokal", "language package completion": "Penyelesaian paket bahasa", "settings-info-editor-local-word-completion": "Sarankan kata dari berkas saat ini.", - "settings-info-editor-language-completion": "Sarankan kata kunci, snippet, dan penyelesaian lainnya dari paket bahasa CodeMirror.", + "settings-info-editor-language-completion": "Sarankan kata kunci, cuplikan, dan penyelesaian lainnya dari paket bahasa CodeMirror.", "terminal:failsafe": "Mode FailSafe", - "terminal:failsafe-info": "Mulai terminal dengan shell sistem", + "terminal:failsafe-info": "Mulai terminal dengan shell sistem.", "auto rename tags": "Ubah nama tag otomatis", - "settings-info-editor-auto-rename-tags": "Ubah nama tag pembuka atau penutup yang sama ketika mengedit tag yang mirip HTML.", + "settings-info-editor-auto-rename-tags": "Ubah nama tag pembuka atau penutup yang berpasangan saat mengedit tag mirip HTML.", "copying items": "Menyalin {count} item...", - "cannot paste folder into itself": "Tidak bisa menempelkan folder ke dalam dirinya sendiri", + "cannot paste folder into itself": "Tidak dapat menempelkan folder ke dalam dirinya sendiri.", "folder already exists": "Folder sudah ada", "file already exists force named": "'{name}' sudah ada. Timpa?", "lsp-allow-non-terminal-workspace": "Jalankan LSP di folder eksternal", - "settings-info-lsp-allow-non-terminal-workspace": "Izinkan server bahasa untuk lokasi SAF, eksternal, dan jarak jauh. LSP berjalan di terminal bawaan Acode, yang tidak dapat mengakses lokasi tersebut, jadi fitur-fitur mungkin tidak dapat bekerja dengan benar. Karena itu akan terhubung ke jalur virtual atau lokasi cache.", + "settings-info-lsp-allow-non-terminal-workspace": "Izinkan server bahasa untuk lokasi SAF, eksternal, dan jarak jauh. LSP berjalan di terminal bawaan Acode yang tidak dapat mengakses lokasi tersebut, sehingga beberapa fitur mungkin tidak dapat bekerja dengan benar karena akan terhubung ke jalur virtual atau lokasi cache.", "don't ask again": "Jangan tanyakan lagi", "scrollbar height": "Tinggi bilah gulir", "full": "Penuh", "scroll past end": "Gulir melewati akhir", - "settings-info-scroll-past-end": "Menambahkan spasi kosong ekstra di bawah editor, memungkinkan Anda untuk gulir baris terakhir ke atas.", + "settings-info-scroll-past-end": "Menambahkan ruang kosong tambahan di bawah editor, sehingga Anda dapat menggulirkan baris terakhir ke atas.", "compact": "Ringkas", "off": "Mati", "quick tools height": "Tinggi alat cepat", @@ -778,9 +778,9 @@ "recommend extensions": "Rekomendasikan ekstensi", "settings-info-editor-recommend-extensions": "Sarankan plugin saat file dibuka sebagai teks biasa karena mode bahasa tidak tersedia.", "extension recommendation title": "Ekstensi yang tersedia untuk {extension}", - "extension recommendation message": "Tidak ada mode sintaksis yang diinstal untuk {extension}. Cari plugin untuk \"{keyword}\".", + "extension recommendation message": "Tidak ada mode sintaksis yang terpasang untuk {extension}. Cari plugin untuk \"{keyword}\".", "extension request title": "Ekstensi tidak ditemukan untuk {extension}", - "extension request message": "Minta plugin agar Acode dapat menyoroti jenis file ini.", + "extension request message": "Minta plugin agar Acode dapat menyoroti jenis berkas ini.", "search plugins": "Cari plugin", "request plugin": "Minta plugin", "terminal:block": "Blok", @@ -836,11 +836,43 @@ "info-terminal-show-scrollbar": "Tampilkan bilah gulir xterm di samping terminal.", "terminal:show scrollbar": "Tampilkan Bilah Gulir", "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.", + "settings-info-app-use-file-operation-exclusions": "Lewati berkas 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 pembungkus kata (word wrap) dinonaktifkan. Masukkan nilai piksel bilangan bulat non-negatif.", "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." + "rewarded ad incomplete": "Tonton iklan hingga selesai untuk mendapatkan hadiah.", + "plugin-review:dialog-label": "Ulasan plugin", + "plugin-review:account-check-failed": "Akun Anda tidak dapat diperiksa. Coba lagi.", + "plugin-review:sign-in": "Masuk untuk memberi ulasan", + "plugin-review:edit": "Edit ulasan Anda", + "plugin-review:add": "Tambahkan ulasan...", + "plugin-review:placeholder": "Bagikan pengalaman Anda...", + "plugin-review:input-label": "Ulasan plugin", + "plugin-review:vote-group-label": "Suara", + "plugin-review:thumbs-up": "Suka", + "plugin-review:thumbs-down": "Tidak suka", + "plugin-review:delete": "Hapus ulasan", + "plugin-review:load-failed": "Ulasan tidak dapat dimuat.", + "plugin-review:retry": "Coba lagi", + "plugin-review:empty-title": "Belum ada ulasan", + "plugin-review:empty-description": "Jadilah yang pertama membagikan pengalaman Anda.", + "plugin-review:yours": "Ulasan Anda", + "plugin-review:community": "Ulasan komunitas", + "plugin-review:no-other-reviews": "Belum ada ulasan lain.", + "plugin-review:login-incomplete": "Proses masuk tidak selesai.", + "plugin-review:sign-in-failed": "Tidak dapat masuk.", + "plugin-review:session-expired-review": "Sesi Anda telah berakhir. Masuk lagi untuk memberi ulasan.", + "plugin-review:save-failed": "Ulasan tidak dapat disimpan.", + "plugin-review:delete-confirmation": "Hapus ulasan Anda? Tindakan ini tidak dapat dibatalkan.", + "plugin-review:session-expired-continue": "Sesi Anda telah berakhir. Masuk lagi untuk melanjutkan.", + "plugin-review:delete-failed": "Ulasan tidak dapat dihapus.", + "plugin-review:you": "Anda", + "plugin-review:edit-action": "Edit ulasan", + "plugin-review:recommended": "Merekomendasikan plugin ini", + "plugin-review:error-max-length": "Ulasan harus terdiri dari {max} karakter atau kurang.", + "plugin-review:error-downvote-comment": "Beri tahu developer apa yang dapat ditingkatkan.", + "plugin-review:error-empty": "Tambahkan komentar atau pilih Suka.", + "plugin-review:unrated": "Belum dinilai" } diff --git a/src/lang/index.d.ts b/src/lang/index.d.ts index 84a5387d7c..b8291061ed 100644 --- a/src/lang/index.d.ts +++ b/src/lang/index.d.ts @@ -846,6 +846,38 @@ declare type LangStrings = { "rewarded ad unavailable": string; "rewarded ad failed": string; "rewarded ad incomplete": string; + "plugin-review:dialog-label": string; + "plugin-review:account-check-failed": string; + "plugin-review:sign-in": string; + "plugin-review:edit": string; + "plugin-review:add": string; + "plugin-review:placeholder": string; + "plugin-review:input-label": string; + "plugin-review:vote-group-label": string; + "plugin-review:thumbs-up": string; + "plugin-review:thumbs-down": string; + "plugin-review:delete": string; + "plugin-review:load-failed": string; + "plugin-review:retry": string; + "plugin-review:empty-title": string; + "plugin-review:empty-description": string; + "plugin-review:yours": string; + "plugin-review:community": string; + "plugin-review:no-other-reviews": string; + "plugin-review:login-incomplete": string; + "plugin-review:sign-in-failed": string; + "plugin-review:session-expired-review": string; + "plugin-review:save-failed": string; + "plugin-review:delete-confirmation": string; + "plugin-review:session-expired-continue": string; + "plugin-review:delete-failed": string; + "plugin-review:you": string; + "plugin-review:edit-action": string; + "plugin-review:recommended": string; + "plugin-review:error-max-length": string; + "plugin-review:error-downvote-comment": string; + "plugin-review:error-empty": string; + "plugin-review:unrated": string; }; declare var strings: LangStrings; diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index c1ef78a612..8d7957a6f7 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -842,5 +842,37 @@ "confirm app icon reward": "برای اعمال این نماد برنامه، یک تبلیغ پاداش‌دار تماشا می‌کنید؟", "rewarded ad unavailable": "تبلیغات پاداش‌دار در حال حاضر در دسترس نیستند. لطفاً دوباره تلاش کنید.", "rewarded ad failed": "تبلیغ کامل نشد. لطفاً دوباره تلاش کنید.", - "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید." + "rewarded ad incomplete": "برای دریافت پاداش، تبلیغ را تا پایان تماشا کنید.", + "plugin-review:dialog-label": "نظرهای افزونه", + "plugin-review:account-check-failed": "امکان بررسی حساب شما نبود. دوباره تلاش کنید.", + "plugin-review:sign-in": "برای ثبت نظر وارد شوید", + "plugin-review:edit": "نظر خود را ویرایش کنید", + "plugin-review:add": "افزودن نظر...", + "plugin-review:placeholder": "تجربهٔ خود را به اشتراک بگذارید...", + "plugin-review:input-label": "نظر افزونه", + "plugin-review:vote-group-label": "رأی", + "plugin-review:thumbs-up": "پسندیدم", + "plugin-review:thumbs-down": "نپسندیدم", + "plugin-review:delete": "حذف نظر", + "plugin-review:load-failed": "بارگیری نظرها ممکن نبود.", + "plugin-review:retry": "تلاش دوباره", + "plugin-review:empty-title": "هنوز نظری ثبت نشده است", + "plugin-review:empty-description": "نخستین نفری باشید که تجربهٔ خود را به اشتراک می‌گذارد.", + "plugin-review:yours": "نظر شما", + "plugin-review:community": "نظرهای کاربران", + "plugin-review:no-other-reviews": "هنوز نظر دیگری ثبت نشده است.", + "plugin-review:login-incomplete": "ورود کامل نشد.", + "plugin-review:sign-in-failed": "ورود ممکن نبود.", + "plugin-review:session-expired-review": "نشست شما منقضی شده است. برای ثبت نظر دوباره وارد شوید.", + "plugin-review:save-failed": "ذخیرهٔ نظر ممکن نبود.", + "plugin-review:delete-confirmation": "نظر شما حذف شود؟ این کار قابل بازگشت نیست.", + "plugin-review:session-expired-continue": "نشست شما منقضی شده است. برای ادامه دوباره وارد شوید.", + "plugin-review:delete-failed": "حذف نظر ممکن نبود.", + "plugin-review:you": "شما", + "plugin-review:edit-action": "ویرایش نظر", + "plugin-review:recommended": "این افزونه را پیشنهاد کرده است", + "plugin-review:error-max-length": "نظر باید حداکثر {max} نویسه باشد.", + "plugin-review:error-downvote-comment": "به توسعه‌دهنده بگویید چه چیزی می‌تواند بهتر شود.", + "plugin-review:error-empty": "یک دیدگاه بنویسید یا «پسندیدم» را انتخاب کنید.", + "plugin-review:unrated": "بدون امتیاز" } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index 775c346e91..9d09694c3c 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Guarda l’annuncio fino alla fine per ottenere la ricompensa.", + "plugin-review:dialog-label": "Recensioni del plugin", + "plugin-review:account-check-failed": "Impossibile verificare il tuo account. Riprova.", + "plugin-review:sign-in": "Accedi per lasciare una recensione", + "plugin-review:edit": "Modifica la tua recensione", + "plugin-review:add": "Aggiungi una recensione…", + "plugin-review:placeholder": "Condividi la tua esperienza…", + "plugin-review:input-label": "Recensione del plugin", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Mi piace", + "plugin-review:thumbs-down": "Non mi piace", + "plugin-review:delete": "Elimina recensione", + "plugin-review:load-failed": "Impossibile caricare le recensioni.", + "plugin-review:retry": "Riprova", + "plugin-review:empty-title": "Ancora nessuna recensione", + "plugin-review:empty-description": "Condividi per primo la tua esperienza.", + "plugin-review:yours": "La tua recensione", + "plugin-review:community": "Recensioni della community", + "plugin-review:no-other-reviews": "Ancora nessun'altra recensione.", + "plugin-review:login-incomplete": "Accesso non completato.", + "plugin-review:sign-in-failed": "Impossibile accedere.", + "plugin-review:session-expired-review": "La sessione è scaduta. Accedi di nuovo per lasciare una recensione.", + "plugin-review:save-failed": "Impossibile salvare la recensione.", + "plugin-review:delete-confirmation": "Eliminare la tua recensione? Questa azione non può essere annullata.", + "plugin-review:session-expired-continue": "La sessione è scaduta. Accedi di nuovo per continuare.", + "plugin-review:delete-failed": "Impossibile eliminare la recensione.", + "plugin-review:you": "Tu", + "plugin-review:edit-action": "Modifica recensione", + "plugin-review:recommended": "Consiglia questo plugin", + "plugin-review:error-max-length": "La recensione deve contenere al massimo {max} caratteri.", + "plugin-review:error-downvote-comment": "Spiega allo sviluppatore cosa potrebbe essere migliorato.", + "plugin-review:error-empty": "Aggiungi un commento o scegli Mi piace.", + "plugin-review:unrated": "Non valutato" } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index 326b525fc2..9901ac78ac 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -842,5 +842,37 @@ "confirm app icon reward": "リワード広告を1本視聴して、このアプリアイコンを適用しますか?", "rewarded ad unavailable": "現在リワード広告を利用できません。もう一度お試しください。", "rewarded ad failed": "広告を完了できませんでした。もう一度お試しください。", - "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。" + "rewarded ad incomplete": "報酬を獲得するには、広告を最後まで視聴してください。", + "plugin-review:dialog-label": "プラグインのレビュー", + "plugin-review:account-check-failed": "アカウントを確認できませんでした。もう一度お試しください。", + "plugin-review:sign-in": "ログインしてレビュー", + "plugin-review:edit": "レビューを編集", + "plugin-review:add": "レビューを追加…", + "plugin-review:placeholder": "使用した感想を共有…", + "plugin-review:input-label": "プラグインのレビュー", + "plugin-review:vote-group-label": "評価", + "plugin-review:thumbs-up": "高評価", + "plugin-review:thumbs-down": "低評価", + "plugin-review:delete": "レビューを削除", + "plugin-review:load-failed": "レビューを読み込めませんでした。", + "plugin-review:retry": "再試行", + "plugin-review:empty-title": "まだレビューはありません", + "plugin-review:empty-description": "最初のレビューを投稿しましょう。", + "plugin-review:yours": "あなたのレビュー", + "plugin-review:community": "コミュニティのレビュー", + "plugin-review:no-other-reviews": "ほかのレビューはまだありません。", + "plugin-review:login-incomplete": "ログインが完了しませんでした。", + "plugin-review:sign-in-failed": "ログインできませんでした。", + "plugin-review:session-expired-review": "セッションの有効期限が切れました。もう一度ログインしてレビューしてください。", + "plugin-review:save-failed": "レビューを保存できませんでした。", + "plugin-review:delete-confirmation": "レビューを削除しますか?この操作は元に戻せません。", + "plugin-review:session-expired-continue": "セッションの有効期限が切れました。続行するにはもう一度ログインしてください。", + "plugin-review:delete-failed": "レビューを削除できませんでした。", + "plugin-review:you": "あなた", + "plugin-review:edit-action": "レビューを編集", + "plugin-review:recommended": "このプラグインをおすすめしています", + "plugin-review:error-max-length": "レビューは {max} 文字以内で入力してください。", + "plugin-review:error-downvote-comment": "改善してほしい点を開発者に伝えてください。", + "plugin-review:error-empty": "コメントを追加するか、高評価を選んでください。", + "plugin-review:unrated": "未評価" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index b24526e9f9..1e1a369da5 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -842,5 +842,37 @@ "confirm app icon reward": "보상형 광고 한 편을 시청하고 이 앱 아이콘을 적용할까요?", "rewarded ad unavailable": "현재 보상형 광고를 이용할 수 없습니다. 다시 시도해 주세요.", "rewarded ad failed": "광고를 완료하지 못했습니다. 다시 시도해 주세요.", - "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요." + "rewarded ad incomplete": "보상을 받으려면 광고를 끝까지 시청하세요.", + "plugin-review:dialog-label": "플러그인 리뷰", + "plugin-review:account-check-failed": "계정을 확인할 수 없습니다. 다시 시도하세요.", + "plugin-review:sign-in": "로그인하고 리뷰 작성", + "plugin-review:edit": "내 리뷰 수정", + "plugin-review:add": "리뷰 추가...", + "plugin-review:placeholder": "사용 경험을 공유하세요...", + "plugin-review:input-label": "플러그인 리뷰", + "plugin-review:vote-group-label": "평가", + "plugin-review:thumbs-up": "좋아요", + "plugin-review:thumbs-down": "싫어요", + "plugin-review:delete": "리뷰 삭제", + "plugin-review:load-failed": "리뷰를 불러올 수 없습니다.", + "plugin-review:retry": "다시 시도", + "plugin-review:empty-title": "아직 리뷰가 없습니다", + "plugin-review:empty-description": "첫 번째로 사용 경험을 공유해 보세요.", + "plugin-review:yours": "내 리뷰", + "plugin-review:community": "커뮤니티 리뷰", + "plugin-review:no-other-reviews": "아직 다른 리뷰가 없습니다.", + "plugin-review:login-incomplete": "로그인이 완료되지 않았습니다.", + "plugin-review:sign-in-failed": "로그인할 수 없습니다.", + "plugin-review:session-expired-review": "세션이 만료되었습니다. 다시 로그인하고 리뷰를 작성하세요.", + "plugin-review:save-failed": "리뷰를 저장할 수 없습니다.", + "plugin-review:delete-confirmation": "리뷰를 삭제할까요? 이 작업은 되돌릴 수 없습니다.", + "plugin-review:session-expired-continue": "세션이 만료되었습니다. 계속하려면 다시 로그인하세요.", + "plugin-review:delete-failed": "리뷰를 삭제할 수 없습니다.", + "plugin-review:you": "나", + "plugin-review:edit-action": "리뷰 수정", + "plugin-review:recommended": "이 플러그인을 추천함", + "plugin-review:error-max-length": "리뷰는 {max}자 이하여야 합니다.", + "plugin-review:error-downvote-comment": "개발자에게 개선할 점을 알려 주세요.", + "plugin-review:error-empty": "댓글을 추가하거나 좋아요를 선택하세요.", + "plugin-review:unrated": "평가 없음" } diff --git a/src/lang/ln-ln.json b/src/lang/ln-ln.json new file mode 100644 index 0000000000..b86fe9d345 --- /dev/null +++ b/src/lang/ln-ln.json @@ -0,0 +1,846 @@ +{ + "lang": "Lingala", + "about": "Mpo na yango", + "active files": "Ba fichier efungwami", + "alert": "Likebisi", + "app theme": "Motó ya application", + "autocorrect": "Pesa nzela na bobongisi ya automatique ?", + "autosave": "Kobomba yango moko", + "cancel": "Tika", + "change language": "Bobongola monoko", + "choose color": "Pona langi moko", + "clear": "Longola", + "close app": "Kanga app ?", + "commit message": "Nsango ya commit", + "console": "Konsole", + "copy": "Kopi", + "create folder error": "Ekoki, te kosala dossier ya sika.", + "cut": "Kata", + "delete": "Longola", + "dependencies": "Ba dépendance", + "delay": "Ntango ya kozela na millisecondes", + "editor settings": "Paramɛtrɛ ya mobongisi", + "editor theme": "Motó ya mobongisi", + "enter file name": "Koma nkombo ya fichier", + "enter folder name": "Koma nkombo ya dossier", + "empty folder message": "Dossier ezali mpamba", + "enter line number": "Koma nimero ya ligne", + "error": "Libunga", + "failed": "Elongi te", + "file already exists": "Fichier ezali déjà", + "file already exists force": "Fichier ezali déjà. Kokoma lisusu?", + "file changed": " has been changed, reload file?", + "file deleted": "Fichier elongolami", + "file is not supported": "Fichier oyo esungami te", + "file not supported": "Lolenge ya fichier oyo esungami te.", + "file too large": "Fichier ezali monene mingi mpo na kosalela yango. Bonene ya likolo ezali {size}", + "file renamed": "Nkombo ya fichier ebongwani", + "file saved": "Fichier ebombami", + "folder added": "Dossier ebakisami", + "folder already added": "Dossier ebakisami déjà", + "font size": "Bonene ya makomi", + "goto": "Kende na ligne", + "icons definition": "Ndimbola ya bilembo", + "info": "Sango", + "invalid value": "Valeur ezali malamu te", + "language changed": "Monoko ebongwani malamu", + "linting": "Tala libunga ya syntaxe", + "logout": "Bima", + "loading": "Ezali kokɔtisa", + "my profile": "Profil na ngai", + "new file": "Fichier ya sika", + "new folder": "Dossier ya sika", + "no": "Te", + "no editor message": "Fungola to sala fichier mpe dossier ya sika na menu", + "not set": "Etamwisami te", + "unsaved files close app": "Ba fichiers mosusu ebombami nanu te. Kanga application?", + "notice": "Mayebisi", + "open file": "Fungola fichier", + "open files and folders": "Fungola ba fichiers mpe ba dossiers", + "open folder": "Fungola dossier", + "open recent": "Fungola oyo euti kosalelama sika", + "ok": "OK", + "overwrite": "Koma likolo", + "paste": "Kangisa", + "preview mode": "Mode ya botali liboso", + "read only file": "Ekoki te kobomba fichier ya kotanga kaka. Meká Bomba lokola", + "reload": "Zongisa", + "rename": "Pesa kombo mosusu", + "replace": "Zongisa na esika", + "required": "Esika oyo esengeli kotondisama", + "run your web app": "Tambwisa application web na yo", + "save": "Bomba", + "saving": "Ezali kobomba", + "save as": "Bomba lokola", + "save file to run": "Bomba fichier oyo liboso ya kotambwisa yango na navigateur", + "search": "Luka", + "see logs and errors": "Tala ba logs mpe mabunga", + "select folder": "Pona dossier", + "settings": "Paramɛtrɛ", + "settings saved": "Paramɛtrɛ ebombami", + "show line numbers": "Lakisa mituya ya ba lignes", + "show hidden files": "Lakisa ba fichiers oyo ebombami", + "show spaces": "Lakisa ba espaces", + "soft tab": "Tab ya pete", + "sort by name": "Tanda na kotalela kombo", + "success": "Esalemi malamu", + "tab size": "Bonene ya tab", + "text wrap": "Kokanga milongo ya makomi", + "theme": "Motema ya app", + "title-listfiles": "Tanga ba fichiers", + "Ekoki te kolongola fichier": "unable to delete file", + "unable to open file": "Limbisa, ekoki te kofungola fichier", + "unable to open folder": "Limbisa, ekoki te kofungola dossier", + "unable to save file": "Limbisa, ekoki te kobomba fichier", + "unable to rename": "Limbisa, ekoki te kobongola kombo", + "unsaved file": "Fichier oyo ebombami te, kanga yango kaka?", + "warning": "Likebisi", + "use emmet": "Salela Emmet", + "use quick tools": "Salela bisaleli ya mbangu", + "yes": "Iyo", + "encoding": "Encodage ya makomi", + "syntax highlighting": "Kopesa balangi na syntaxe", + "read only": "Kotanga kaka", + "select all": "Pona nyonso", + "select branch": "Pona branche", + "create new branch": "Sala branche ya sika", + "use branch": "Salela branche", + "new branch": "Branche ya sika", + "branch": "Branch", + "key bindings": "Ba raccourcis ya clavier", + "edit": "Bobongisi", + "reset": "Zongisa na ebandeli", + "color": "Langi", + "select word": "Pona liloba", + "quick tools": "Bisaleli ya mbangu", + "select": "Pona", + "editor font": "Police ya éditeur", + "new project": "Projet ya sika", + "format": "Lolenge", + "project name": "Kombo ya projet", + "unsupported device": "Appareil na yo endimi thème te.", + "vibrate on tap": "Vibrer ntango ozali kofina", + "copy command is not supported by ftp.": "Commande ya kopi esungami te na FTP.", + "support title": "Sunga Acode", + "fullscreen": "Ekran mobimba", + "animation": "Botambwisi", + "backup": "Kopi ya libateli", + "restore": "Zongisa", + "backup successful": "Backup esalemi malamu", + "invalid backup file": "Fichier ya backup ezali malamu te", + "add path": "Bakisa nzela", + "live autocompletion": "Autocomplétion ya mbala moko", + "file properties": "Bizaleli ya fichier", + "path": "Nzela", + "type": "Lolenge", + "word count": "Motango ya maloba", + "line count": "Motango ya milɔngɔ", + "last modified": "Ebongisami mbala ya nsuka", + "size": "Bonene", + "share": "Kabola", + "show print margin": "Lakisa marge ya impression", + "login": "Kota", + "scrollbar size": "Bonene ya barre ya kokitisa", + "cursor controller size": "Bonene ya contrôleur ya curseur", + "none": "Eloko moko te", + "small": "Moke", + "large": "Monene", + "confirm on exit": "Kondimisa liboso ya kobima", + "show console": "Lakisa console", + "image": "Elilingi", + "insert file": "Kotisa fichier", + "insert color": "Kotisa langi", + "powersave mode warning": "Kanga mode ya kobomba nguya mpo na kotala na navigateur ya libanda.", + "exit": "Bima", + "custom": "Ya moto", + "reset warning": "Oza na ntembe te ete olingi kozongisa thème na ebandeli?", + "theme type": "Lolenge ya thème", + "light": "Pole", + "dark": "Molili", + "file browser": "Navigateur ya ba fichiers", + "operation not permitted": "Opération epesami nzela te", + "no such file or directory": "Fichier to dossier yango ezali te", + "input/output error": "Libunga ya entrée/sortie", + "permission denied": "Ndingisa eboyami", + "bad address": "Adresse ezali malamu te", + "file exists": "Fichier ezali", + "not a directory": "Ezali dossier te", + "is a directory": "Ezali dossier", + "invalid argument": "Argument ezali malamu te", + "too many open files in system": "Ba fichiers mingi efungwami na système", + "too many open files": "Ba fichiers mingi efungwami", + "text file busy": "Fichier ya makomi ezali kosalelama", + "no space left on device": "Esika etikali te na appareil", + "read-only file system": "Système ya fichiers ya kotanga kaka", + "file name too long": "Kombo ya fichier ezali molai mingi", + "too many users": "Basaleli bazali mingi", + "connection timed out": "Ntango ya connexion esili", + "connection refused": "Connexion eboyami", + "owner died": "Nkolo akufi", + "an error occurred": "Libunga moko esalemi", + "add ftp": "Bakisa FTP", + "add sftp": "Bakisa SFTP", + "save file": "Bomba fichier", + "save file as": "Bomba fichier lokola", + "files": "Ba fichiers", + "help": "Lisungi", + "file has been deleted": "{file} has been deleted!", + "feature not available": "Makoki oyo ezali te.", + "feature available in paid version": "Makoki oyo ezali kaka na version ya kofuta ya application.", + "deleted file": "Fichier elongolami", + "line height": "Molai ya ligne", + "preview info": "Soki olingi kosala fichier oyo ezali kosala, finá mpe simbá elembo ya kobɛta.", + "manage all files": "Pesa Acode nzela ya kokamba ba fichiers nyonso na paramètres mpo na kobongisa ba fichiers na appareil na yo na pete.", + "close file": "Kanga fichier", + "reset connections": "Zongisa ba connexions", + "check file changes": "Tala mbongwana ya fichier", + "open in browser": "Fungola na navigateur", + "desktop mode": "Mode ordinateur", + "toggle console": "Bongola console", + "new line mode": "Mode ya ligne ya sika", + "add a storage": "Bakisa esika ya kobomba", + "rate acode": "Pesa Acode note", + "support": "Lisungi", + "downloading file": "Ezali kokitisa {file}", + "downloading...": "Ezali kokɔtisa...", + "folder name": "Kombo ya dossier", + "keyboard mode": "Mode ya clavier", + "normal": "Ya momesano", + "app settings": "Paramɛtrɛ ya application", + "disable in-app-browser caching": "Kanga cache ya navigateur ya kati ya application", + "copied to clipboard": "Ekopedami na presse-papier", + "clipboard not available": "Clipboard ezali te.", + "remember opened files": "Kanisa ba fichiers oyo efungwamaki", + "remember opened folders": "Kanisa ba dossiers oyo efungwamaki", + "no suggestions": "Ba suggestions ezali te", + "no suggestions aggressive": "Ba suggestions ya makasi ezali te", + "install": "Tia", + "installing": "Ezali kotia...", + "plugins": "Ba plugins", + "recently used": "Esalelami kala mingi te", + "update": "Bongisa", + "uninstall": "Longola", + "download acode pro": "Kokitisa Acode Pro", + "loading plugins": "Ezali kokɔtisa ba plugins", + "diagonal scrolling": "Kokita na diagonal", + "reverse scrolling": "Kokita na ngámbo ya inverse", + "formatter": "Formatter", + "format on save": "Sala format tango ya kobomba", + "remove ads": "Longola bapub", + "faqs": "Mituna oyo etunamaka mingi", + "feedback": "Makanisi", + "header": "Motó ya likoló", + "sidebar": "Barre ya pembeni", + "inapp": "Inapp", + "browser": "Navigateur", + "fast": "Nokí", + "slow": "Malɛmbɛ", + "scroll settings": "Paramɛtrɛ ya kokita", + "scroll speed": "Mbangu ya kokita", + "loading...": "Ezali kokɔtisa...", + "no plugins found": "Plugin moko te ezwami", + "name": "Kombo", + "username": "Kombo ya mosaleli", + "ekoki kozala te": "optional", + "hostname": "Hostname", + "password": "Liloba ya sekele", + "security type": "Lolenge ya libateli", + "connection mode": "Mode ya connexion", + "port": "Port", + "key file": "Fichier ya fungola", + "select key file": "Pona fichier ya fungola", + "passphrase": "Maloba ya sekele", + "connecting...": "Ezali kokangisa...", + "type filename": "Koma kombo ya fichier", + "unable to load files": "Ekoki te kokɔtisa ba fichiers", + "preview port": "Port ya botali liboso", + "find file": "Luka fichier", + "system": "Sistɛmi", + "please select a formatter": "Pona formatter moko", + "case sensitive": "Kotalela makomi minene mpe mike", + "regular expression": "Regular expression", + "whole word": "Liloba mobimba", + "edit with": "Bongisa na", + "open with": "Fungola na", + "no app found to handle this file": "Application moko te ezwami mpo na kofungola fichier oyo", + "restore default settings": "Zongisa ba paramɛtrɛ ya liboso", + "server port": "Port ya serveur", + "preview settings": "Ba paramɛtrɛ ya botali liboso", + "preview settings note": "Soki port ya preview mpe port ya serveur ekeseni, application ekobanda serveur te mpe ekofungola https://: na navigateur to navigateur ya kati ya application. Yango ezali na tina soki ozali kosalela serveur esika mosusu.", + "backup/restore note": "It will only backup your settings, custom theme, installed plugins and key bindings. It will not backup your FTP/SFTP or App state.", + "host": "Host", + "retry ftp/sftp when fail": "Meka FTP/SFTP lisusu soki elongi te", + "more": "Mosusu", + "thank you :)": "Matondi :)", + "Kosomba ezali kozela": "Kosomba ezali kozela", + "Ebengami": "Ebengami", + "local": "Ya mboka", + "remote": "Ya mosika", + "show console toggler": "Lakisa bouton ya console", + "binary file": "Fichier oyo ezali na ba données binaires, olingi kofungola yango?", + "relative line numbers": "Mituya ya ba lignes na kotalela ligne oyo ezali sikoyo", + "elastic tabstops": "Ba tab stops oyo ebongwanaka", + "line based rtl switching": "Kobongola RTL na kotalela ligne", + "hard wrap": "Kokanga ligne na makasi", + "spellcheck": "Kotala mabunga ya makomi", + "wrap method": "Lolenge ya kokanga milongo", + "use textarea for ime": "Salela textarea mpo na IME", + "invalid plugin": "Plugin ezali malamu te", + "type command": "Koma command", + "plugin": "Plugin", + "quicktools trigger mode": "Lolenge ya kofungola bisaleli ya mbangu", + "print margin": "Marge ya impression", + "touch move threshold": "Limite ya mouvement ya touch", + "info-retryremotefsafterfail": "Meka lisusu connexion FTP/SFTP soki elongi te.", + "info-fullscreen": "Bomba barre ya motó na écran ya ebandeli.", + "info-checkfiles": "Tala mbongwana ya ba fichiers ntango application ezali na nsima.", + "info-console": "Pona console ya JavaScript. Console Legacy ezali ya liboso, mpe Eruda ezali console ya bato mosusu.", + "info-keyboardmode": "Keyboard mode for text input, no suggestions will hide suggestions and auto correct. If no suggestions does not work, try to change value to no suggestions aggressive.", + "info-rememberfiles": "Kanisa ba fichiers oyo efungwami ntango application ekangami.", + "info-rememberfolders": "Kanisa ba dossiers oyo efungwami ntango application ekangami.", + "info-floatingbutton": "Lakisa to bomba bouton flottant ya bisaleli ya mbangu.", + "info-openfilelistpos": "Esika ya kolakisa liste ya ba fichiers oyo ezali kosala.", + "info-touchmovethreshold": "Soki sensibilite ya touch ya appareil na yo ezali makasi mingi, bakisa motuya oyo mpo na kopekisa mouvement ya touch oyo esalemi na libunga.", + "info-scroll-settings": "Ba paramɛtrɛ oyo ezali na ba paramètres ya kokita, bakisa mpe kokanga milongo ya makomi.", + "info-animation": "Soki application ezali kosala malɛmbɛ, kangá animation.", + "info-quicktoolstriggermode": "Soki bouton ya bisaleli ya mbangu ezali kosala te, meká kobongola motuya oyo.", + "info-checkForAppUpdates": "Tala automatiquement soki ba mises à jour ya application ezali.", + "info-quickTools": "Lakisa to bomba ba outils ya noki.", + "info-showHiddenFiles": "Lakisa ba fichiers mpe ba dossiers oyo ebombami. (Bandaka na .)", + "info-listFiles": "Tanga automatiquement ba fichiers nyonso ntango dossier efungwami", + "info-all_file_access": "Pesa terminal accès na /sdcard mpe /storage.", + "info-fontSize": "Bonene ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-fontFamily": "Lolenge ya makomi oyo esalelamaka mpo na kolakisa makomi.", + "info-theme": "Motó ya couleur ya terminal.", + "info-cursorStyle": "Lolenge ya curseur ntango terminal ezali na focus.", + "info-cursorInactiveStyle": "Lolenge ya curseur ntango terminal ezali na focus te.", + "info-fontWeight": "Bonene ya makomi oyo esalelamaka mpo na makomi oyo ezali minene te.", + "info-cursorBlink": "Soki curseur ekoti mpe ebimi.", + "info-scrollback": "Motango ya milongo oyo ebombamaka na terminal ntango ozali kokita.", + "info-tabStopWidth": "Bonene ya ba tab stops na terminal.", + "info-letterSpacing": "Esika oyo ezali kati ya makomi.", + "info-imageSupport": "Soki terminal ekoki kosala na bililingi.", + "info-fontLigatures": "Soki ba ligatures ya makomi efungwami na terminal.", + "info-confirmTabClose": "Senga kondimisa liboso ya kokanga ba onglets ya terminal.", + "info-backup": "Sala backup ya terminal.", + "info-restore": "Zongisa backup ya terminal.", + "info-uninstall": "Longola terminal.", + "owned": "Ezali ya ngai", + "api_error": "Serveur ya API ezali kosala te, meká lisusu nsima ya mwa ntango.", + "installed": "Etyami", + "all": "Nyonso", + "medium": "Ya kati-kati", + "refund": "Kozongisa mbongo", + "product not available": "Produit ezali te", + "no-product-info": "Produit oyo ezali te na mboka na yo sikoyo, meká lisusu na nsima.", + "close": "Kanga", + "explore": "Tala makambo mosusu", + "key bindings updated": "Ba raccourcis ya clavier ebongwani", + "search in files": "Luka na kati ya ba fichiers", + "exclude files": "Longola ba fichiers", + "include files": "Bakisa ba fichiers", + "search result": "{matches} ba résultats na {files} ba fichiers.", + "invalid regex": "Regex ezali na libunga: {message}.", + "bottom": "Na nse", + "save all": "Bomba nyonso", + "close all": "Kanga nyonso", + "unsaved files warning": "Ba fichiers mosusu ebombami nanu te. Finá 'OK' pona kopona nini osala, to 'Cancel' pona kozonga.", + "save all warning": "Oza na ntembe te ete olingi kobomba ba fichiers nyonso mpe kokanga yango? Likambo oyo ekoki kozongisama nsima te.", + "save all changes warning": "Oza na ntembe te ete olingi kobomba mbongwana nyonso ya ba fichiers?", + "close all warning": "Oza na ntembe te ete olingi kokanga ba fichiers nyonso? Mbongwana oyo ebombami te ekobunga mpe likambo oyo ekoki kozongisama nsima te.", + "refresh": "Zongisa", + "shortcut buttons": "Ba boutons ya raccourci", + "no result": "Eyano ezali te", + "searching...": "Koluka...", + "quicktools:ctrl-key": "Fungola ya Control/Command", + "quicktools:tab-key": "Fungola tab", + "quicktools:shift-key": "Fungola Shift", + "quicktools:undo": "Zongisa nsima", + "quicktools:redo": "Zongisa lisusu", + "quicktools:search": "Luka na fichier", + "quicktools:save": "Bomba fichier", + "quicktools:esc-key": "Fungola Escape", + "quicktools:curlybracket": "Kotisa ba accolade", + "quicktools:squarebracket": "Kotisa ba parenthèses carrées", + "quicktools:parentheses": "Kotisa ba parenthèse", + "quicktools:anglebracket": "Kotisa ba parenthèses angulaires", + "quicktools:left-arrow-key": "Flèche ya mwasi", + "quicktools:right-arrow-key": "Flèche ya mobali", + "quicktools:up-arrow-key": "Flèche likolo", + "quicktools:down-arrow-key": "Flèche na nse", + "quicktools:moveline-up": "Tombola ligne likolo", + "quicktools:moveline-down": "Kitisa ligne na nse", + "quicktools:copyline-up": "Kopi ligne likolo", + "quicktools:copyline-down": "Kopi ligne na nse", + "quicktools:semicolon": "Kotisa elembo ya point-virgule", + "quicktools:quotation": "Kotisa elembo ya citation", + "quicktools:and": "Kotisa elembo ya mpe", + "quicktools:bar": "Kotisa elembo ya barre", + "quicktools:equal": "Kotisa elembo ya ekokani", + "quicktools:slash": "Kotisa elembo ya slash", + "quicktools:exclamation": "Kotisa elembo ya exclamation", + "quicktools:alt-key": "Alt", + "quicktools:meta-key": "Windows/Meta", + "quicktools:search-prev": "Match oyo eleki", + "quicktools:search-next": "Match oyo elandi", + "quicktools:search-settings": "Ba paramɛtrɛ ya boluki", + "quicktools:search-replace": "Zongisa", + "quicktools:search-replace-all": "Zongisa nyonso", + "info-quicktoolssettings": "Bongisa ba boutons ya shortcuts mpe ba touches ya clavier na esika ya Quicktools oyo ezali na nse ya éditeur mpo na kobongisa ndenge ya kosala code.", + "info-excludefolders": "Salelá modèle **/node_modules/** mpo na koboya ba fichiers nyonso ya dossier node_modules. Ba fichiers yango ekomonana te na liste mpe ekosala te na boluki ya ba fichiers.", + "missed files": "Ba fichiers {count} etalelami nsima ya kobanda boluki mpe ekotisami te na boluki.", + "remove": "Longola", + "quicktools:command-palette": "Palette ya mitindo", + "default file encoding": "Encodage ya fichier ya liboso", + "remove entry": "Oza na ntembe te ete olingi kolongola '{name}' na ba chemins oyo ebombami? Koboma chemin yango moko te.", + "delete entry": "Ndima koboma: '{name}'. Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "change encoding": "Fungola lisusu '{file}' na encodage '{encoding}'? Likambo oyo ekobungisa mbongwana nyonso oyo ebombami nanu te. Olingi kokoba?", + "reopen file": "Oza na ntembe te ete olingi kofungola lisusu '{file}'? Mbongwana nyonso oyo ebombami nanu te ekobunga.", + "plugin min version": "{name} ezali kaka na Acode - {v-code} mpe ba versions ya likolo. Finá awa mpo na kosala mbongwana.", + "color preview": "Botali liboso ya langi", + "confirm": "Kondimisa", + "problems": "Mikakatano", + "show side buttons": "Lakisa ba boutons ya pembeni", + "bug_report": "Tinda rapɔ́rɛ ya libunga", + "verified publisher": "Mobimisi oyo andimami", + "most_downloaded": "Ekitisami mingi", + "newly_added": "Ebakisami sika", + "top_rated": "Oyo etangami malamu mingi", + "rename not supported": "Kobongola kombo na dossier ya Termux yango esungami te", + "compress": "Kokitisa bonene", + "copy uri": "Kopi URI", + "delete entries": "Oza na ntembe te ete olingi kolongola biloko {count}?", + "deleting items": "Kolongola biloko {count}...", + "import project zip": "Kokɔtisa projet (zip)", + "changelog": "Mbongwana ya version", + "notifications": "Mayebisi", + "no_unread_notifications": "Ezali na ba notifications oyo etángami te te", + "should_use_current_file_for_preview": "Esengeli kosalela fichier oyo ezali sikoyo mpo na preview na esika ya index.html ya liboso.", + "fade fold widgets": "Kokitisa polele ba widgets ya fold", + "quicktools:home-key": "Home", + "quicktools:end-key": "End", + "quicktools:pageup-key": "PageUp", + "quicktools:pagedown-key": "PageDown", + "quicktools:delete-key": "Longola", + "quicktools:tilde": "Kotisa elembo ya tilde", + "quicktools:backtick": "Kotisa backtick", + "quicktools:hash": "Kotisa elembo ya hash", + "quicktools:dollar": "Kotisa elembo ya dollar", + "quicktools:modulo": "Kotisa elembo ya modulo/pourcentage", + "quicktools:caret": "Kotisa elembo ya caret", + "plugin_enabled": "Plugin efungwami", + "plugin_disabled": "Plugin ekangami", + "enable_plugin": "Fungola plugin oyo", + "disable_plugin": "Kanga plugin oyo", + "open_source": "Open source", + "terminal settings": "Paramɛtrɛ ya terminal", + "font ligatures": "Ba ligatures ya makomi", + "letter spacing": "Espace kati ya balɛ́tɛ́lɛ", + "terminal:tab stop width": "Bonene ya tab stop", + "terminal:scrollback": "Milongo ya scrollback", + "terminal:cursor blink": "Kongenga ya curseur", + "terminal:font weight": "Bonene ya makomi", + "terminal:cursor inactive style": "Lolenge ya curseur oyo ezali inactif", + "terminal:cursor style": "Lolenge ya curseur", + "terminal:font family": "Libota ya makomi", + "terminal:convert eol": "Bongola suka ya ligne", + "terminal:confirm tab close": "Ndima kokanga onglet ya terminal", + "terminal:image support": "Lisungi ya bililingi", + "terminal": "Terminal", + "terminal not installed prompt": "Terminal etyá te. Olingi kobanda yango sikawa ?", + "terminal first launch prompt": "Environnement ya terminal etyá te. Ezali kopesa yo nzela ya kosalela ba commands, SSH mpe ba scripts. Olingi kotya yango sikawa ?", + "allFileAccess": "Accès na ba fichiers nyonso", + "fonts": "Makomi", + "sponsor": "Kosalisa", + "downloads": "Ba téléchargements", + "reviews": "Ba avis", + "overview": "Botali ya mobimba", + "contributors": "Bato oyo basalisaki", + "quicktools:hyphen": "Kotisa trait d'union", + "check for app updates": "Tala ba mises à jour ya application", + "prompt update check consent message": "Acode ekoki kotala ba mises à jour ya application ntango ozali na internet. Olingi kofungola botali ya ba mises à jour?", + "keywords": "Maloba ya ntina", + "author": "Mokomi", + "filtered by": "Eponami na", + "clean install state": "Ezalela ya installation ya pamba", + "backup created": "Backup esalemi", + "restore completed": "Zongisi esili", + "restore will include": "Oyo ekozongisa", + "restore warning": "Likambo oyo ekoki kozongisama nsima te. Olingi kokoba?", + "reload to apply": "Zongisa mpo na kosalela mbongwana?", + "reload app": "Kozongisa application", + "preparing backup": "Kobongisa backup", + "collecting settings": "Kozwa ba paramɛtrɛ", + "collecting key bindings": "Kozwa ba raccourcis", + "collecting plugins": "Kozwa makambo ya ba plugin", + "creating backup": "Kosala fichier ya backup", + "validating backup": "Kotalela backup", + "restoring key bindings": "Kozongisa ba raccourcis", + "restoring plugins": "Kozongisa ba plugins", + "restoring settings": "Kozongisa ba paramɛtrɛ", + "legacy backup warning": "Oyo ezali format ya backup ya kala. Ba fonctionnalités mosusu ekoki kozala limitées.", + "checksum mismatch": "Makambo ya checksum ekokani te - fichier ya backup ekoki kozala ebongisami to ebebisami.", + "plugin not found": "Plugin ezwami te na registre", + "paid plugin skipped": "Plugin ya kofuta - kosomba ezwami te", + "source not found": "Fichier source ezali lisusu te", + "restored": "Ezongisami", + "skipped": "Eleki", + "backup not valid object": "Fichier ya backup ezali objet ya malamu te", + "backup no data": "Fichier ya backup ezali na ba données ya kozongisa te", + "backup legacy warning": "Oyo ezali format ya backup ya kala (v1). Ba fonctionnalités mosusu ekoki kozala limitées.", + "backup missing metadata": "Ba informations ya backup ezali te - makambo mosusu ekoki kozanga.", + "backup checksum mismatch": "Checksum ekokani te - fichier ya backup ekoki kozala ebongwani to ebebi. Keba liboso ya kokoba.", + "backup checksum verify failed": "Kotalisa checksum elongi te", + "backup invalid settings": "Format ya ba paramɛtrɛ ezali na libunga", + "backup invalid keybindings": "Format ya ba keyboard shortcuts ezali na libunga", + "backup invalid plugins": "Format ya ba plugins oyo etiemami ezali na libunga", + "issues found": "Mikakatano emonani", + "error details": "Makambo ya libunga", + "active tools": "Bisaleli oyo ezali kosala", + "available tools": "Ba outils oyo ezali", + "recent": "Ba fichiers ya sika", + "command palette": "Fungola menu ya ba commandes", + "change theme": "Bobongola motó", + "documentation": "Mikanda ya lisungi", + "open in terminal": "Fungola na terminal", + "developer mode": "Mode ya developer", + "info-developermode": "Fungola ba outils ya developer (Eruda) pona ko déboguer ba plugins mpe kotala ezalela ya application. Inspecteur ekofungwama tango application ebandi.", + "developer mode enabled": "Mode ya developer efungwami. Salela palette ya mitindo mpo na kofungola to kokanga inspecteur (Ctrl+Shift+I).", + "developer mode disabled": "Mode ya developer ekangami", + "copy relative path": "Kopi nzela relatif", + "shortcut request sent": "Bosengi ya raccourci etindami. Finá Ajouter mpo na kosilisa.", + "add to home screen": "Bakisa na écran d'accueil", + "pin shortcuts not supported": "Ba shortcuts ya écran d'accueil esimbami te na appareil oyo.", + "save file before home shortcut": "Bomba fichier liboso ya kobakisa yango na écran d'accueil.", + "terminal_required_message_for_lsp": "Terminal ezali installed te. Install terminal liboso mpo na kosalela ba serveurs LSP.", + "shift click selection": "Poná na Shift + click", + "earn ad-free time": "Zwa ntango kozanga bapub", + "indent guides": "Ba guide ya kokɔtisa molɔngɔ", + "language servers": "Ba serveurs ya monoko", + "lint gutter": "Lakisa ba erreurs ya lint", + "rainbow brackets": "Ba parenthèses ya balangi", + "lsp-add-custom-server": "Bakisa serveur personnalisé", + "lsp-binary-args": "Ba arguments ya binaire (JSON array)", + "lsp-binary-command": "Command ya binaire", + "lsp-binary-path-optional": "Nzela ya binaire (ekoki kozala te)", + "lsp-check-command-optional": "Command ya kotala (option ya kobongola)", + "lsp-checking-installation-status": "Kotala ezalela ya installation...", + "lsp-configured": "Ebongisami", + "lsp-custom-server-added": "Serveur personnalisé ebakisami", + "lsp-default": "Ya liboso", + "lsp-details-line": "Makambo: {details}", + "lsp-edit-initialization-options": "Bongola ba options ya kobanda", + "lsp-empty": "Ezali mpamba", + "lsp-enabled": "Efongwami", + "lsp-error-add-server-failed": "Ekoki te kobakisa serveur.", + "lsp-error-args-must-be-array": "Ba arguments esengeli kozala tableau ya JSON", + "lsp-error-binary-command-required": "Command binary esengeli", + "lsp-error-language-id-required": "Esengeli kozala na ID moko ya monoko ata moko", + "lsp-error-package-required": "Esengeli kozala na package ata moko", + "lsp-error-server-id-required": "ID ya serveur esengeli", + "lsp-feature-completion": "Kosilisa code automatiquement", + "lsp-feature-completion-info": "Fungola ba suggestions ya autocomplete oyo ewutaka na serveur.", + "lsp-feature-diagnostics": "Botali mabunga", + "lsp-feature-diagnostics-info": "Lakisa ba erreurs mpe ba avertissements oyo ewutaka na serveur ya langue.", + "lsp-feature-formatting": "Bobongisi format", + "lsp-feature-formatting-info": "Fungola formatage ya code oyo ewutaka na serveur ya langue.", + "lsp-feature-hover": "Makambo ya code", + "lsp-feature-hover-info": "Lakisa ba informations ya type mpe documentation tango ozali kosala hover.", + "lsp-feature-inlay-hints": "Bilembo ya lisungi", + "lsp-feature-inlay-hints-info": "Lakisa ba informations ya lolenge ya code na kati ya éditeur.", + "lsp-feature-signature": "Lisungi ya signature", + "lsp-feature-signature-info": "Lakisa ba indications ya ba paramɛtrɛ ya fonction tango ozali kokoma.", + "lsp-feature-state-toast": "{feature} {state}", + "lsp-initialization-options": "Ba options ya kobanda", + "lsp-initialization-options-json": "Ba options ya kobanda (JSON)", + "lsp-initialization-options-updated": "Ba options ya kobanda ebongwani", + "lsp-install-command": "Command ya installation", + "lsp-install-command-unavailable": "Command ya installation ezali te.", + "lsp-install-info-check-failed": "Acode ekoki te kotala soki installation esili malamu.", + "lsp-install-info-missing": "Serveur ya monoko etiemami te na environnement ya terminal.", + "lsp-install-info-ready": "Serveur ya monoko etiemami mpe ezali prêt.", + "lsp-install-info-unknown": "Ezalela ya installation ekoki kotala yango automatiquement te.", + "lsp-install-info-version-available": "Version {version} ezali.", + "lsp-install-notification": "{server} language server is not installed. Tap to install.", + "lsp-install-method-apk": "Package APK", + "lsp-install-method-cargo": "Package Cargo", + "lsp-install-method-manual": "Binaire ya mabɔkɔ", + "lsp-install-method-npm": "Package npm", + "lsp-install-method-pip": "Package pip", + "lsp-install-method-shell": "Shell personnalisé", + "lsp-install-method-title": "Lolenge ya installation", + "lsp-install-repair": "Kotia / kobongisa", + "lsp-installation-status": "Ezalela ya installation", + "lsp-installed": "Eteni", + "lsp-invalid-timeout": "Motuya ya timeout ezali na libunga", + "lsp-language-ids": "Ba ID ya monoko (ekabolami na virgule)", + "lsp-packages-prompt": "Ba packages {method} (ekabwani na virgule)", + "lsp-remove-installed-files": "Longola ba fichiers installés pona {server}?", + "lsp-server-disabled-toast": "Serveur ekangami", + "lsp-server-enabled-toast": "Serveur efungwami", + "lsp-server-id": "ID ya serveur", + "lsp-server-label": "Kombo ya serveur", + "lsp-server-not-found": "Serveur ezwami te", + "lsp-server-uninstalled": "Serveur elongolami", + "lsp-startup-timeout": "Ntango ya kozela na ebandeli", + "lsp-startup-timeout-ms": "Ntango ya kozela na ebandeli (millisecondes)", + "lsp-startup-timeout-set": "Ntango ya kozela etiamisami na {timeout} ms", + "lsp-state-disabled": "ekangami", + "lsp-state-enabled": "efungwami", + "lsp-status": "Ezalela", + "lsp-status-check-failed": "Kotalela elongi te", + "lsp-status-installed": "Eteni", + "lsp-status-installed-version": "Etyami ({version})", + "lsp-status-line": "Ezali: {status}", + "lsp-status-not-installed": "Etyami te", + "lsp-status-unknown": "Eyebani te", + "lsp-timeout-ms": "{timeout} ms", + "lsp-uninstall-command-unavailable": "Command ya kolongola ezali te", + "lsp-uninstall-notification": "Finá mpo na kolongola serveur ya monoko {server}.", + "lsp-uninstall-server": "Longola serveur", + "lsp-update-command-optional": "Command ya mbongwana (option ya kobongisa)", + "lsp-update-command-unavailable": "Command ya mbongwana ezali te.", + "lsp-update-server": "Mbongwana ya serveur", + "lsp-version-line": "Version: {version}", + "lsp-view-initialization-options": "Talá ba options ya kobanda", + "settings-category-about-acode": "Mpo na Acode", + "settings-category-discover-apps": "Tala ba applications mosusu", + "settings-category-advanced": "Ya likolo", + "settings-category-assistance": "Lisungi", + "settings-category-core": "Paramɛtrɛ ya moboko", + "settings-category-cursor": "Curseur", + "settings-category-cursor-selection": "Curseur mpe kopona", + "settings-category-custom-servers": "Ba serveurs oyo ebongisami na moto", + "settings-category-customization-tools": "Bobongisi mpe bisaleli", + "settings-category-display": "Emoniseli", + "settings-category-editing": "Bobongisi", + "settings-category-features": "Makoki", + "settings-category-files-sessions": "Ba fichiers mpe ba sessions", + "settings-category-fonts": "Makomi", + "settings-category-general": "Ya monene", + "settings-category-guides-indicators": "Ba guides mpe bilembo", + "settings-category-installation": "Botie", + "settings-category-interface": "Interface", + "settings-category-maintenance": "Bobongisi mpe bobateli", + "settings-category-permissions": "Ndingisa", + "settings-category-preview": "Botali liboso", + "settings-category-scrolling": "Kokita", + "settings-category-server": "Serveur", + "settings-category-servers": "Ba serveurs", + "settings-category-session": "Session", + "settings-category-support-acode": "Sunga Acode", + "settings-category-text-layout": "Bobongisi ya makomi", + "settings-info-app-animation": "Kamba ba animation ya transition na kati ya application nyonso.", + "settings-info-app-check-files": "Zongisa ba éditeur soki ba fichier ebongwani libanda ya Acode.", + "settings-info-app-clean-install-state": "Longola ezalela ya installation oyo ebombami mpo na setup.", + "settings-info-app-confirm-on-exit": "Senga kondimisa liboso ya kokanga application.", + "settings-info-app-console": "Pona console ya débogage oyo Acode esalela.", + "settings-info-app-default-file-encoding": "Encodage ya liboso tango ya kofungola to kosala ba fichier.", + "settings-info-app-exclude-folders": "Longola ba dossier mpe ba modèle tango ya koluka.", + "settings-info-app-floating-button": "Lakisa bouton flottant ya ba actions ya noki.", + "settings-info-app-font-manager": "Kotia, kokamba to kolongola ba polices ya application.", + "settings-info-app-fullscreen": "Bomba barre ya système ntango ozali kosalela Acode.", + "settings-info-app-keybindings": "Bongola fichier ya ba raccourcis to zongisa yango na ndenge ya liboso.", + "settings-info-app-keyboard-mode": "Pona ndenge clavier ya logiciel esalaka ntango ozali kobongisa code.", + "settings-info-app-language": "Pona monoko ya application mpe ba labels oyo ebongolami.", + "settings-info-app-open-file-list-position": "Pona esika liste ya ba fichiers actifs ekomonana.", + "settings-info-app-quick-tools-settings": "Bongola molongo mpe ndenge ya ba raccourcis ya ba outils ya mbangu.", + "settings-info-app-quick-tools-trigger-mode": "Pona ndenge ba outils ya noki efungwamaka na touche to na kosimba écran.", + "settings-info-app-remember-files": "Fungola lisusu ba fichiers oyo ezalaki ya kofungwama mbala ya suka.", + "settings-info-app-remember-folders": "Fungola lisusu ba dossiers ya session oyo eleki.", + "settings-info-app-retry-remote-fs": "Meka lisusu ba opérations ya fichiers distants nsima ya transfert oyo elongi te.", + "settings-info-app-side-buttons": "Lakisa ba boutons ya actions ya kobakisa pembeni ya éditeur.", + "settings-info-app-sponsor-sidebar": "Lakisa sponsor na sidebar.", + "settings-info-app-touch-move-threshold": "Mouvement moke oyo esengeli liboso ya koyeba déplacement ya touch.", + "settings-info-app-vibrate-on-tap": "Fungola vibration ya appareil tango ozali kosimba ba boutons mpe ba contrôles.", + "settings-info-editor-autosave": "Bomba mbongwana automatiquement nsima ya mwa ntango.", + "settings-info-editor-color-preview": "Tala ba valeur ya langi na kati ya éditeur.", + "settings-info-editor-fade-fold-widgets": "Kitisa pole ya bilembo ya fold soki esengeli te.", + "settings-info-editor-font-family": "Pona lolenge ya police oyo esalelami na éditeur.", + "settings-info-editor-font-size": "Bongola bonene ya makomi ya éditeur.", + "settings-info-editor-format-on-save": "Sala formatage tango nyonso fichier ebombami.", + "settings-info-editor-hard-wrap": "Kotisa ba saut ya ligne ya solo na esika ya kaka kokanga yango na komona.", + "settings-info-editor-indent-guides": "Lakisa ba lignes ya guide ya indentation.", + "settings-info-editor-line-height": "Bongola espace ya likolo mpe ya se kati ya ba ligne.", + "settings-info-editor-line-numbers": "Lakisa mituya ya ba lignes pembeni ya éditeur.", + "settings-info-editor-lint-gutter": "Lakisa ba erreurs, ba diagnostics mpe ba marqueurs ya lint pembeni ya éditeur.", + "settings-info-editor-live-autocomplete": "Lakisa ba suggestions ntango ozali kokoma.", + "settings-info-editor-rainbow-brackets": "Pesa balangisi ya langi na ba crochet oyo ekokani na profondeur.", + "settings-info-editor-relative-line-numbers": "Lakisa distance uta na ligne oyo ozali kosalela.", + "settings-info-editor-rtl-text": "Bongola ndenge ya kokoma droite na gauche mpo na ligne moko na moko.", + "settings-info-editor-scroll-settings": "Bongola bonene ya barre ya défilement, vitesse mpe ndenge ya kosalela yango.", + "settings-info-editor-shift-click-selection": "Bakisa sélection na Shift + kosimba to kofina.", + "settings-info-editor-show-spaces": "Lakisa bilembo oyo emonisaka ba espaces mpe ba saut ya ligne.", + "settings-info-editor-soft-tab": "Kotisa ba espaces na esika ya ba caractères tab.", + "settings-info-editor-tab-size": "Pona motango ya ba espaces oyo tab moko esalela.", + "settings-info-editor-teardrop-size": "Bongola bonene ya poignée ya curseur mpo na édition na touch.", + "settings-info-editor-text-wrap": "Kanga ba ligne milayi na kati ya éditeur.", + "settings-info-lsp-add-custom-server": "Bakisa serveur ya langue personnalisé na ba commandes ya installation, mbongwana mpe lancement.", + "settings-info-lsp-edit-init-options": "Bongola ba options ya kobanda lokola JSON.", + "settings-info-lsp-install-server": "Kotia to kobongisa serveur oyo ya langue.", + "settings-info-lsp-server-enabled": "Kofungola to kokanga serveur oyo ya monoko.", + "settings-info-lsp-startup-timeout": "Pona tango oyo Acode ekoki kozela mpo serveur ebanda.", + "settings-info-lsp-uninstall-server": "Longola ba paquets to ba fichiers exécutables oyo ebombami mpo na serveur oyo.", + "settings-info-lsp-update-server": "Kobongisa serveur oyo ya monoko soki lolenge ya kobongisa ezali.", + "settings-info-lsp-view-init-options": "Tala ba options ya kobanda oyo ezali kosala lokola JSON.", + "settings-info-main-ad-rewards": "Tala ba publicité mpo na kozwa accès sans publicité mpo na mwa tango.", + "settings-info-main-app-settings": "Monoko, ndenge application esalaka mpe ba outils ya accès rapide.", + "settings-info-main-backup-restore": "Bimisa ba paramɛtrɛ na backup to zongisa yango sima.", + "settings-info-main-changelog": "Tala ba mbongwana ya sika mpe ba notes ya version.", + "settings-info-main-edit-settings": "Bongola fichier settings.json brut directement.", + "settings-info-main-editor-settings": "Ba police, ba tabs, ba suggestions mpe ndenge éditeur emonanaka.", + "settings-info-main-formatter": "Pona formatter pona langage moko na moko oyo esungami.", + "settings-info-main-lsp-settings": "Bongisa ba serveur ya monoko mpe mayele ya éditeur.", + "settings-info-main-plugins": "Tambwisa ba plugins oyo etiemi mpe misala na yango.", + "settings-info-main-preview-settings": "Mode ya preview, ba port ya serveur mpe ndenge navigateur esalaka.", + "settings-info-main-rateapp": "Pesa Acode note na Google Play.", + "settings-info-main-remove-ads": "Fungola accès ya libela sans publicité.", + "settings-info-main-reset": "Zongisa Acode na ba paramètres ya liboso.", + "settings-info-main-sponsors": "Sunga bokoli ya Acode oyo ezali kokoba.", + "settings-info-main-terminal-settings": "Motó ya terminal, police, curseur mpe ndenge session esalaka.", + "settings-info-main-theme": "Motó ya application, contraste mpe ba langi oyo ebongisami.", + "settings-info-preview-disable-cache": "Zongisa ntango nyonso makambo ya sika na navigateur ya kati ya application.", + "settings-info-preview-host": "Nkombo ya hôte oyo esalelami ntango URL ya preview efungwami.", + "settings-info-preview-mode": "Pona esika preview ekofungwama ntango obandi yango.", + "settings-info-preview-preview-port": "Port oyo serveur ya preview na tango ya solo esalelaka.", + "settings-info-preview-server-port": "Port oyo serveur ya kati ya application esalelaka.", + "settings-info-preview-show-console-toggler": "Lakisa bouton ya console na preview.", + "settings-info-preview-use-current-file": "Pona liboso fichier oyo ezali sikoyo ntango obandi preview.", + "settings-info-terminal-convert-eol": "Bongola ba suka ya ba lignes ntango ozali kokanga to kolakisa makambo ya terminal.", + "settings-note-formatter-settings": "Pesa formatter na monoko moko na moko. Installer ba plugins ya formatter mpo na kozwa ba options mosusu.", + "settings-note-lsp-settings": "Ba serveurs ya langue ebakisaka autocomplete, diagnostics, ba informations ya hover mpe makambo mosusu. Esalaka malamu mingi na ba dossiers oyo terminal intégré ya Acode ekoki kokoma directement, lokola ba dossiers terminal/public. Ba emplacements SAF, externes mpe distants etikalamaka na libanda automatiquement mpo bakoki kosalela ba chemins ya cache to virtuels; activer option ya compatibilité kaka soki olingi komeka yango.", + "search result label singular": "mbano", + "search result label plural": "mbano", + "pin tab": "Kangisa onglet", + "unpin tab": "Longola onglet na biloko ekangami", + "pinned tab": "Onglet ekangami", + "unpin tab before closing": "Longola tab na pin liboso ya kokanga yango.", + "app font": "Makomi ya application", + "settings-info-app-font-family": "Pona police oyo esalelami na interface mobimba ya application.", + "lsp-transport-method-stdio": "STDIO (bandisa commande ya binaire)", + "lsp-transport-method-websocket": "WebSocket (kota na URL ws/wss)", + "lsp-websocket-url": "URL ya WebSocket", + "lsp-websocket-server-managed-externally": "Serveur oyo etambwisami libanda na nzela ya WebSocket.", + "lsp-error-websocket-url-invalid": "URL ya WebSocket esengeli kobanda na ws:// to wss://", + "lsp-error-websocket-url-required": "URL ya WebSocket esengeli", + "lsp-remove-custom-server": "Longola serveur personnalisé", + "lsp-remove-custom-server-confirm": "Longola serveur personnalisé ya langage {server}?", + "lsp-custom-server-removed": "Serveur personnalisé elongolami", + "settings-info-lsp-remove-custom-server": "Longola serveur ya langue personnalisé oyo na Acode.", + "unsaved selected tabs warning": "Ba tabs mosusu oyo oponi ebombami nanu te. Pona nini osengeli kosala.", + "save selected tabs": "Bomba ba onglets oyo oponi", + "close selected tabs": "Kanga ba onglets oyo oponi", + "save selected tabs warning": "Oza na ntembe te ete olingi kobomba mpe kokanga ba tabs oyo oponi?", + "close selected tabs warning": "Oza na ntembe te ete olingi kokanga ba tabs oyo oponi? Mbongwana oyo ebombami nanu te ekobunga mpe likambo oyo ekoki kozongisama te.", + "close tabs to right": "Kanga oyo ezali na droite", + "close tabs to left": "Kanga oyo ezali na gauche", + "close other tabs": "Kanga ba onglets mosusu", + "auto close tags": "Kanga ba tags automatiquement", + "settings-info-editor-auto-close-tags": "Kotisa automatiquement ba balises ya kokanga na HTML, XML, Vue, Angular mpe PHP.", + "ui zoom": "Zoom ya interface", + "settings-info-app-ui-zoom": "Bongola bonene ya makomi na interface mobimba ya Acode.", + "plugin-not-supported": "Plugin oyo endimami te", + "plugin-not-supported-info": "Plugin esalemaki pona version ya kala ya Acode.", + "login-to-view": "Kota na compte mpo na komona yango...", + "show share button": "Lakisa bouton ya kokabola", + "settings-info-editor-show-share-button": "Lakisa bouton ya partage na menu ya sélection.", + "iap-plugin-purchase-warning": "Ba plugins oyo osombi ebongisami te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "iap-pro-purchase-warning": "Bosombi oyo ekobongisama te na compte na yo ya Acode. Salela compte Google moko na Play Store mpo na kozongisa bosombi na yo.", + "confirm-login": "Okoti nanu te na Acode, olingi kokota sikoyo?", + "local word completion": "Bobongisi ya maloba ya fichier", + "language package completion": "Bobongisi ya package ya lokota", + "settings-info-editor-local-word-completion": "Pesa ba suggestions ya maloba oyo ezali na fichier oyo ozali kosalela.", + "settings-info-editor-language-completion": "Pesaka ba mots ya ntina, ba snippets mpe ba suggestions ya CodeMirror.", + "terminal:failsafe-info": "Bandisa terminal na shell ya système", + "auto rename tags": "Bongola kombo ya ba tags automatiquement", + "settings-info-editor-auto-rename-tags": "Bongola kombo ya balise oyo ekokani tango ozali kobongisa ba balise ya HTML.", + "copying items": "Kokopa biloko {count}...", + "cannot paste folder into itself": "Okoki te ko coller dossier na kati na yango moko", + "folder already exists": "Dossier ezali déjà", + "file already exists force named": "'{name}' ezali deja. Olingi kokoma likolo na yango?", + "lsp-allow-non-terminal-workspace": "Tika LSP esala na ba dossiers ya libanda", + "settings-info-lsp-allow-non-terminal-workspace": "Pesa nzela na ba serveur ya monoko mpo na SAF, bisika ya libanda mpe bisika ya mosika. LSP esalaka na terminal ya kati ya Acode, yango ekoki kosala ete makambo mosusu esalaka malamu te.", + "don't ask again": "Kotuna lisusu te", + "scrollbar height": "Molai ya barre ya bokitisaka", + "full": "Mobimba", + "scroll past end": "Koba kokita koleka suka", + "settings-info-scroll-past-end": "Bakisa esika ya pamba na nse ya éditeur mpo okoka komema molongo ya suka likolo.", + "compact": "Kokómisa mokuse", + "off": "Ekangami", + "quick tools height": "Molai ya bisaleli ya mbangu", + "quick tools toggler": "Bascule ya bisaleli ya mbangu", + "running processes": "Ba processus oyo ezali kosala", + "recommend extensions": "Tinda ba extensions", + "settings-info-editor-recommend-extensions": "Pesaka ba plugins tango fichier efungwami lokola texte pamba mpo na kozanga mode ya monoko.", + "extension recommendation title": "Ba extensions ezali mpo na {extension}", + "extension recommendation message": "Mode ya syntax etiemami te mpo na {extension}. Luka ba plugins mpo na \"{keyword}\".", + "extension request title": "Extension ezwamaki te mpo na {extension}", + "extension request message": "Senga plugin mpo Acode ekoka kolakisa lolenge oyo ya fichier.", + "search plugins": "Luka ba plugins", + "request plugin": "Senga plugin", + "terminal:block": "Bloc", + "terminal:underline": "Mokomi na nse", + "terminal:bar": "Barre", + "terminal:inactive block": "Bloc", + "terminal:inactive underline": "Mokomi na nse", + "terminal:inactive bar": "Barre", + "terminal:inactive none": "Eloko moko te", + "terminal:normal": "Ya momesano", + "terminal:bold": "Makomi minene", + "quicktools-trigger:click": "Finá", + "quicktools-trigger:touch": "Kosimba", + "settings-info-terminal-uninstall": "Oza na ntembe te ete olingi kolongola terminal?", + "terminal:inactive outline": "Ndelo", + "restored successfully": "Terminal ezongisami na elonga", + "uninstalled successfully": "Terminal elongolami na elonga", + "enter plugin source": "Kota source ya plugin", + "enter keywords": "Kota ba maloba ya ntina", + "enter author name": "Kota kombo ya mokomi", + "update available": "Mbongwana ya sika ezali", + "update available info": "Acode {version} ezali sikoyo! Finá awa mpo na kotala yango.", + "plugin updates": "Ba mbongwana ya ba plugins", + "plugin updates singular": "Plugin 1 ezali na version ya sika.", + "plugin updates plural": "Ba plugins {count} ezali na ba versions ya sika.", + "just now": "Sikawa kaka", + "day singular": "Eleki mokolo {count}", + "hour singular": "Eleki ngonga {count}", + "min singular": "Eleki miniti {count}", + "day plural": "Eleki mikolo {count}", + "hour plural": "Eleki bangonga {count}", + "min plural": "Eleki baminiti {count}", + "settings-category-builtin-servers": "Ba serveurs oyo etongami na kati", + "settings-category-plugin-servers": "Ba serveurs ya ba plugins", + "new name": "Kombo ya sika", + "enter new name": "Koma kombo ya sika", + "code actions": "Misala ya code", + "active processes": "Ba processus oyo ezali kosala", + "total memory": "Mémoire mobimba", + "uptime": "Ntango ya mosala", + "note": "Likebisi", + "acode main process": "Processus monene ya Acode", + "ppid parent": "PPID (Moboti)", + "unknown": "Eyebani te", + "just started": "Ebandi sikawa", + "diff days": "Eleki mikolo {days}, bangonga {hr}", + "diff hr": "Eleki {hr}h {min}m", + "diff min": "Eleki {min}m {sec}s", + "diff sec": "Eleki {sec}s", + "command": "Mitindo", + "managed": "Etambwisami", + "acode service": "Service ya Acode", + "info-terminal-show-scrollbar": "Lakisa scrollbar ya xterm pembeni ya terminal.", + "terminal:show scrollbar": "Lakisa barre ya défilement", + "apply exclusions when copying": "Salela ba exclusions ntango ozali kokopa", + "settings-info-app-use-file-operation-exclusions": "Pusa ba fichier mpe ba dossier oyo ekokani na ba règles ya exclusion tango ya kopiya mpe kokanga.", + "horizontal scroll margin": "Marge ya kokita na ngámbo", + "settings-info-horizontal-scroll-margin": "Bakisa esika ya pamba nsima ya ligne oyo eleki molai ntango retour à la ligne ezali kosalelama te. Tia motuya mobimba ya pixels oyo ezali négatif te.", + "conflict error": "Matata! Zela liboso ya kosala commit mosusu.", + "terminal:failsafe": "Mode FailSafe", + "app icon": "App icon", + "app icon changed": "App icon changed", + "settings-info-app-icon": "Choose the app icon displayed on your device.", + "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/ml-in.json b/src/lang/ml-in.json index cc44821d8f..d0f3823fea 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ഈ ആപ്പ് ഐക്കൺ ഉപയോഗിക്കാൻ പ്രതിഫലമുള്ള ഒരു പരസ്യം കാണണോ?", "rewarded ad unavailable": "പ്രതിഫലമുള്ള പരസ്യങ്ങൾ ഇപ്പോൾ ലഭ്യമല്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", "rewarded ad failed": "പരസ്യം പൂർത്തിയാക്കാനായില്ല. ദയവായി വീണ്ടും ശ്രമിക്കുക.", - "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക." + "rewarded ad incomplete": "പ്രതിഫലം ലഭിക്കാൻ പരസ്യം മുഴുവനായി കാണുക.", + "plugin-review:dialog-label": "പ്ലഗിൻ അവലോകനങ്ങൾ", + "plugin-review:account-check-failed": "നിങ്ങളുടെ അക്കൗണ്ട് പരിശോധിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.", + "plugin-review:sign-in": "അവലോകനം നൽകാൻ സൈൻ ഇൻ ചെയ്യുക", + "plugin-review:edit": "നിങ്ങളുടെ അവലോകനം തിരുത്തുക", + "plugin-review:add": "അവലോകനം ചേർക്കുക...", + "plugin-review:placeholder": "നിങ്ങളുടെ അനുഭവം പങ്കിടുക...", + "plugin-review:input-label": "പ്ലഗിൻ അവലോകനം", + "plugin-review:vote-group-label": "വോട്ട്", + "plugin-review:thumbs-up": "ഇഷ്ടപ്പെട്ടു", + "plugin-review:thumbs-down": "ഇഷ്ടപ്പെട്ടില്ല", + "plugin-review:delete": "അവലോകനം ഇല്ലാതാക്കുക", + "plugin-review:load-failed": "അവലോകനങ്ങൾ ലോഡ് ചെയ്യാനായില്ല.", + "plugin-review:retry": "വീണ്ടും ശ്രമിക്കുക", + "plugin-review:empty-title": "ഇതുവരെ അവലോകനങ്ങളൊന്നുമില്ല", + "plugin-review:empty-description": "നിങ്ങളുടെ അനുഭവം ആദ്യം പങ്കിടൂ.", + "plugin-review:yours": "നിങ്ങളുടെ അവലോകനം", + "plugin-review:community": "കമ്മ്യൂണിറ്റി അവലോകനങ്ങൾ", + "plugin-review:no-other-reviews": "മറ്റ് അവലോകനങ്ങളൊന്നും ഇതുവരെ ഇല്ല.", + "plugin-review:login-incomplete": "സൈൻ ഇൻ പൂർത്തിയായില്ല.", + "plugin-review:sign-in-failed": "സൈൻ ഇൻ ചെയ്യാനായില്ല.", + "plugin-review:session-expired-review": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. അവലോകനം നൽകാൻ വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.", + "plugin-review:save-failed": "അവലോകനം സേവ് ചെയ്യാനായില്ല.", + "plugin-review:delete-confirmation": "നിങ്ങളുടെ അവലോകനം ഇല്ലാതാക്കണോ? ഇത് പഴയപടിയാക്കാനാകില്ല.", + "plugin-review:session-expired-continue": "നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. തുടരാൻ വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.", + "plugin-review:delete-failed": "അവലോകനം ഇല്ലാതാക്കാനായില്ല.", + "plugin-review:you": "നിങ്ങൾ", + "plugin-review:edit-action": "അവലോകനം തിരുത്തുക", + "plugin-review:recommended": "ഈ പ്ലഗിൻ ശുപാർശ ചെയ്തു", + "plugin-review:error-max-length": "അവലോകനം {max} അക്ഷരങ്ങളോ അതിൽ കുറവോ ആയിരിക്കണം.", + "plugin-review:error-downvote-comment": "എന്താണ് മെച്ചപ്പെടുത്താനാകുന്നതെന്ന് ഡെവലപ്പറോട് പറയുക.", + "plugin-review:error-empty": "ഒരു അഭിപ്രായം ചേർക്കുക അല്ലെങ്കിൽ ഇഷ്ടപ്പെട്ടു തിരഞ്ഞെടുക്കുക.", + "plugin-review:unrated": "വിലയിരുത്തിയിട്ടില്ല" } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 2c0ca208c0..9f67ac2983 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ဤအက်ပ်အိုင်ကွန်ကို အသုံးပြုရန် ဆုရကြော်ငြာတစ်ခုကို ကြည့်မလား။", "rewarded ad unavailable": "ဆုရကြော်ငြာများကို လောလောဆယ် မရနိုင်ပါ။ ထပ်မံကြိုးစားပါ။", "rewarded ad failed": "ကြော်ငြာကို အဆုံးအထိ မပြသနိုင်ခဲ့ပါ။ ထပ်မံကြိုးစားပါ။", - "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။" + "rewarded ad incomplete": "ဆုရရှိရန် ကြော်ငြာကို အဆုံးအထိ ကြည့်ပါ။", + "plugin-review:dialog-label": "ပလပ်အင် သုံးသပ်ချက်များ", + "plugin-review:account-check-failed": "သင့်အကောင့်ကို စစ်ဆေး၍မရပါ။ ထပ်မံကြိုးစားပါ။", + "plugin-review:sign-in": "သုံးသပ်ချက်ရေးရန် အကောင့်ဝင်ပါ", + "plugin-review:edit": "သင့်သုံးသပ်ချက်ကို ပြင်ဆင်ပါ", + "plugin-review:add": "သုံးသပ်ချက် ထည့်ရန်...", + "plugin-review:placeholder": "သင့်အတွေ့အကြုံကို မျှဝေပါ...", + "plugin-review:input-label": "ပလပ်အင် သုံးသပ်ချက်", + "plugin-review:vote-group-label": "မဲ", + "plugin-review:thumbs-up": "ကြိုက်သည်", + "plugin-review:thumbs-down": "မကြိုက်ပါ", + "plugin-review:delete": "သုံးသပ်ချက် ဖျက်ရန်", + "plugin-review:load-failed": "သုံးသပ်ချက်များကို ဖွင့်၍မရပါ။", + "plugin-review:retry": "ထပ်မံကြိုးစားပါ", + "plugin-review:empty-title": "သုံးသပ်ချက် မရှိသေးပါ", + "plugin-review:empty-description": "သင့်အတွေ့အကြုံကို ပထမဆုံး မျှဝေပါ။", + "plugin-review:yours": "သင့်သုံးသပ်ချက်", + "plugin-review:community": "အသိုင်းအဝိုင်း သုံးသပ်ချက်များ", + "plugin-review:no-other-reviews": "အခြားသုံးသပ်ချက် မရှိသေးပါ။", + "plugin-review:login-incomplete": "အကောင့်ဝင်ခြင်း မပြီးဆုံးပါ။", + "plugin-review:sign-in-failed": "အကောင့်ဝင်၍မရပါ။", + "plugin-review:session-expired-review": "သင့်အသုံးပြုချိန် ကုန်ဆုံးသွားပါပြီ။ သုံးသပ်ချက်ရေးရန် ပြန်ဝင်ပါ။", + "plugin-review:save-failed": "သုံးသပ်ချက်ကို သိမ်း၍မရပါ။", + "plugin-review:delete-confirmation": "သင့်သုံးသပ်ချက်ကို ဖျက်မလား။ ပြန်ယူ၍မရပါ။", + "plugin-review:session-expired-continue": "သင့်အသုံးပြုချိန် ကုန်ဆုံးသွားပါပြီ။ ဆက်လုပ်ရန် ပြန်ဝင်ပါ။", + "plugin-review:delete-failed": "သုံးသပ်ချက်ကို ဖျက်၍မရပါ။", + "plugin-review:you": "သင်", + "plugin-review:edit-action": "သုံးသပ်ချက် ပြင်ဆင်ရန်", + "plugin-review:recommended": "ဤပလပ်အင်ကို အကြံပြုထားသည်", + "plugin-review:error-max-length": "သုံးသပ်ချက်သည် စာလုံးရေ {max} လုံး သို့မဟုတ် ထိုထက်နည်းရမည်။", + "plugin-review:error-downvote-comment": "မည်သည့်အရာကို ပိုကောင်းအောင်လုပ်နိုင်ကြောင်း developer ကို ပြောပါ။", + "plugin-review:error-empty": "မှတ်ချက်ထည့်ပါ သို့မဟုတ် ကြိုက်သည်ကို ရွေးပါ။", + "plugin-review:unrated": "အဆင့်မသတ်မှတ်ရသေးပါ" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 0e9f1b919e..de23b6e30c 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ဤအက္ပ္အိုင္ကြန္ကို အသုံးျပဳရန္ ဆုရေၾကာ္ျငာတစ္ခုကို ၾကည့္မလား။", "rewarded ad unavailable": "ဆုရေၾကာ္ျငာမ်ားကို ေလာေလာဆယ္ မရႏိုင္ပါ။ ထပ္မံႀကိဳးစားပါ။", "rewarded ad failed": "ေၾကာ္ျငာကို အဆုံးအထိ မျပသႏိုင္ခဲ့ပါ။ ထပ္မံႀကိဳးစားပါ။", - "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။" + "rewarded ad incomplete": "ဆုရရွိရန္ ေၾကာ္ျငာကို အဆုံးအထိ ၾကည့္ပါ။", + "plugin-review:dialog-label": "ပလပ္အင္ သုံးသပ္ခ်က္မ်ား", + "plugin-review:account-check-failed": "သင့္အေကာင့္ကို စစ္ေဆး၍မရပါ။ ထပ္မံႀကိဳးစားပါ။", + "plugin-review:sign-in": "သုံးသပ္ခ်က္ေရးရန္ အေကာင့္ဝင္ပါ", + "plugin-review:edit": "သင့္သုံးသပ္ခ်က္ကို ျပင္ဆင္ပါ", + "plugin-review:add": "သုံးသပ္ခ်က္ ထည့္ရန္...", + "plugin-review:placeholder": "သင့္အေတြ႕အႀကဳံကို မွ်ေဝပါ...", + "plugin-review:input-label": "ပလပ္အင္ သုံးသပ္ခ်က္", + "plugin-review:vote-group-label": "မဲ", + "plugin-review:thumbs-up": "ႀကိဳက္သည္", + "plugin-review:thumbs-down": "မႀကိဳက္ပါ", + "plugin-review:delete": "သုံးသပ္ခ်က္ ဖ်က္ရန္", + "plugin-review:load-failed": "သုံးသပ္ခ်က္မ်ားကို ဖြင့္၍မရပါ။", + "plugin-review:retry": "ထပ္မံႀကိဳးစားပါ", + "plugin-review:empty-title": "သုံးသပ္ခ်က္ မရွိေသးပါ", + "plugin-review:empty-description": "သင့္အေတြ႕အႀကဳံကို ပထမဆုံး မွ်ေဝပါ။", + "plugin-review:yours": "သင့္သုံးသပ္ခ်က္", + "plugin-review:community": "အသိုင္းအဝိုင္း သုံးသပ္ခ်က္မ်ား", + "plugin-review:no-other-reviews": "အျခားသုံးသပ္ခ်က္ မရွိေသးပါ။", + "plugin-review:login-incomplete": "အေကာင့္ဝင္ျခင္း မၿပီးဆုံးပါ။", + "plugin-review:sign-in-failed": "အေကာင့္ဝင္၍မရပါ။", + "plugin-review:session-expired-review": "သင့္အသုံးျပဳခ်ိန္ ကုန္ဆုံးသြားပါၿပီ။ သုံးသပ္ခ်က္ေရးရန္ ျပန္ဝင္ပါ။", + "plugin-review:save-failed": "သုံးသပ္ခ်က္ကို သိမ္း၍မရပါ။", + "plugin-review:delete-confirmation": "သင့္သုံးသပ္ခ်က္ကို ဖ်က္မလား။ ျပန္ယူ၍မရပါ။", + "plugin-review:session-expired-continue": "သင့္အသုံးျပဳခ်ိန္ ကုန္ဆုံးသြားပါၿပီ။ ဆက္လုပ္ရန္ ျပန္ဝင္ပါ။", + "plugin-review:delete-failed": "သုံးသပ္ခ်က္ကို ဖ်က္၍မရပါ။", + "plugin-review:you": "သင္", + "plugin-review:edit-action": "သုံးသပ္ခ်က္ ျပင္ဆင္ရန္", + "plugin-review:recommended": "ဤပလပ္အင္ကို အႀကံျပဳထားသည္", + "plugin-review:error-max-length": "သုံးသပ္ခ်က္သည္ စာလုံးေရ {max} လုံး သို႔မဟုတ္ ထိုထက္နည္းရမည္။", + "plugin-review:error-downvote-comment": "မည္သည့္အရာကို ပိုေကာင္းေအာင္လုပ္ႏိုင္ေၾကာင္း developer ကို ေျပာပါ။", + "plugin-review:error-empty": "မွတ္ခ်က္ထည့္ပါ သို႔မဟုတ္ ႀကိဳက္သည္ကို ေ႐ြးပါ။", + "plugin-review:unrated": "အဆင့္မသတ္မွတ္ရေသးပါ" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 843821641a..890c7082b7 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -842,5 +842,37 @@ "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ę." + "rewarded ad incomplete": "Obejrzyj reklamę do końca, aby otrzymać nagrodę.", + "plugin-review:dialog-label": "Opinie o wtyczce", + "plugin-review:account-check-failed": "Nie udało się sprawdzić Twojego konta. Spróbuj ponownie.", + "plugin-review:sign-in": "Zaloguj się, aby dodać opinię", + "plugin-review:edit": "Edytuj swoją opinię", + "plugin-review:add": "Dodaj opinię…", + "plugin-review:placeholder": "Podziel się swoim doświadczeniem…", + "plugin-review:input-label": "Opinia o wtyczce", + "plugin-review:vote-group-label": "Głos", + "plugin-review:thumbs-up": "Lubię", + "plugin-review:thumbs-down": "Nie lubię", + "plugin-review:delete": "Usuń opinię", + "plugin-review:load-failed": "Nie udało się wczytać opinii.", + "plugin-review:retry": "Spróbuj ponownie", + "plugin-review:empty-title": "Brak opinii", + "plugin-review:empty-description": "Podziel się swoim doświadczeniem jako pierwsza osoba.", + "plugin-review:yours": "Twoja opinia", + "plugin-review:community": "Opinie społeczności", + "plugin-review:no-other-reviews": "Nie ma jeszcze innych opinii.", + "plugin-review:login-incomplete": "Logowanie nie zostało ukończone.", + "plugin-review:sign-in-failed": "Nie udało się zalogować.", + "plugin-review:session-expired-review": "Twoja sesja wygasła. Zaloguj się ponownie, aby dodać opinię.", + "plugin-review:save-failed": "Nie udało się zapisać opinii.", + "plugin-review:delete-confirmation": "Usunąć Twoją opinię? Tej operacji nie można cofnąć.", + "plugin-review:session-expired-continue": "Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować.", + "plugin-review:delete-failed": "Nie udało się usunąć opinii.", + "plugin-review:you": "Ty", + "plugin-review:edit-action": "Edytuj opinię", + "plugin-review:recommended": "Poleca tę wtyczkę", + "plugin-review:error-max-length": "Opinia może mieć maksymalnie {max} znaków.", + "plugin-review:error-downvote-comment": "Powiedz deweloperowi, co można poprawić.", + "plugin-review:error-empty": "Dodaj komentarz lub wybierz „Lubię”.", + "plugin-review:unrated": "Bez oceny" } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index 6ac0faea49..09938cbf79 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Assista ao anúncio até o fim para receber a recompensa.", + "plugin-review:dialog-label": "Avaliações do plugin", + "plugin-review:account-check-failed": "Não foi possível verificar sua conta. Tente novamente.", + "plugin-review:sign-in": "Entre para avaliar", + "plugin-review:edit": "Editar sua avaliação", + "plugin-review:add": "Adicionar uma avaliação...", + "plugin-review:placeholder": "Compartilhe sua experiência...", + "plugin-review:input-label": "Avaliação do plugin", + "plugin-review:vote-group-label": "Voto", + "plugin-review:thumbs-up": "Gostei", + "plugin-review:thumbs-down": "Não gostei", + "plugin-review:delete": "Excluir avaliação", + "plugin-review:load-failed": "Não foi possível carregar as avaliações.", + "plugin-review:retry": "Tentar novamente", + "plugin-review:empty-title": "Ainda não há avaliações", + "plugin-review:empty-description": "Seja a primeira pessoa a compartilhar sua experiência.", + "plugin-review:yours": "Sua avaliação", + "plugin-review:community": "Avaliações da comunidade", + "plugin-review:no-other-reviews": "Ainda não há outras avaliações.", + "plugin-review:login-incomplete": "O login não foi concluído.", + "plugin-review:sign-in-failed": "Não foi possível entrar.", + "plugin-review:session-expired-review": "Sua sessão expirou. Entre novamente para avaliar.", + "plugin-review:save-failed": "Não foi possível salvar a avaliação.", + "plugin-review:delete-confirmation": "Excluir sua avaliação? Esta ação não pode ser desfeita.", + "plugin-review:session-expired-continue": "Sua sessão expirou. Entre novamente para continuar.", + "plugin-review:delete-failed": "Não foi possível excluir a avaliação.", + "plugin-review:you": "Você", + "plugin-review:edit-action": "Editar avaliação", + "plugin-review:recommended": "Recomendou este plugin", + "plugin-review:error-max-length": "A avaliação deve ter no máximo {max} caracteres.", + "plugin-review:error-downvote-comment": "Diga ao desenvolvedor o que pode ser melhorado.", + "plugin-review:error-empty": "Adicione um comentário ou escolha Gostei.", + "plugin-review:unrated": "Sem avaliação" } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index c0030f7bb2..7f29eb6f43 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -842,5 +842,37 @@ "confirm app icon reward": "ਕੀ ਇਸ ਐਪ ਆਈਕਨ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਇੱਕ ਇਨਾਮ ਵਾਲਾ ਇਸ਼ਤਿਹਾਰ ਦੇਖਣਾ ਹੈ?", "rewarded ad unavailable": "ਇਨਾਮ ਵਾਲੇ ਇਸ਼ਤਿਹਾਰ ਇਸ ਵੇਲੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", "rewarded ad failed": "ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", - "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।" + "rewarded ad incomplete": "ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ਼ਤਿਹਾਰ ਪੂਰਾ ਦੇਖੋ।", + "plugin-review:dialog-label": "ਪਲੱਗਇਨ ਸਮੀਖਿਆਵਾਂ", + "plugin-review:account-check-failed": "ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", + "plugin-review:sign-in": "ਸਮੀਖਿਆ ਦੇਣ ਲਈ ਸਾਈਨ ਇਨ ਕਰੋ", + "plugin-review:edit": "ਆਪਣੀ ਸਮੀਖਿਆ ਸੋਧੋ", + "plugin-review:add": "ਸਮੀਖਿਆ ਸ਼ਾਮਲ ਕਰੋ...", + "plugin-review:placeholder": "ਆਪਣਾ ਅਨੁਭਵ ਸਾਂਝਾ ਕਰੋ...", + "plugin-review:input-label": "ਪਲੱਗਇਨ ਸਮੀਖਿਆ", + "plugin-review:vote-group-label": "ਵੋਟ", + "plugin-review:thumbs-up": "ਪਸੰਦ", + "plugin-review:thumbs-down": "ਨਾਪਸੰਦ", + "plugin-review:delete": "ਸਮੀਖਿਆ ਮਿਟਾਓ", + "plugin-review:load-failed": "ਸਮੀਖਿਆਵਾਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ।", + "plugin-review:retry": "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ", + "plugin-review:empty-title": "ਹਾਲੇ ਕੋਈ ਸਮੀਖਿਆ ਨਹੀਂ", + "plugin-review:empty-description": "ਆਪਣਾ ਅਨੁਭਵ ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਪਹਿਲੇ ਵਿਅਕਤੀ ਬਣੋ।", + "plugin-review:yours": "ਤੁਹਾਡੀ ਸਮੀਖਿਆ", + "plugin-review:community": "ਭਾਈਚਾਰੇ ਦੀਆਂ ਸਮੀਖਿਆਵਾਂ", + "plugin-review:no-other-reviews": "ਹਾਲੇ ਹੋਰ ਕੋਈ ਸਮੀਖਿਆ ਨਹੀਂ।", + "plugin-review:login-incomplete": "ਸਾਈਨ ਇਨ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ।", + "plugin-review:sign-in-failed": "ਸਾਈਨ ਇਨ ਨਹੀਂ ਹੋ ਸਕਿਆ।", + "plugin-review:session-expired-review": "ਤੁਹਾਡਾ ਸੈਸ਼ਨ ਖਤਮ ਹੋ ਗਿਆ। ਸਮੀਖਿਆ ਦੇਣ ਲਈ ਦੁਬਾਰਾ ਸਾਈਨ ਇਨ ਕਰੋ।", + "plugin-review:save-failed": "ਸਮੀਖਿਆ ਸੰਭਾਲੀ ਨਹੀਂ ਜਾ ਸਕੀ।", + "plugin-review:delete-confirmation": "ਆਪਣੀ ਸਮੀਖਿਆ ਮਿਟਾਉਣੀ ਹੈ? ਇਹ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।", + "plugin-review:session-expired-continue": "ਤੁਹਾਡਾ ਸੈਸ਼ਨ ਖਤਮ ਹੋ ਗਿਆ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਦੁਬਾਰਾ ਸਾਈਨ ਇਨ ਕਰੋ।", + "plugin-review:delete-failed": "ਸਮੀਖਿਆ ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।", + "plugin-review:you": "ਤੁਸੀਂ", + "plugin-review:edit-action": "ਸਮੀਖਿਆ ਸੋਧੋ", + "plugin-review:recommended": "ਇਸ ਪਲੱਗਇਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ", + "plugin-review:error-max-length": "ਸਮੀਖਿਆ {max} ਅੱਖਰਾਂ ਜਾਂ ਇਸ ਤੋਂ ਘੱਟ ਦੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।", + "plugin-review:error-downvote-comment": "ਡਿਵੈਲਪਰ ਨੂੰ ਦੱਸੋ ਕਿ ਕੀ ਸੁਧਾਰਿਆ ਜਾ ਸਕਦਾ ਹੈ।", + "plugin-review:error-empty": "ਟਿੱਪਣੀ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਪਸੰਦ ਚੁਣੋ।", + "plugin-review:unrated": "ਹਾਲੇ ਮੁਲਾਂਕਣ ਨਹੀਂ" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 3fa063c1db..0453983187 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Посмотреть рекламу с вознаграждением, чтобы применить этот значок приложения?", "rewarded ad unavailable": "Реклама с вознаграждением сейчас недоступна. Повторите попытку.", "rewarded ad failed": "Не удалось завершить просмотр рекламы. Повторите попытку.", - "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду." + "rewarded ad incomplete": "Досмотрите рекламу до конца, чтобы получить награду.", + "plugin-review:dialog-label": "Отзывы о плагине", + "plugin-review:account-check-failed": "Не удалось проверить вашу учётную запись. Повторите попытку.", + "plugin-review:sign-in": "Войти, чтобы оставить отзыв", + "plugin-review:edit": "Редактировать свой отзыв", + "plugin-review:add": "Добавить отзыв…", + "plugin-review:placeholder": "Поделитесь своим опытом…", + "plugin-review:input-label": "Отзыв о плагине", + "plugin-review:vote-group-label": "Оценка", + "plugin-review:thumbs-up": "Нравится", + "plugin-review:thumbs-down": "Не нравится", + "plugin-review:delete": "Удалить отзыв", + "plugin-review:load-failed": "Не удалось загрузить отзывы.", + "plugin-review:retry": "Повторить", + "plugin-review:empty-title": "Отзывов пока нет", + "plugin-review:empty-description": "Станьте первым, кто поделится своим опытом.", + "plugin-review:yours": "Ваш отзыв", + "plugin-review:community": "Отзывы сообщества", + "plugin-review:no-other-reviews": "Других отзывов пока нет.", + "plugin-review:login-incomplete": "Вход не был завершён.", + "plugin-review:sign-in-failed": "Не удалось войти.", + "plugin-review:session-expired-review": "Сеанс истёк. Войдите снова, чтобы оставить отзыв.", + "plugin-review:save-failed": "Не удалось сохранить отзыв.", + "plugin-review:delete-confirmation": "Удалить ваш отзыв? Это действие нельзя отменить.", + "plugin-review:session-expired-continue": "Сеанс истёк. Войдите снова, чтобы продолжить.", + "plugin-review:delete-failed": "Не удалось удалить отзыв.", + "plugin-review:you": "Вы", + "plugin-review:edit-action": "Редактировать отзыв", + "plugin-review:recommended": "Рекомендует этот плагин", + "plugin-review:error-max-length": "Отзыв должен содержать не более {max} символов.", + "plugin-review:error-downvote-comment": "Расскажите разработчику, что можно улучшить.", + "plugin-review:error-empty": "Добавьте комментарий или выберите «Нравится».", + "plugin-review:unrated": "Нет оценок" } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 2d9d72f94c..3342744dec 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Tapusin ang panonood ng ad upang makuha ang gantimpala.", + "plugin-review:dialog-label": "Mga review ng plugin", + "plugin-review:account-check-failed": "Hindi masuri ang iyong account. Subukan muli.", + "plugin-review:sign-in": "Mag-sign in para mag-review", + "plugin-review:edit": "I-edit ang iyong review", + "plugin-review:add": "Magdagdag ng review...", + "plugin-review:placeholder": "Ibahagi ang iyong karanasan...", + "plugin-review:input-label": "Review ng plugin", + "plugin-review:vote-group-label": "Boto", + "plugin-review:thumbs-up": "Gusto", + "plugin-review:thumbs-down": "Hindi gusto", + "plugin-review:delete": "I-delete ang review", + "plugin-review:load-failed": "Hindi ma-load ang mga review.", + "plugin-review:retry": "Subukan muli", + "plugin-review:empty-title": "Wala pang review", + "plugin-review:empty-description": "Mauna sa pagbabahagi ng iyong karanasan.", + "plugin-review:yours": "Iyong review", + "plugin-review:community": "Mga review ng komunidad", + "plugin-review:no-other-reviews": "Wala pang ibang review.", + "plugin-review:login-incomplete": "Hindi natapos ang pag-sign in.", + "plugin-review:sign-in-failed": "Hindi makapag-sign in.", + "plugin-review:session-expired-review": "Nag-expire ang iyong session. Mag-sign in muli para mag-review.", + "plugin-review:save-failed": "Hindi mai-save ang review.", + "plugin-review:delete-confirmation": "I-delete ang iyong review? Hindi na ito maibabalik.", + "plugin-review:session-expired-continue": "Nag-expire ang iyong session. Mag-sign in muli para magpatuloy.", + "plugin-review:delete-failed": "Hindi ma-delete ang review.", + "plugin-review:you": "Ikaw", + "plugin-review:edit-action": "I-edit ang review", + "plugin-review:recommended": "Inirerekomenda ang plugin na ito", + "plugin-review:error-max-length": "Dapat {max} character o mas kaunti ang review.", + "plugin-review:error-downvote-comment": "Sabihin sa developer kung ano ang maaaring mapabuti.", + "plugin-review:error-empty": "Magdagdag ng komento o piliin ang Gusto.", + "plugin-review:unrated": "Walang rating" } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index 407ca5a8dc..68bc5dafb7 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Ödülü kazanmak için reklamı sonuna kadar izleyin.", + "plugin-review:dialog-label": "Eklenti değerlendirmeleri", + "plugin-review:account-check-failed": "Hesabınız kontrol edilemedi. Tekrar deneyin.", + "plugin-review:sign-in": "Değerlendirmek için oturum açın", + "plugin-review:edit": "Değerlendirmenizi düzenleyin", + "plugin-review:add": "Değerlendirme ekleyin...", + "plugin-review:placeholder": "Deneyiminizi paylaşın...", + "plugin-review:input-label": "Eklenti değerlendirmesi", + "plugin-review:vote-group-label": "Oy", + "plugin-review:thumbs-up": "Beğendim", + "plugin-review:thumbs-down": "Beğenmedim", + "plugin-review:delete": "Değerlendirmeyi sil", + "plugin-review:load-failed": "Değerlendirmeler yüklenemedi.", + "plugin-review:retry": "Tekrar dene", + "plugin-review:empty-title": "Henüz değerlendirme yok", + "plugin-review:empty-description": "Deneyiminizi ilk paylaşan siz olun.", + "plugin-review:yours": "Değerlendirmeniz", + "plugin-review:community": "Topluluk değerlendirmeleri", + "plugin-review:no-other-reviews": "Henüz başka değerlendirme yok.", + "plugin-review:login-incomplete": "Oturum açma tamamlanmadı.", + "plugin-review:sign-in-failed": "Oturum açılamadı.", + "plugin-review:session-expired-review": "Oturumunuzun süresi doldu. Değerlendirmek için tekrar oturum açın.", + "plugin-review:save-failed": "Değerlendirme kaydedilemedi.", + "plugin-review:delete-confirmation": "Değerlendirmeniz silinsin mi? Bu işlem geri alınamaz.", + "plugin-review:session-expired-continue": "Oturumunuzun süresi doldu. Devam etmek için tekrar oturum açın.", + "plugin-review:delete-failed": "Değerlendirme silinemedi.", + "plugin-review:you": "Siz", + "plugin-review:edit-action": "Değerlendirmeyi düzenle", + "plugin-review:recommended": "Bu eklentiyi önerdi", + "plugin-review:error-max-length": "Değerlendirme en fazla {max} karakter olmalıdır.", + "plugin-review:error-downvote-comment": "Geliştiriciye nelerin iyileştirilebileceğini söyleyin.", + "plugin-review:error-empty": "Yorum ekleyin veya Beğendim’i seçin.", + "plugin-review:unrated": "Değerlendirilmedi" } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index d4817eb12a..062101b415 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -842,5 +842,37 @@ "confirm app icon reward": "Переглянути рекламу з винагородою, щоб застосувати цю піктограму застосунку?", "rewarded ad unavailable": "Реклама з винагородою зараз недоступна. Спробуйте ще раз.", "rewarded ad failed": "Не вдалося завершити перегляд реклами. Спробуйте ще раз.", - "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду." + "rewarded ad incomplete": "Додивіться рекламу до кінця, щоб отримати винагороду.", + "plugin-review:dialog-label": "Відгуки про плагін", + "plugin-review:account-check-failed": "Не вдалося перевірити ваш обліковий запис. Спробуйте ще раз.", + "plugin-review:sign-in": "Увійти, щоб залишити відгук", + "plugin-review:edit": "Редагувати свій відгук", + "plugin-review:add": "Додати відгук…", + "plugin-review:placeholder": "Поділіться своїм досвідом…", + "plugin-review:input-label": "Відгук про плагін", + "plugin-review:vote-group-label": "Оцінка", + "plugin-review:thumbs-up": "Подобається", + "plugin-review:thumbs-down": "Не подобається", + "plugin-review:delete": "Видалити відгук", + "plugin-review:load-failed": "Не вдалося завантажити відгуки.", + "plugin-review:retry": "Спробувати ще раз", + "plugin-review:empty-title": "Відгуків ще немає", + "plugin-review:empty-description": "Поділіться своїм досвідом першими.", + "plugin-review:yours": "Ваш відгук", + "plugin-review:community": "Відгуки спільноти", + "plugin-review:no-other-reviews": "Інших відгуків ще немає.", + "plugin-review:login-incomplete": "Вхід не було завершено.", + "plugin-review:sign-in-failed": "Не вдалося ввійти.", + "plugin-review:session-expired-review": "Сеанс завершився. Увійдіть знову, щоб залишити відгук.", + "plugin-review:save-failed": "Не вдалося зберегти відгук.", + "plugin-review:delete-confirmation": "Видалити ваш відгук? Цю дію не можна скасувати.", + "plugin-review:session-expired-continue": "Сеанс завершився. Увійдіть знову, щоб продовжити.", + "plugin-review:delete-failed": "Не вдалося видалити відгук.", + "plugin-review:you": "Ви", + "plugin-review:edit-action": "Редагувати відгук", + "plugin-review:recommended": "Рекомендує цей плагін", + "plugin-review:error-max-length": "Відгук має містити не більше {max} символів.", + "plugin-review:error-downvote-comment": "Розкажіть розробнику, що можна покращити.", + "plugin-review:error-empty": "Додайте коментар або виберіть «Подобається».", + "plugin-review:unrated": "Без оцінки" } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index da3c2725e4..9b284ee11b 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Mukofotni olish uchun reklamani oxirigacha tomosha qiling.", + "plugin-review:dialog-label": "Plagin sharhlari", + "plugin-review:account-check-failed": "Hisobingizni tekshirib bo‘lmadi. Qayta urinib ko‘ring.", + "plugin-review:sign-in": "Sharh qoldirish uchun kiring", + "plugin-review:edit": "Sharhingizni tahrirlash", + "plugin-review:add": "Sharh qo‘shish...", + "plugin-review:placeholder": "Tajribangizni ulashing...", + "plugin-review:input-label": "Plagin sharhi", + "plugin-review:vote-group-label": "Ovoz", + "plugin-review:thumbs-up": "Yoqdi", + "plugin-review:thumbs-down": "Yoqmadi", + "plugin-review:delete": "Sharhni o‘chirish", + "plugin-review:load-failed": "Sharhlarni yuklab bo‘lmadi.", + "plugin-review:retry": "Qayta urinish", + "plugin-review:empty-title": "Hozircha sharhlar yo‘q", + "plugin-review:empty-description": "Tajribangizni birinchi bo‘lib ulashing.", + "plugin-review:yours": "Sharhingiz", + "plugin-review:community": "Hamjamiyat sharhlari", + "plugin-review:no-other-reviews": "Hozircha boshqa sharhlar yo‘q.", + "plugin-review:login-incomplete": "Kirish yakunlanmadi.", + "plugin-review:sign-in-failed": "Tizimga kirib bo‘lmadi.", + "plugin-review:session-expired-review": "Seans muddati tugadi. Sharh qoldirish uchun qayta kiring.", + "plugin-review:save-failed": "Sharhni saqlab bo‘lmadi.", + "plugin-review:delete-confirmation": "Sharhingiz o‘chirilsinmi? Buni ortga qaytarib bo‘lmaydi.", + "plugin-review:session-expired-continue": "Seans muddati tugadi. Davom etish uchun qayta kiring.", + "plugin-review:delete-failed": "Sharhni o‘chirib bo‘lmadi.", + "plugin-review:you": "Siz", + "plugin-review:edit-action": "Sharhni tahrirlash", + "plugin-review:recommended": "Bu plaginni tavsiya qildi", + "plugin-review:error-max-length": "Sharh {max} ta yoki undan kam belgidan iborat bo‘lishi kerak.", + "plugin-review:error-downvote-comment": "Dasturchiga nimani yaxshilash mumkinligini ayting.", + "plugin-review:error-empty": "Izoh qo‘shing yoki “Yoqdi”ni tanlang.", + "plugin-review:unrated": "Baholanmagan" } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 69f567b7ac..131cb3fe91 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -842,5 +842,37 @@ "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." + "rewarded ad incomplete": "Xem hết quảng cáo để nhận phần thưởng.", + "plugin-review:dialog-label": "Đánh giá plugin", + "plugin-review:account-check-failed": "Không thể kiểm tra tài khoản của bạn. Hãy thử lại.", + "plugin-review:sign-in": "Đăng nhập để đánh giá", + "plugin-review:edit": "Chỉnh sửa đánh giá của bạn", + "plugin-review:add": "Thêm đánh giá...", + "plugin-review:placeholder": "Chia sẻ trải nghiệm của bạn...", + "plugin-review:input-label": "Đánh giá plugin", + "plugin-review:vote-group-label": "Bình chọn", + "plugin-review:thumbs-up": "Thích", + "plugin-review:thumbs-down": "Không thích", + "plugin-review:delete": "Xóa đánh giá", + "plugin-review:load-failed": "Không thể tải các đánh giá.", + "plugin-review:retry": "Thử lại", + "plugin-review:empty-title": "Chưa có đánh giá", + "plugin-review:empty-description": "Hãy là người đầu tiên chia sẻ trải nghiệm.", + "plugin-review:yours": "Đánh giá của bạn", + "plugin-review:community": "Đánh giá từ cộng đồng", + "plugin-review:no-other-reviews": "Chưa có đánh giá nào khác.", + "plugin-review:login-incomplete": "Quá trình đăng nhập chưa hoàn tất.", + "plugin-review:sign-in-failed": "Không thể đăng nhập.", + "plugin-review:session-expired-review": "Phiên của bạn đã hết hạn. Hãy đăng nhập lại để đánh giá.", + "plugin-review:save-failed": "Không thể lưu đánh giá.", + "plugin-review:delete-confirmation": "Xóa đánh giá của bạn? Bạn không thể hoàn tác thao tác này.", + "plugin-review:session-expired-continue": "Phiên của bạn đã hết hạn. Hãy đăng nhập lại để tiếp tục.", + "plugin-review:delete-failed": "Không thể xóa đánh giá.", + "plugin-review:you": "Bạn", + "plugin-review:edit-action": "Chỉnh sửa đánh giá", + "plugin-review:recommended": "Đã đề xuất plugin này", + "plugin-review:error-max-length": "Đánh giá phải có tối đa {max} ký tự.", + "plugin-review:error-downvote-comment": "Hãy cho nhà phát triển biết điều gì có thể được cải thiện.", + "plugin-review:error-empty": "Thêm bình luận hoặc chọn Thích.", + "plugin-review:unrated": "Chưa đánh giá" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index aaf2d0813f..b5eb3008b8 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -842,5 +842,37 @@ "confirm app icon reward": "观看一条激励广告以应用此应用图标?", "rewarded ad unavailable": "激励广告暂时不可用,请重试。", "rewarded ad failed": "广告未能完成,请重试。", - "rewarded ad incomplete": "请完整观看广告以获得奖励。" + "rewarded ad incomplete": "请完整观看广告以获得奖励。", + "plugin-review:dialog-label": "插件评价", + "plugin-review:account-check-failed": "无法检查你的账户,请重试。", + "plugin-review:sign-in": "登录后评价", + "plugin-review:edit": "编辑你的评价", + "plugin-review:add": "添加评价…", + "plugin-review:placeholder": "分享你的使用体验…", + "plugin-review:input-label": "插件评价", + "plugin-review:vote-group-label": "投票", + "plugin-review:thumbs-up": "赞", + "plugin-review:thumbs-down": "踩", + "plugin-review:delete": "删除评价", + "plugin-review:load-failed": "无法加载评价。", + "plugin-review:retry": "重试", + "plugin-review:empty-title": "暂无评价", + "plugin-review:empty-description": "成为第一个分享使用体验的人。", + "plugin-review:yours": "你的评价", + "plugin-review:community": "社区评价", + "plugin-review:no-other-reviews": "暂无其他评价。", + "plugin-review:login-incomplete": "登录未完成。", + "plugin-review:sign-in-failed": "无法登录。", + "plugin-review:session-expired-review": "会话已过期,请重新登录后评价。", + "plugin-review:save-failed": "无法保存评价。", + "plugin-review:delete-confirmation": "要删除你的评价吗?此操作无法撤销。", + "plugin-review:session-expired-continue": "会话已过期,请重新登录后继续。", + "plugin-review:delete-failed": "无法删除评价。", + "plugin-review:you": "你", + "plugin-review:edit-action": "编辑评价", + "plugin-review:recommended": "推荐了此插件", + "plugin-review:error-max-length": "评价不能超过 {max} 个字符。", + "plugin-review:error-downvote-comment": "告诉开发者哪些地方可以改进。", + "plugin-review:error-empty": "添加评论或选择“赞”。", + "plugin-review:unrated": "暂无评分" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index bf2ac76f22..5de4315970 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -842,5 +842,37 @@ "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", "rewarded ad unavailable": "獎勵廣告暫時無法使用,請再試一次。", "rewarded ad failed": "廣告未能完成,請再試一次。", - "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。", + "plugin-review:dialog-label": "外掛評論", + "plugin-review:account-check-failed": "無法檢查你的帳戶,請再試一次。", + "plugin-review:sign-in": "登入以撰寫評論", + "plugin-review:edit": "編輯你的評論", + "plugin-review:add": "新增評論…", + "plugin-review:placeholder": "分享你的使用體驗…", + "plugin-review:input-label": "外掛評論", + "plugin-review:vote-group-label": "投票", + "plugin-review:thumbs-up": "讚", + "plugin-review:thumbs-down": "倒讚", + "plugin-review:delete": "刪除評論", + "plugin-review:load-failed": "無法載入評論。", + "plugin-review:retry": "重試", + "plugin-review:empty-title": "尚無評論", + "plugin-review:empty-description": "成為第一個分享使用體驗的人。", + "plugin-review:yours": "你的評論", + "plugin-review:community": "社群評論", + "plugin-review:no-other-reviews": "尚無其他評論。", + "plugin-review:login-incomplete": "登入未完成。", + "plugin-review:sign-in-failed": "無法登入。", + "plugin-review:session-expired-review": "工作階段已過期,請重新登入以撰寫評論。", + "plugin-review:save-failed": "無法儲存評論。", + "plugin-review:delete-confirmation": "要刪除你的評論嗎?此操作無法復原。", + "plugin-review:session-expired-continue": "工作階段已過期,請重新登入以繼續。", + "plugin-review:delete-failed": "無法刪除評論。", + "plugin-review:you": "你", + "plugin-review:edit-action": "編輯評論", + "plugin-review:recommended": "推薦了此外掛", + "plugin-review:error-max-length": "評論不得超過 {max} 個字元。", + "plugin-review:error-downvote-comment": "告訴開發者哪些地方可以改進。", + "plugin-review:error-empty": "新增留言或選擇「讚」。", + "plugin-review:unrated": "尚未評分" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 1204930d69..1fa59224d3 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -842,5 +842,37 @@ "confirm app icon reward": "觀看一則獎勵廣告以套用此應用程式圖示?", "rewarded ad unavailable": "獎勵廣告目前無法使用,請再試一次。", "rewarded ad failed": "廣告未能完成,請再試一次。", - "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。" + "rewarded ad incomplete": "請完整觀看廣告以獲得獎勵。", + "plugin-review:dialog-label": "外掛評論", + "plugin-review:account-check-failed": "無法檢查你的帳號,請再試一次。", + "plugin-review:sign-in": "登入以撰寫評論", + "plugin-review:edit": "編輯你的評論", + "plugin-review:add": "新增評論…", + "plugin-review:placeholder": "分享你的使用心得…", + "plugin-review:input-label": "外掛評論", + "plugin-review:vote-group-label": "評分", + "plugin-review:thumbs-up": "讚", + "plugin-review:thumbs-down": "倒讚", + "plugin-review:delete": "刪除評論", + "plugin-review:load-failed": "無法載入評論。", + "plugin-review:retry": "重試", + "plugin-review:empty-title": "目前沒有評論", + "plugin-review:empty-description": "成為第一個分享使用心得的人。", + "plugin-review:yours": "你的評論", + "plugin-review:community": "社群評論", + "plugin-review:no-other-reviews": "目前沒有其他評論。", + "plugin-review:login-incomplete": "登入未完成。", + "plugin-review:sign-in-failed": "無法登入。", + "plugin-review:session-expired-review": "工作階段已過期,請重新登入以撰寫評論。", + "plugin-review:save-failed": "無法儲存評論。", + "plugin-review:delete-confirmation": "要刪除你的評論嗎?此動作無法復原。", + "plugin-review:session-expired-continue": "工作階段已過期,請重新登入以繼續。", + "plugin-review:delete-failed": "無法刪除評論。", + "plugin-review:you": "你", + "plugin-review:edit-action": "編輯評論", + "plugin-review:recommended": "推薦這個外掛", + "plugin-review:error-max-length": "評論不得超過 {max} 個字元。", + "plugin-review:error-downvote-comment": "告訴開發者哪些地方可以改進。", + "plugin-review:error-empty": "新增留言或選擇「讚」。", + "plugin-review:unrated": "尚未評分" } diff --git a/src/lib/acode.js b/src/lib/acode.js index 6d9310d245..d5a0f2de62 100644 --- a/src/lib/acode.js +++ b/src/lib/acode.js @@ -718,7 +718,7 @@ class Acode { } get exitAppMessage() { - const numFiles = editorManager.hasUnsavedFiles(); + const numFiles = editorManager?.hasUnsavedFiles?.() ?? 0; if (numFiles) { return strings["unsaved files close app"]; } diff --git a/src/lib/adConsentCoordinator.mjs b/src/lib/adConsentCoordinator.mjs index 5a23de1737..4391e22aac 100644 --- a/src/lib/adConsentCoordinator.mjs +++ b/src/lib/adConsentCoordinator.mjs @@ -35,6 +35,7 @@ export class AdConsentCoordinator { #state = EMPTY_PRIVACY_STATE; #consentPromise; #adStartPromise; + #privacyOptionsPromise; #listeners = new Set(); constructor({ privacy, initializeAds, onError = console.error }) { @@ -51,7 +52,14 @@ export class AdConsentCoordinator { return (this.#consentPromise ??= this.#gatherAndStart()); } - async showPrivacyOptions() { + showPrivacyOptions() { + this.#privacyOptionsPromise ??= this.#showPrivacyOptions().finally(() => { + this.#privacyOptionsPromise = undefined; + }); + return this.#privacyOptionsPromise; + } + + async #showPrivacyOptions() { const state = await this.#privacy.showOptions(); this.#setState(state); await this.#startAdsIfAllowed(); diff --git a/src/lib/bannerVisibilityController.mjs b/src/lib/bannerVisibilityController.mjs index c02df5b80b..517e914d02 100644 --- a/src/lib/bannerVisibilityController.mjs +++ b/src/lib/bannerVisibilityController.mjs @@ -10,6 +10,9 @@ export const BANNER_SUPPRESSION_REASON = Object.freeze({ REWARDED_PASS: "rewarded-pass", }); +const DEFAULT_RETRY_DELAY_MS = 500; +const TRANSIENT_LOAD_ERROR_CODES = new Set([0, 2, 3, 9]); + export class BannerVisibilityController { #banner = null; #registeredPages = new WeakSet(); @@ -20,9 +23,13 @@ export class BannerVisibilityController { #suppressions = new Set(); #nativeVisible = false; #scheduledVisible = false; + #desiredVisible = false; #operation = Promise.resolve(); #revision = 0; #onError; + #retryTimer = null; + #retryUsed = false; + #stopBannerListeners = []; constructor({ getActivePage, @@ -35,9 +42,13 @@ export class BannerVisibilityController { } setBanner(banner) { + this.#stopListeningToBanner(); + this.#resetRetry(); + this.#revision++; this.#banner = banner; this.#nativeVisible = false; this.#scheduledVisible = false; + this.#listenToBanner(banner); this.reconcile(); } @@ -83,6 +94,12 @@ export class BannerVisibilityController { activePage !== null && this.#registeredPages.has(activePage); const shouldShow = pageRequestsBanner && !this.#keyboardVisible; + const eligibilityChanged = shouldShow !== this.#desiredVisible; + this.#desiredVisible = shouldShow; + + if (!shouldShow || eligibilityChanged) { + this.#resetRetry(); + } if (this.#banner) { this.#banner.active = pageRequestsBanner; @@ -98,7 +115,12 @@ export class BannerVisibilityController { dispose() { this.#stopObserving?.(); this.#stopObserving = null; + this.#stopListeningToBanner(); + this.#resetRetry(); this.#banner = null; + this.#desiredVisible = false; + this.#nativeVisible = false; + this.#scheduledVisible = false; this.#revision++; } @@ -107,9 +129,16 @@ export class BannerVisibilityController { this.#stopObserving = this.#observePageChanges(() => this.reconcile()); } - #queueNativeVisibility(shouldShow) { + #queueNativeVisibility(shouldShow, isRetry = false) { const banner = this.#banner; - if (!banner || shouldShow === this.#scheduledVisible) return; + if ( + !banner || + shouldShow === this.#scheduledVisible || + (shouldShow && + (this.#retryTimer !== null || (this.#retryUsed && !isRetry))) + ) { + return; + } this.#scheduledVisible = shouldShow; const revision = ++this.#revision; @@ -124,14 +153,80 @@ export class BannerVisibilityController { } else { await banner.hide?.(); } + if (revision !== this.#revision || banner !== this.#banner) return; this.#nativeVisible = shouldShow; } catch (error) { + if (revision !== this.#revision || banner !== this.#banner) return; this.#nativeVisible = !shouldShow; this.#scheduledVisible = !shouldShow; this.#onError(error); + if (shouldShow) this.#scheduleRetry(); } }); } + + #listenToBanner(banner) { + if (typeof banner?.on !== "function") return; + + for (const [eventName, listener] of [ + ["load", () => this.#handleBannerLoad()], + ["loadfail", (event) => this.#handleBannerLoadFailure(event)], + ]) { + const stopListening = banner.on(eventName, listener); + if (typeof stopListening === "function") { + this.#stopBannerListeners.push(stopListening); + } + } + } + + #stopListeningToBanner() { + for (const stopListening of this.#stopBannerListeners.splice(0)) { + stopListening(); + } + } + + #handleBannerLoad() { + this.#resetRetry(); + if (!this.#desiredVisible) return; + + this.#nativeVisible = true; + this.#scheduledVisible = true; + } + + #handleBannerLoadFailure(event) { + this.#nativeVisible = false; + this.#scheduledVisible = false; + this.#onError(event); + + const errorCode = Number(event?.code); + if (TRANSIENT_LOAD_ERROR_CODES.has(errorCode)) { + this.#scheduleRetry(); + } else { + this.#retryUsed = true; + } + } + + #scheduleRetry() { + if (!this.#desiredVisible || this.#retryTimer !== null || this.#retryUsed) { + return; + } + + this.#retryUsed = true; + const banner = this.#banner; + this.#retryTimer = setTimeout(() => { + this.#retryTimer = null; + if (!this.#desiredVisible || banner !== this.#banner) return; + this.#queueNativeVisibility(true, true); + }, DEFAULT_RETRY_DELAY_MS); + } + + #resetRetry() { + if (this.#retryTimer !== null) { + clearTimeout(this.#retryTimer); + this.#retryTimer = null; + } + this.#retryUsed = false; + } } function getActivePage() { diff --git a/src/lib/console.js b/src/lib/console.js index 3e10948585..35a32cb2b9 100644 --- a/src/lib/console.js +++ b/src/lib/console.js @@ -1,24 +1,112 @@ import "core-js/stable"; import "html-tag-js/dist/polyfill"; import { parse } from "acorn"; +import { VariableVirtualList } from "components/virtualList"; import css from "styles/console.m.scss"; import loadPolyFill from "utils/polyfill"; +import ConsoleExecutor, { + applyConsoleViewport, + executeConsoleCommand, + executeConsoleScript, + resolveConsoleExecutionContext, +} from "./consoleRuntime"; (function () { loadPolyFill.apply(window); let consoleVisible = false; + let isFocused = false; + let isExecuting = false; + let viewportFrame = null; + let viewportObserver = null; + let themeSyncTimer = null; + let themeSyncPending = false; + let themeSignature = null; + const isStandaloneConsole = sessionStorage.getItem("__mode") === "console"; + const themeEndpoint = document.querySelector( + 'meta[name="acode-console-theme-endpoint"]', + )?.content; + const startupScriptUrl = document.querySelector( + 'meta[name="acode-console-executing-script"]', + )?.content; const originalConsole = console; const $input = tag("textarea", { id: "__c-input", + attr: { + rows: "1", + placeholder: "Run JavaScript…", + "aria-label": "JavaScript console input", + spellcheck: "false", + autocomplete: "off", + autocapitalize: "off", + }, + oninput: resizeInput, + onfocus() { + isFocused = true; + virtualMessages.scrollToBottom(); + }, onblur() { setTimeout(() => { isFocused = false; }, 0); }, }); + const $stopExecution = tag("button", { + className: "__c-action __c-action-danger", + textContent: "Stop", + attr: { + type: "button", + "aria-label": "Stop JavaScript execution", + }, + onclick() { + executor.cancel(); + }, + }); + $stopExecution.hidden = true; + const $executionContext = tag("select", { + className: "__c-context", + attr: { + "aria-label": "JavaScript execution context", + title: "Choose isolated Worker execution or live page access", + }, + children: [ + tag("option", { + textContent: "Worker", + attr: { value: "worker" }, + }), + tag("option", { + textContent: "Page (unsafe)", + attr: { value: "page" }, + }), + ], + onchange() { + if (this.value !== "page") return; + log( + "warn", + {}, + "Page mode can access window and document, but it runs on the preview thread and cannot stop infinite code.", + ); + }, + }); + const $output = tag("c-output", { + attr: { + role: "region", + "aria-label": "JavaScript console", + }, + }); const $inputContainer = tag("c-input", { - child: $input, + children: [ + $input, + tag("c-input-actions", { + children: [ + ...(isStandaloneConsole ? [] : [$executionContext]), + $stopExecution, + ], + }), + ], + }); + const virtualMessages = new VariableVirtualList($output, { + footer: $inputContainer, }); const $toggler = tag("c-toggler", { style: { @@ -46,9 +134,13 @@ import loadPolyFill from "utils/polyfill"; }, }); const $console = tag("c-console", { - child: $inputContainer, + child: $output, + attr: { + role: "dialog", + "aria-label": "JavaScript console", + }, onclick(e) { - const el = e.target; + const el = e.target.closest?.("[action]") || e.target; const action = el.getAttribute("action"); switch (action) { @@ -64,9 +156,26 @@ import loadPolyFill from "utils/polyfill"; } }, }); + if (isStandaloneConsole) { + $console.setAttribute("standalone", ""); + document.documentElement.setAttribute("console-only", ""); + startThemeSync(); + window.addEventListener("pagehide", stopThemeSync, { + once: true, + }); + } const counter = {}; const timers = {}; - let isFocused = false; + const executor = new ConsoleExecutor({ + workerUrl: window.__consoleWorkerScript || "build/consoleWorker.js", + onConsole(message) { + if (message.action === "clear") { + window.console.clear(); + return; + } + log(message.level, {}, ...message.args); + }, + }); if (!window.__objs) window.__objs = {}; @@ -77,18 +186,76 @@ import loadPolyFill from "utils/polyfill"; window.addEventListener("error", onError); assignCustomConsole(); - if (sessionStorage.getItem("__mode") === "console") { + if (isStandaloneConsole) { showConsole(); + void runStartupScript(); return; } tag.get("html").append($toggler); - $console.setAttribute("title", "Console"); sessionStorage.setItem("__console_available", true); document.addEventListener("showconsole", showConsole); document.addEventListener("hideconsole", hideConsole); } + function startThemeSync() { + if (!themeEndpoint || themeSyncTimer !== null) return; + void syncTheme(); + themeSyncTimer = setInterval(syncTheme, 1000); + } + + function stopThemeSync() { + if (themeSyncTimer === null) return; + clearInterval(themeSyncTimer); + themeSyncTimer = null; + } + + async function runStartupScript() { + if (!startupScriptUrl) return; + + setExecutionState(true); + const result = await executeConsoleScript({ + scriptUrl: startupScriptUrl, + workerExecutor: executor, + }); + setExecutionState(false); + + if (result?.type === "error") { + log("error", getStack(new Error()), result.value); + } + } + + async function syncTheme() { + if (themeSyncPending) return; + themeSyncPending = true; + + try { + const response = await fetch(themeEndpoint, { cache: "no-store" }); + if (!response.ok) return; + const snapshot = await response.json(); + if (typeof snapshot.css !== "string") return; + + const signature = JSON.stringify([snapshot.type, snapshot.css]); + if (signature === themeSignature) return; + + let $theme = document.getElementById("console-live-theme"); + if (!$theme) { + $theme = tag("style", { id: "console-live-theme" }); + document.head.append($theme); + } + $theme.textContent = snapshot.css; + document.documentElement.setAttribute( + "theme-type", + snapshot.type === "light" ? "light" : "dark", + ); + themeSignature = signature; + } catch { + // Keep the last valid theme if the local endpoint is briefly unavailable. + } finally { + themeSyncPending = false; + } + } + function touchmove(e) { e.preventDefault(); $toggler.style.transform = "translate(" @@ -105,10 +272,7 @@ import loadPolyFill from "utils/polyfill"; } }, clear() { - originalConsole.clear(); - if (isFocused) $input.focus(); - $console.textContent = ""; - $console.appendChild($inputContainer); + clearConsole(); }, count(hash = "default") { originalConsole.count(hash); @@ -207,35 +371,104 @@ import loadPolyFill from "utils/polyfill"; function showConsole() { tag.get("html").append($console); $input.addEventListener("keydown", onCodeInput); + if (!isStandaloneConsole) { + bindViewportListeners(); + updateConsoleViewport(); + } + virtualMessages.invalidate(); } function hideConsole() { $console.remove(); $input.removeEventListener("keydown", onCodeInput); + unbindViewportListeners(); + } + + function bindViewportListeners() { + window.addEventListener("resize", updateConsoleViewport); + window.visualViewport?.addEventListener("resize", updateConsoleViewport); + window.visualViewport?.addEventListener("scroll", updateConsoleViewport); + if (typeof ResizeObserver === "function") { + viewportObserver = new ResizeObserver(updateConsoleViewport); + viewportObserver.observe(document.documentElement); + } + } + + function unbindViewportListeners() { + window.removeEventListener("resize", updateConsoleViewport); + window.visualViewport?.removeEventListener("resize", updateConsoleViewport); + window.visualViewport?.removeEventListener("scroll", updateConsoleViewport); + viewportObserver?.disconnect(); + viewportObserver = null; + if (viewportFrame !== null) cancelAnimationFrame(viewportFrame); + viewportFrame = null; + } + + function updateConsoleViewport() { + if (viewportFrame !== null) cancelAnimationFrame(viewportFrame); + viewportFrame = requestAnimationFrame(() => { + viewportFrame = null; + applyConsoleViewport($console); + virtualMessages.invalidate(); + }); } function onCodeInput(e) { - const key = e.key; isFocused = true; - if (key === "Enter") { - const regex = /[\[|{\(\)\}\]]/g; - let code = this.value.trim(); - let isOdd = (code.length - code.replace(regex, "").length) % 2; - - if (!code || isOdd) return; - e.preventDefault(); - e.stopPropagation(); - e.stopImmediatePropagation(); - - log("code", {}, code); - $input.value = ""; - const res = execute(code); - if (res.type === "error") { - log("error", getStack(new Error()), res.value); - } else { - log("log", getStack(new Error()), res.value); - } + if (e.key !== "Enter" || e.shiftKey) return; + + const code = $input.value.trim(); + const brackets = /[\[|{\(\)\}\]]/g; + const isIncomplete = + (code.length - code.replace(brackets, "").length) % 2 !== 0; + if (!code || isIncomplete) return; + + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + runInputCode(); + } + + async function runInputCode() { + const code = $input.value.trim(); + if (!code) return; + if (isExecuting) { + log("warn", {}, "Another console command is still running."); + return; } + + log("code", {}, code); + $input.value = ""; + resizeInput(); + setExecutionState(true); + const res = await executeCommand(code); + setExecutionState(false); + + if (res.type === "error") { + log("error", getStack(new Error()), res.value); + } else { + log("log", getStack(new Error()), res.value); + } + $input.focus(); + } + + function setExecutionState(running) { + isExecuting = running; + $console.toggleAttribute("running", running); + $stopExecution.hidden = !running || $executionContext.value !== "worker"; + $input.disabled = running; + $executionContext.disabled = running; + } + + function resizeInput() { + $input.style.height = "0px"; + $input.style.height = `${Math.min(120, Math.max(38, $input.scrollHeight))}px`; + } + + function clearConsole() { + originalConsole.clear(); + virtualMessages.clear(); + if (isFocused) $input.focus(); } function getBody(obj, ...keys) { @@ -454,7 +687,7 @@ import loadPolyFill from "utils/polyfill"; let $msg; if (mode === "code") { $msg = tag("c-code"); - $msg.textContent = arg.length > 50 ? arg.substring(0, 50) + "..." : arg; + $msg.textContent = arg; $msg.setAttribute("data-code", arg); $msg.setAttribute("action", "use code"); } else { @@ -486,11 +719,7 @@ import loadPolyFill from "utils/polyfill"; $messages.appendChild($stack); } - $console.insertBefore($messages, $inputContainer); - - while ($console.childElementCount > 100) { - $console.firstElementChild.remove(); - } + virtualMessages.append($messages); } /** @@ -634,6 +863,18 @@ import loadPolyFill from "utils/polyfill"; }; } + function executeCommand(code) { + return executeConsoleCommand({ + context: resolveConsoleExecutionContext( + isStandaloneConsole, + $executionContext.value, + ), + code, + workerExecutor: executor, + pageExecutor: execute, + }); + } + function execute(code) { let res = null; try { diff --git a/src/lib/consoleRuntime.js b/src/lib/consoleRuntime.js new file mode 100644 index 0000000000..5e45e25236 --- /dev/null +++ b/src/lib/consoleRuntime.js @@ -0,0 +1,217 @@ +export const DEFAULT_CONSOLE_TIMEOUT = 30000; + +/** + * Runs console commands in a worker so user code can never block the page UI. + */ +export default class ConsoleExecutor { + constructor({ + workerUrl, + timeout = DEFAULT_CONSOLE_TIMEOUT, + onConsole = () => {}, + WorkerClass = globalThis.Worker, + } = {}) { + this.workerUrl = workerUrl; + this.timeout = timeout; + this.onConsole = onConsole; + this.WorkerClass = WorkerClass; + this.worker = null; + this.pending = null; + this.nextId = 0; + } + + execute(code) { + if (this.pending) { + return Promise.resolve({ + type: "error", + value: new Error("Another console command is still running."), + }); + } + + if (!this.WorkerClass) { + return Promise.resolve({ + type: "error", + value: new Error( + "This WebView does not support isolated console execution.", + ), + }); + } + + let worker; + try { + worker = this.getWorker(); + } catch (error) { + return Promise.resolve({ type: "error", value: error }); + } + const id = ++this.nextId; + + return new Promise((resolve) => { + const timer = setTimeout(() => { + this.finish(id, { + type: "error", + value: new Error( + `Execution stopped after ${this.timeout / 1000} seconds.`, + ), + }); + this.resetWorker(); + }, this.timeout); + + this.pending = { id, resolve, timer }; + try { + worker.postMessage({ id, code }); + } catch (error) { + this.finish(id, { type: "error", value: error }); + this.resetWorker(); + } + }); + } + + getWorker() { + if (this.worker) return this.worker; + + const worker = new this.WorkerClass(this.workerUrl); + worker.onmessage = ({ data }) => this.handleMessage(data); + worker.onerror = (event) => { + const error = new Error(event.message || "Console worker failed."); + this.finish(this.pending?.id, { type: "error", value: error }); + this.resetWorker(); + }; + this.worker = worker; + return worker; + } + + handleMessage(message) { + if (message.type === "console") { + this.onConsole(message); + return; + } + + if (message.type === "result") { + this.finish(message.id, { type: "result", value: message.value }); + return; + } + + if (message.type === "error") { + const error = new Error( + message.error?.message || "Console command failed.", + ); + error.name = message.error?.name || "Error"; + if (message.error?.stack) error.stack = message.error.stack; + this.finish(message.id, { type: "error", value: error }); + } + } + + finish(id, result) { + if (!this.pending || this.pending.id !== id) return; + + const { resolve, timer } = this.pending; + this.pending = null; + clearTimeout(timer); + resolve(result); + } + + resetWorker() { + this.worker?.terminate(); + this.worker = null; + } + + cancel() { + if (!this.pending) return false; + + this.finish(this.pending.id, { + type: "error", + value: new Error("Execution stopped."), + }); + this.resetWorker(); + return true; + } + + destroy() { + if (this.pending) { + this.finish(this.pending.id, { + type: "error", + value: new Error("Console execution was cancelled."), + }); + } + this.resetWorker(); + } +} + +/** + * Returns the actually visible browser rectangle. On mobile this shrinks with + * the software keyboard even when the layout viewport remains full height. + */ +export function getConsoleViewportRect(windowObject = window) { + const viewport = windowObject.visualViewport; + const documentHeight = windowObject.document?.documentElement?.clientHeight; + const visibleHeights = [ + viewport?.height, + windowObject.innerHeight, + documentHeight, + ].filter((height) => Number.isFinite(height) && height > 0); + return { + height: Math.round(Math.min(...visibleHeights)), + width: Math.round(viewport?.width || windowObject.innerWidth), + top: Math.round(viewport?.offsetTop || 0), + left: Math.round(viewport?.offsetLeft || 0), + }; +} + +export function applyConsoleViewport(element, windowObject = window) { + const { height, width, top, left } = getConsoleViewportRect(windowObject); + element.style.setProperty("--console-viewport-height", `${height}px`); + element.style.setProperty("--console-viewport-width", `${width}px`); + element.style.setProperty("--console-viewport-top", `${top}px`); + element.style.setProperty("--console-viewport-left", `${left}px`); +} + +export function resolveConsoleExecutionContext( + isStandaloneConsole, + selectedContext, +) { + return isStandaloneConsole ? "worker" : selectedContext; +} + +/** + * Routes a console command to the isolated worker or the live preview page. + * Page execution is deliberately opt-in because it runs on the preview thread. + */ +export function executeConsoleCommand({ + context, + code, + workerExecutor, + pageExecutor, +}) { + if (context === "page") return Promise.resolve(pageExecutor(code)); + return workerExecutor.execute(code); +} + +/** + * Loads a standalone JavaScript file and executes it in the isolated console + * worker. The file is fetched first so it is never inserted as a page script. + */ +export async function executeConsoleScript({ + scriptUrl, + workerExecutor, + fetchScript = globalThis.fetch, +}) { + if (!scriptUrl) return null; + + try { + if (typeof fetchScript !== "function") { + throw new Error("This WebView cannot load the JavaScript file."); + } + + const response = await fetchScript(scriptUrl, { cache: "no-store" }); + if (!response.ok) { + const status = response.status ? ` (${response.status})` : ""; + throw new Error(`Failed to load JavaScript file${status}.`); + } + + return workerExecutor.execute(await response.text()); + } catch (error) { + return { + type: "error", + value: error instanceof Error ? error : new Error(String(error)), + }; + } +} diff --git a/src/lib/consoleWorker.js b/src/lib/consoleWorker.js new file mode 100644 index 0000000000..c5d911fe8c --- /dev/null +++ b/src/lib/consoleWorker.js @@ -0,0 +1,168 @@ +const MAX_MESSAGES_PER_SECOND = 100; +const MESSAGE_WINDOW_MS = 1000; +const MAX_PROPERTIES = 100; +const MAX_DEPTH = 4; +const MAX_SNAPSHOT_VALUES = 500; + +let activeCommandId = 0; +let messageWindowStartedAt = 0; +let emittedInWindow = 0; +let suppressedInWindow = 0; +const counts = new Map(); +const timers = new Map(); + +function snapshot( + value, + depth = 0, + seen = new WeakSet(), + budget = { remaining: MAX_SNAPSHOT_VALUES }, +) { + const type = typeof value; + + if ( + value === null || + ["boolean", "number", "string", "undefined"].includes(type) + ) { + return value; + } + if (type === "bigint") return `${value}n`; + if (type === "symbol") return value.toString(); + if (type === "function") + return `[Function${value.name ? `: ${value.name}` : ""}]`; + if (budget.remaining-- <= 0) return "[Truncated]"; + if (value instanceof Error) return snapshotError(value); + if (value instanceof Date) return value.toISOString(); + if (value instanceof RegExp) return value.toString(); + if (value instanceof Promise) return "Promise { }"; + if (depth >= MAX_DEPTH) return `[${value.constructor?.name || "Object"}]`; + if (seen.has(value)) return "[Circular]"; + + seen.add(value); + if (Array.isArray(value)) { + const result = value + .slice(0, MAX_PROPERTIES) + .map((item) => snapshot(item, depth + 1, seen, budget)); + if (value.length > MAX_PROPERTIES) result.push("…"); + return result; + } + + const result = {}; + let keys; + try { + keys = Reflect.ownKeys(value).slice(0, MAX_PROPERTIES); + } catch (error) { + return `[Uninspectable: ${error.message}]`; + } + + for (const key of keys) { + const outputKey = typeof key === "symbol" ? key.toString() : key; + try { + result[outputKey] = snapshot(value[key], depth + 1, seen, budget); + } catch (error) { + result[outputKey] = `[Thrown: ${error.message}]`; + } + } + if (Reflect.ownKeys(value).length > MAX_PROPERTIES) result["…"] = "…"; + return result; +} + +function snapshotError(error) { + return { + name: error?.name || "Error", + message: error?.message || String(error), + stack: error?.stack || "", + }; +} + +function discardSuppressedMessages() { + suppressedInWindow = 0; +} + +function emitMessage(message) { + const now = performance.now(); + if (now - messageWindowStartedAt >= MESSAGE_WINDOW_MS) { + discardSuppressedMessages(); + messageWindowStartedAt = now; + emittedInWindow = 0; + } + + if (emittedInWindow >= MAX_MESSAGES_PER_SECOND) { + suppressedInWindow++; + return; + } + + emittedInWindow++; + self.postMessage({ type: "console", id: activeCommandId, ...message }); +} + +function emit(level, args) { + emitMessage({ + level, + args: args.map((value) => snapshot(value)), + }); +} + +self.console = { + assert(condition, ...args) { + if (!condition) emit("error", args.length ? args : ["Assertion failed"]); + }, + clear() { + emitMessage({ action: "clear" }); + }, + count(label = "default") { + const value = (counts.get(label) || 0) + 1; + counts.set(label, value); + emit("log", [`${label}: ${value}`]); + }, + countReset(label = "default") { + counts.delete(label); + }, + debug: (...args) => emit("log", args), + dir: (...args) => emit("log", args), + dirxml: (...args) => emit("log", args), + error: (...args) => emit("error", args), + group: (...args) => emit("log", args), + groupCollapsed: (...args) => emit("log", args), + groupEnd() {}, + info: (...args) => emit("info", args), + log: (...args) => emit("log", args), + table: (...args) => emit("table", args), + time(label = "default") { + timers.set(label, performance.now()); + }, + timeEnd(label = "default") { + if (!timers.has(label)) return emit("warn", [`No such label: ${label}`]); + emit("log", [ + `${label}: ${(performance.now() - timers.get(label)).toFixed(2)}ms`, + ]); + timers.delete(label); + }, + timeLog(label = "default") { + if (!timers.has(label)) return emit("warn", [`No such label: ${label}`]); + emit("log", [ + `${label}: ${(performance.now() - timers.get(label)).toFixed(2)}ms`, + ]); + }, + trace(...args) { + emit("trace", [...args, new Error().stack]); + }, + warn: (...args) => emit("warn", args), +}; + +self.onmessage = ({ data: { id, code } }) => { + activeCommandId = id; + messageWindowStartedAt = performance.now(); + emittedInWindow = 0; + suppressedInWindow = 0; + + try { + // Intentional: this local REPL runs the command in its isolated worker. + // codeql[js/code-injection] + const value = (0, eval)(code); + discardSuppressedMessages(); + self.postMessage({ type: "result", id, value: snapshot(value) }); + } catch (error) { + discardSuppressedMessages(); + self.postMessage({ type: "error", id, error: snapshotError(error) }); + } +}; diff --git a/src/lib/editorFile.js b/src/lib/editorFile.js index 2aee9b500f..e638cdb84b 100644 --- a/src/lib/editorFile.js +++ b/src/lib/editorFile.js @@ -1,17 +1,11 @@ import fsOperation from "fileSystem"; // CodeMirror imports for document state management -import { EditorState } from "@codemirror/state"; +import { EditorSelection, EditorState } from "@codemirror/state"; import { focusEditorIfEditable, reconfigureEditorReadOnly, } from "cm/editorReadOnly"; -import { - clearSelection, - getDocText, - restoreFolds, - restoreSelection, - setScrollPosition, -} from "cm/editorUtils"; +import { clearSelection, getDocText } from "cm/editorUtils"; import { getMode, getModeForPath } from "cm/modelist"; import quickTools from "components/quickTools"; import Sidebar from "components/sidebar"; @@ -37,6 +31,25 @@ import appSettings from "./settings"; let mainCSSStyleSheet = null; +function restoreSessionSelection(state, selection) { + if (!selection?.ranges?.length) return state; + + const docLength = state.doc.length; + const ranges = selection.ranges.map((range) => { + const from = Math.max(0, Math.min(docLength, range.from | 0)); + const to = Math.max(0, Math.min(docLength, range.to | 0)); + return EditorSelection.range(from, to); + }); + const mainIndex = + selection.mainIndex >= 0 && selection.mainIndex < ranges.length + ? selection.mainIndex + : 0; + + return state.update({ + selection: EditorSelection.create(ranges, mainIndex), + }).state; +} + function getMainCSSStyleSheet() { if (mainCSSStyleSheet) return mainCSSStyleSheet; for (const sheet of document.styleSheets) { @@ -330,6 +343,7 @@ function maybeRecommendLanguageModeExtension(file, modeInfo) { * @property {string} [paneId] target editor pane id * @property {object} [pane] target editor pane * @property {boolean} [isPanePlaceholder] temporary empty tab for an empty pane + * @property {boolean} [persistInSession] restore the tab in a future app session * @property {boolean} [highlightStyles] adopt static CodeMirror highlight CSS into the custom tab shadow root */ @@ -445,6 +459,7 @@ export default class EditorFile { * contains information about cursor position, scroll left, scroll top, folds. */ #loadOptions; + #loadPromise = null; /** * Weather file is changed and needs to be saved * @type {boolean} @@ -500,6 +515,11 @@ export default class EditorFile { diskMtime = null; hasDiskConflict = false; isPanePlaceholder = false; + persistInSession = true; + lastScrollTop = 0; + lastScrollLeft = 0; + restoredSelection = null; + restoredFolds = null; /** * @@ -513,6 +533,7 @@ export default class EditorFile { this.hideQuickTools = options?.hideQuickTools || false; this.paneId = options?.paneId || options?.pane?.id || null; this.isPanePlaceholder = !!options?.isPanePlaceholder; + this.persistInSession = options?.persistInSession !== false; // if options are passed if (options) { @@ -699,6 +720,14 @@ export default class EditorFile { folds: options?.folds, editable, }; + this.lastScrollTop = Number.isFinite(options?.scrollTop) + ? options.scrollTop + : 0; + this.lastScrollLeft = Number.isFinite(options?.scrollLeft) + ? options.scrollLeft + : 0; + this.restoredSelection = options?.cursorPos || null; + this.restoredFolds = options?.folds || null; } this.#onFilePosChange = () => { @@ -1554,8 +1583,8 @@ export default class EditorFile { this.#tab.classList.add("active"); this.#tab.scrollIntoView(); - if (this.type === "editor" && !this.loaded && !this.loading) { - this.#loadText(); + if (this.type === "editor" && !this.loaded) { + void this.load(); } syncQuickToolsVisibility(this); @@ -1637,6 +1666,20 @@ export default class EditorFile { } } + /** + * Load this file's document into its stored editor session. + * Reuses an in-flight load so session restoration can safely preload tabs. + */ + load() { + if (this.type !== "editor" || this.loaded) return Promise.resolve(this); + if (this.#loadPromise) return this.#loadPromise; + + this.#loadPromise = this.#loadText().finally(() => { + this.#loadPromise = null; + }); + return this.#loadPromise; + } + /** * Add event listener * @param {string} event @@ -1778,9 +1821,7 @@ export default class EditorFile { const protocol = this.uri ? Url.getProtocol(this.uri) : ""; const isRemoteFile = protocol === "ftp:" || protocol === "sftp:"; - const { cursorPos, scrollLeft, scrollTop, folds, editable } = - this.#loadOptions; - const { editor } = editorManager; + const { cursorPos, editable } = this.#loadOptions; this.#loadOptions = null; @@ -1852,7 +1893,11 @@ export default class EditorFile { const isUnsaved = this.isUnsaved; this.markChanged = false; - this.session = EditorState.create({ doc: value }); + this.session = restoreSessionSelection( + EditorState.create({ doc: value }), + cursorPos, + ); + this.restoredSelection = null; this.__cmSessionReady = false; this.__cmLanguageReady = false; this.__cmLanguageSignature = null; @@ -1871,13 +1916,6 @@ export default class EditorFile { setTimeout(() => { this.#emit("load", createFileEvent(this)); - if (cursorPos) { - restoreSelection(editor, cursorPos); - } - if (scrollTop || scrollLeft) { - setScrollPosition(editor, scrollTop, scrollLeft); - } - restoreFolds(editor, folds); }, 0); } catch (error) { this.#emit("loaderror", createFileEvent(this)); diff --git a/src/lib/editorManager.js b/src/lib/editorManager.js index d719add426..3ce9068465 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -1850,13 +1850,7 @@ async function EditorManager($header, $body) { const col = Math.max(0, Math.min(targetColumn, docLine.length)); const pos = docLine.from + col; - // Move cursor and scroll into view - editor.dispatch({ - selection: { anchor: pos, head: pos }, - effects: EditorView.scrollIntoView(pos, { y: "center" }), - }); - focusEditorIfEditable(editor); - return true; + return revealEditorRange(editor, pos); } catch (error) { console.error("Error in gotoLine:", error); return false; @@ -2181,12 +2175,7 @@ async function EditorManager($header, $body) { const col = Math.max(0, Math.min(targetColumn, docLine.length)); const pos = docLine.from + col; - targetEditor.dispatch({ - selection: { anchor: pos, head: pos }, - effects: EditorView.scrollIntoView(pos, { y: "center" }), - }); - focusEditorIfEditable(targetEditor); - return true; + return revealEditorRange(targetEditor, pos); } catch (error) { console.error("Error in gotoLine:", error); return false; @@ -3018,9 +3007,19 @@ async function EditorManager($header, $body) { // Restore folds from previous state if available try { const folds = prevState ? getAllFolds(prevState) : []; + const canConsumeRestoredFolds = file.loaded && !file.loading; + if ( + !folds.length && + canConsumeRestoredFolds && + file.restoredFolds?.length + ) { + folds.push(...file.restoredFolds); + } if (folds && folds.length) { restoreFolds(editor, folds); + file.session = editor.state; } + if (canConsumeRestoredFolds) file.restoredFolds = null; } catch (error) { warnRecoverable( "Failed to restore folded regions from previous session state.", @@ -3182,6 +3181,9 @@ async function EditorManager($header, $body) { hasUnsavedFiles, getEditorHeight, getEditorWidth, + revealRange(from, to = from, options) { + return revealEditorRange(manager.editor, from, to, options); + }, header: $header, openPreviousEditorFromHistory, openNextEditorFromHistory, @@ -3442,6 +3444,45 @@ async function EditorManager($header, $body) { applyFileToEditor(file, { forceRecreate: true }); } + /** + * Reveal an editor range after a file switch. + * + * File activation restores the tab's saved viewport over two animation + * frames and a short timeout. Explicit navigation must cancel that work or + * it can overwrite CodeMirror's scrollIntoView effect while leaving the new + * selection in place. + */ + function revealEditorRange( + targetEditor, + from, + to = from, + { y = "center", userEvent = "select.reveal" } = {}, + ) { + if (!targetEditor) return false; + + try { + const length = targetEditor.state.doc.length; + const anchor = Math.max(0, Math.min(Number(from) || 0, length)); + const head = Math.max(0, Math.min(Number(to) || 0, length)); + + if (targetEditor === editor) { + cancelPendingScrollRestore(); + clearScrollbarScrollLock(); + } + + targetEditor.dispatch({ + selection: { anchor, head }, + effects: EditorView.scrollIntoView(anchor, { y }), + userEvent, + }); + focusEditorIfEditable(targetEditor); + return true; + } catch (error) { + console.error("Error revealing editor range:", error); + return false; + } + } + appSettings.on("update:tabSize", function () { updateEditorIndentationSettings(); }); diff --git a/src/lib/fileSessionPersistence.js b/src/lib/fileSessionPersistence.js new file mode 100644 index 0000000000..e14c639402 --- /dev/null +++ b/src/lib/fileSessionPersistence.js @@ -0,0 +1,13 @@ +/** + * Promote an open file to durable session persistence when a later open source + * proves that its URI will remain accessible. Less durable sources, such as + * external intents, must not revoke an existing durable grant. + * + * @param {{persistInSession?: boolean}} file + * @param {boolean | undefined} requestedPersistence + */ +export function promoteSessionPersistence(file, requestedPersistence) { + if (requestedPersistence === true) { + file.persistInSession = true; + } +} diff --git a/src/lib/keyBindings.js b/src/lib/keyBindings.js index b252139621..db48a80185 100644 --- a/src/lib/keyBindings.js +++ b/src/lib/keyBindings.js @@ -714,6 +714,12 @@ const APP_BINDING_CONFIG = [ readOnly: true, editorOnly: true, }, + { + name: "acode:showWelcome", + description: "Show Welcome", + key: "Ctrl-Shift-W", + action: "welcome", + }, ]; const APP_KEY_BINDINGS = buildAppBindings(APP_BINDING_CONFIG); diff --git a/src/lib/lang.js b/src/lib/lang.js index b8a2966ab5..b4477e9629 100644 --- a/src/lib/lang.js +++ b/src/lib/lang.js @@ -185,7 +185,41 @@ const langMap = { return await import("../lang/he-il.json"); }, }, + "ln-ln": { + name: "Lingála", + async strings() { + return await import("../lang/ln-ln.json"); + }, + }, +}; + +const intlLocaleOverrides = { + "ir-fa": "fa-IR", + "mm-unicode": "my-MM", + "mm-zawgyi": "my-MM", + "pu-in": "pa-IN", }; +const rtlLanguages = new Set(["ar", "fa", "he"]); + +export function getIntlLocale(code) { + const normalizedCode = code?.toLowerCase(); + const locale = + intlLocaleOverrides[normalizedCode] || + (normalizedCode in langMap + ? normalizedCode + : globalThis.navigator?.language || "en-US"); + + try { + return Intl.getCanonicalLocales(locale)[0]; + } catch { + return "en-US"; + } +} + +export function getLocaleDirection(locale) { + const language = locale?.split("-")[0]?.toLowerCase(); + return rtlLanguages.has(language) ? "rtl" : "ltr"; +} export default { async set(code) { diff --git a/src/lib/loadPlugin.js b/src/lib/loadPlugin.js index 75656082bf..2272163ec8 100644 --- a/src/lib/loadPlugin.js +++ b/src/lib/loadPlugin.js @@ -3,8 +3,16 @@ import Page from "components/page"; import helpers from "utils/helpers"; import Url from "utils/Url"; import actionStack from "./actionStack"; +import generatePluginContext, { connect } from "./pluginContext"; export default async function loadPlugin(pluginId, justInstalled = false) { + // Establish the trusted native session BEFORE any plugin script is appended + // and run. Plugin main.js runs as soon as its - - - + + + - - - \ No newline at end of file + + + diff --git a/tests/admob/adConsentCoordinator.test.js b/tests/admob/adConsentCoordinator.test.js index cb4fe07c70..ecd5a2f7fc 100644 --- a/tests/admob/adConsentCoordinator.test.js +++ b/tests/admob/adConsentCoordinator.test.js @@ -9,6 +9,7 @@ function createHarness({ gatherState, previousState = EMPTY_PRIVACY_STATE, gatherError, + showOptions, }) { let gatherCalls = 0; let getStateCalls = 0; @@ -25,6 +26,7 @@ function createHarness({ return previousState; }, async showOptions() { + if (showOptions) return showOptions(); return gatherState; }, }; @@ -141,12 +143,12 @@ test("deduplicates consent collection and ad initialization", async () => { assert.equal(harness.initializeCalls, 1); }); -test("updates privacy-option visibility and keeps ads single-started", async () => { +test("hides a stale privacy-option entry and keeps ads single-started", async () => { const harness = createHarness({ gatherState: { - consentStatus: "notRequired", + consentStatus: "obtained", canRequestAds: true, - privacyOptionsRequired: false, + privacyOptionsRequired: true, }, }); const states = []; @@ -154,15 +156,15 @@ test("updates privacy-option visibility and keeps ads single-started", async () await harness.coordinator.start(); harness.privacy.showOptions = async () => ({ - consentStatus: "obtained", + consentStatus: "notRequired", canRequestAds: true, - privacyOptionsRequired: true, + privacyOptionsRequired: false, }); await harness.coordinator.showPrivacyOptions(); unsubscribe(); assert.equal(harness.initializeCalls, 1); - assert.equal(states.at(-1).privacyOptionsRequired, true); + assert.equal(states.at(-1).privacyOptionsRequired, false); }); test("normalizes an invalid native state instead of starting ads", async () => { @@ -177,3 +179,62 @@ test("normalizes an invalid native state instead of starting ads", async () => { assert.deepEqual(await harness.coordinator.start(), EMPTY_PRIVACY_STATE); assert.equal(harness.initializeCalls, 0); }); + +test("deduplicates concurrent privacy-option requests", async () => { + let resolveOptions; + let showOptionsCalls = 0; + const optionsResult = new Promise((resolve) => { + resolveOptions = resolve; + }); + const harness = createHarness({ + gatherState: { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: true, + }, + showOptions() { + showOptionsCalls++; + return optionsResult; + }, + }); + await harness.coordinator.start(); + + const firstRequest = harness.coordinator.showPrivacyOptions(); + const secondRequest = harness.coordinator.showPrivacyOptions(); + assert.equal(firstRequest, secondRequest); + resolveOptions({ + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: false, + }); + + assert.deepEqual(await firstRequest, { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: false, + }); + assert.equal(showOptionsCalls, 1); +}); + +test("preserves consent state when privacy options reject", async () => { + const gatherState = { + consentStatus: "obtained", + canRequestAds: true, + privacyOptionsRequired: true, + }; + const optionsError = new Error("native failure"); + const harness = createHarness({ + gatherState, + showOptions: async () => { + throw optionsError; + }, + }); + await harness.coordinator.start(); + + await assert.rejects( + harness.coordinator.showPrivacyOptions(), + (error) => error === optionsError, + ); + assert.deepEqual(harness.coordinator.state, gatherState); + assert.equal(harness.initializeCalls, 1); +}); diff --git a/tests/admob/bannerVisibilityController.test.js b/tests/admob/bannerVisibilityController.test.js index cb9d52c347..1ad63d396c 100644 --- a/tests/admob/bannerVisibilityController.test.js +++ b/tests/admob/bannerVisibilityController.test.js @@ -1,21 +1,34 @@ import assert from "node:assert/strict"; -import { test } from "vitest"; +import { afterEach, test, vi } from "vitest"; import { BANNER_SUPPRESSION_REASON, BannerVisibilityController, } from "../../src/lib/bannerVisibilityController.mjs"; -function createHarness() { +function createHarness({ show, hide } = {}) { let activePage = null; let notifyPageChange = () => {}; const calls = []; + const errors = []; + const listeners = new Map(); const banner = { active: false, async show() { calls.push("show"); + return show?.(); }, async hide() { calls.push("hide"); + return hide?.(); + }, + on(eventName, listener) { + let eventListeners = listeners.get(eventName); + if (!eventListeners) { + eventListeners = new Set(); + listeners.set(eventName, eventListeners); + } + eventListeners.add(listener); + return () => eventListeners.delete(listener); }, }; const controller = new BannerVisibilityController({ @@ -27,7 +40,7 @@ function createHarness() { }; }, onError(error) { - throw error; + errors.push(error); }, }); controller.setBanner(banner); @@ -36,6 +49,10 @@ function createHarness() { banner, calls, controller, + emit(eventName, event = {}) { + for (const listener of listeners.get(eventName) ?? []) listener(event); + }, + errors, changePage(page) { activePage = page; notifyPageChange(); @@ -46,6 +63,19 @@ function createHarness() { }; } +async function createEligibleHarness(options) { + const harness = createHarness(options); + const page = {}; + harness.setActivePage(page); + harness.controller.registerPage(page); + await harness.controller.whenIdle(); + return { harness, page }; +} + +afterEach(() => { + vi.useRealTimers(); +}); + test("shows only for a registered active page and ignores repeated syncs", async () => { const harness = createHarness(); const page = {}; @@ -234,3 +264,169 @@ test("serializes an in-flight show before the latest hide request", async () => assert.equal(banner.active, false); assert.deepEqual(calls, ["show", "hide"]); }); + +test("retries one transient failure after 500ms and caps requests at two", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(499); + assert.deepEqual(harness.calls, ["show"]); + await vi.advanceTimersByTimeAsync(1); + await harness.controller.whenIdle(); + + harness.emit("loadfail", { code: 3 }); + harness.controller.reconcile(); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show"]); + assert.equal(harness.errors.length, 3); +}); + +test("successful load restores the retry allowance", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + harness.emit("load"); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show", "show"]); +}); + +test("cancels a retry on navigation and restores it when the page returns", async () => { + vi.useFakeTimers(); + const { harness, page } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 3 }); + harness.changePage({}); + await harness.controller.whenIdle(); + await vi.advanceTimersByTimeAsync(500); + assert.deepEqual(harness.calls, ["show"]); + + harness.changePage(page); + await harness.controller.whenIdle(); + harness.emit("loadfail", { code: 3 }); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show", "show"]); +}); + +test("does not retry non-transient load failures", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + + harness.emit("loadfail", { code: 1 }); + harness.controller.reconcile(); + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show"]); +}); + +test("retries a rejected native show call", async () => { + vi.useFakeTimers(); + let showCalls = 0; + const { harness } = await createEligibleHarness({ + show() { + showCalls++; + if (showCalls === 1) throw new Error("bridge failure"); + }, + }); + + await vi.advanceTimersByTimeAsync(500); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "show"]); + assert.equal(harness.errors.length, 1); +}); + +test("keeps a rejected hide operation eligible for reconciliation", async () => { + let hideCalls = 0; + const { harness } = await createEligibleHarness({ + hide() { + hideCalls++; + if (hideCalls === 1) throw new Error("bridge failure"); + }, + }); + + harness.controller.setKeyboardVisible(true); + await harness.controller.whenIdle(); + harness.controller.reconcile(); + await harness.controller.whenIdle(); + + assert.deepEqual(harness.calls, ["show", "hide", "hide"]); + assert.equal(harness.errors.length, 1); +}); + +test("replacement and disposal cancel retries and detach listeners", async () => { + vi.useFakeTimers(); + const { harness } = await createEligibleHarness(); + harness.emit("loadfail", { code: 3 }); + + const replacementCalls = []; + const replacementListeners = new Map(); + harness.controller.setBanner({ + active: false, + async hide() { + replacementCalls.push("hide"); + }, + on(eventName, listener) { + replacementListeners.set(eventName, listener); + return () => replacementListeners.delete(eventName); + }, + async show() { + replacementCalls.push("show"); + }, + }); + await harness.controller.whenIdle(); + const errorsBeforeStaleEvent = harness.errors.length; + harness.emit("loadfail", { code: 3 }); + replacementListeners.get("loadfail")({ code: 3 }); + harness.controller.dispose(); + replacementListeners.get("loadfail")?.({ code: 3 }); + await vi.advanceTimersByTimeAsync(500); + + assert.deepEqual(replacementCalls, ["show"]); + assert.equal(harness.errors.length, errorsBeforeStaleEvent + 1); +}); + +test("ignores a stale show rejection after replacing the banner", async () => { + let rejectOldShow; + const harness = createHarness({ + show: () => + new Promise((_, reject) => { + rejectOldShow = reject; + }), + }); + const page = {}; + harness.setActivePage(page); + harness.controller.registerPage(page); + await new Promise((resolve) => setImmediate(resolve)); + + const replacementCalls = []; + harness.controller.setBanner({ + active: false, + async hide() { + replacementCalls.push("hide"); + }, + on() { + return () => {}; + }, + async show() { + replacementCalls.push("show"); + }, + }); + rejectOldShow(new Error("stale bridge failure")); + await harness.controller.whenIdle(); + + assert.deepEqual(replacementCalls, ["show"]); + assert.deepEqual(harness.errors, []); +}); diff --git a/tests/unit/confirm.test.js b/tests/unit/confirm.test.js index 0029941e48..bbcadbda15 100644 --- a/tests/unit/confirm.test.js +++ b/tests/unit/confirm.test.js @@ -1,4 +1,6 @@ -import { Window } from "happy-dom"; +// @vitest-environment happy-dom + +import tag from "html-tag-js"; import { afterEach, beforeEach, expect, it, vi } from "vitest"; vi.mock("lib/settings", () => ({ default: { value: { confirmOnExit: false } }, @@ -9,23 +11,14 @@ vi.mock("components/checkbox", () => ({ })); 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); + document.body.replaceChildren(); + vi.stubGlobal("app", 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; - }); + vi.stubGlobal("tag", tag); }); afterEach(() => { actionStack.clearFromMark(); @@ -33,7 +26,7 @@ afterEach(() => { vi.restoreAllMocks(); vi.useRealTimers(); vi.unstubAllGlobals(); - window.happyDOM.cancelAsync(); + document.body.replaceChildren(); }); it.each([ "back", @@ -44,6 +37,7 @@ it.each([ const result = confirm("Icon", "Watch?", false, { signal: controller.signal, }); + expect(document.querySelector(".confirm").className).toBe("prompt confirm"); if (method === "back") await actionStack.pop(); if (method === "cancel") document.querySelector("button").click(); if (method === "abort") controller.abort(); @@ -52,6 +46,20 @@ it.each([ expect(app.children.length).toBe(0); expect(actionStack.length).toBe(0); }); +it("applies the overlay layer without losing RTL and resolves true", async () => { + const result = confirm("Delete", "Delete this review?", false, { + direction: "rtl", + aboveOverlay: true, + }); + const dialog = document.querySelector(".confirm"); + expect(dialog.className).toBe("prompt confirm above-overlay"); + expect(dialog.dir).toBe("rtl"); + dialog.querySelectorAll("button")[1].click(); + await expect(result).resolves.toBe(true); + 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"); diff --git a/tests/unit/consoleExecutionContext.test.js b/tests/unit/consoleExecutionContext.test.js new file mode 100644 index 0000000000..3d6a6519e9 --- /dev/null +++ b/tests/unit/consoleExecutionContext.test.js @@ -0,0 +1,111 @@ +import { describe, expect, it } from "vitest"; +import { + executeConsoleCommand, + executeConsoleScript, + resolveConsoleExecutionContext, +} from "lib/consoleRuntime"; + +describe("console execution context", () => { + it("forces standalone menu consoles to use the worker", () => { + expect(resolveConsoleExecutionContext(true, "page")).toBe("worker"); + expect(resolveConsoleExecutionContext(false, "page")).toBe("page"); + }); + + it("uses isolated worker execution by default", async () => { + const calls = []; + const result = await executeConsoleCommand({ + context: "worker", + code: "document.title", + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + return Promise.resolve({ type: "result", value: "isolated" }); + }, + }, + pageExecutor(code) { + calls.push(["page", code]); + }, + }); + + expect(calls).toEqual([["worker", "document.title"]]); + expect(result.value).toBe("isolated"); + }); + + it("restores live page execution when explicitly selected", async () => { + const calls = []; + const result = await executeConsoleCommand({ + context: "page", + code: 'document.querySelector("main")', + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + }, + }, + pageExecutor(code) { + calls.push(["page", code]); + return { type: "result", value: "live page" }; + }, + }); + + expect(calls).toEqual([["page", 'document.querySelector("main")']]); + expect(result.value).toBe("live page"); + }); + + it("loads Run-button scripts and executes them in the worker", async () => { + const calls = []; + const result = await executeConsoleScript({ + scriptUrl: "example.js", + fetchScript: async (url, options) => { + calls.push(["fetch", url, options]); + return { + ok: true, + text: async () => "while (true) {}", + }; + }, + workerExecutor: { + execute(code) { + calls.push(["worker", code]); + return Promise.resolve({ type: "result" }); + }, + }, + }); + + expect(calls).toEqual([ + ["fetch", "example.js", { cache: "no-store" }], + ["worker", "while (true) {}"], + ]); + expect(result).toEqual({ type: "result" }); + }); + + it("does not load a script for an empty menu console", async () => { + let fetched = false; + const result = await executeConsoleScript({ + scriptUrl: null, + fetchScript: async () => { + fetched = true; + }, + }); + + expect(fetched).toBe(false); + expect(result).toBeNull(); + }); + + it("returns a console error when a Run-button script cannot be loaded", async () => { + let executed = false; + const result = await executeConsoleScript({ + scriptUrl: "missing.js", + fetchScript: async () => ({ ok: false, status: 404 }), + workerExecutor: { + execute() { + executed = true; + }, + }, + }); + + expect(executed).toBe(false); + expect(result).toMatchObject({ + type: "error", + value: { message: "Failed to load JavaScript file (404)." }, + }); + }); +}); diff --git a/tests/unit/consoleExecutor.test.js b/tests/unit/consoleExecutor.test.js new file mode 100644 index 0000000000..7dcd45e645 --- /dev/null +++ b/tests/unit/consoleExecutor.test.js @@ -0,0 +1,134 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import ConsoleExecutor from "lib/consoleRuntime"; + +class FakeWorker { + static instances = []; + + constructor(url) { + this.url = url; + this.terminate = vi.fn(); + this.postMessage = vi.fn(); + FakeWorker.instances.push(this); + } + + respond(data) { + this.onmessage({ data }); + } +} + +describe("ConsoleExecutor", () => { + beforeEach(() => { + FakeWorker.instances = []; + vi.useRealTimers(); + }); + + it("returns a worker result and reuses the isolated context", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const firstResult = executor.execute("1 + 1"); + const worker = FakeWorker.instances[0]; + expect(worker.url).toBe("/console-worker.js"); + expect(worker.postMessage).toHaveBeenCalledWith({ id: 1, code: "1 + 1" }); + + worker.respond({ type: "result", id: 1, value: 2 }); + await expect(firstResult).resolves.toEqual({ type: "result", value: 2 }); + + const secondResult = executor.execute("3 + 4"); + expect(FakeWorker.instances).toHaveLength(1); + worker.respond({ type: "result", id: 2, value: 7 }); + await expect(secondResult).resolves.toEqual({ type: "result", value: 7 }); + }); + + it("forwards console messages from the worker", async () => { + const onConsole = vi.fn(); + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + onConsole, + }); + + const result = executor.execute("console.log('hello')"); + const worker = FakeWorker.instances[0]; + const message = { + type: "console", + id: 1, + level: "log", + args: ["hello"], + }; + worker.respond(message); + worker.respond({ type: "result", id: 1 }); + + expect(onConsole).toHaveBeenCalledWith(message); + await expect(result).resolves.toEqual({ type: "result", value: undefined }); + }); + + it("terminates and replaces a worker when execution times out", async () => { + vi.useFakeTimers(); + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + timeout: 50, + }); + + const timedOutResult = executor.execute("while (true) {}"); + const blockedWorker = FakeWorker.instances[0]; + await vi.advanceTimersByTimeAsync(50); + + const result = await timedOutResult; + expect(result.type).toBe("error"); + expect(result.value.message).toBe("Execution stopped after 0.05 seconds."); + expect(blockedWorker.terminate).toHaveBeenCalledOnce(); + + const nextResult = executor.execute("42"); + expect(FakeWorker.instances).toHaveLength(2); + FakeWorker.instances[1].respond({ type: "result", id: 2, value: 42 }); + await expect(nextResult).resolves.toEqual({ type: "result", value: 42 }); + }); + + it("allows a running command to be stopped immediately", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const stoppedResult = executor.execute("while (true) {}"); + const blockedWorker = FakeWorker.instances[0]; + + expect(executor.cancel()).toBe(true); + await expect(stoppedResult).resolves.toMatchObject({ + type: "error", + value: { message: "Execution stopped." }, + }); + expect(blockedWorker.terminate).toHaveBeenCalledOnce(); + expect(executor.cancel()).toBe(false); + }); + + it("turns worker errors into console errors", async () => { + const executor = new ConsoleExecutor({ + workerUrl: "/console-worker.js", + WorkerClass: FakeWorker, + }); + + const result = executor.execute("missingName"); + FakeWorker.instances[0].respond({ + type: "error", + id: 1, + error: { + name: "ReferenceError", + message: "missingName is not defined", + stack: "worker stack", + }, + }); + + const errorResult = await result; + expect(errorResult.type).toBe("error"); + expect(errorResult.value).toMatchObject({ + name: "ReferenceError", + message: "missingName is not defined", + stack: "worker stack", + }); + }); +}); diff --git a/tests/unit/consoleViewport.test.js b/tests/unit/consoleViewport.test.js new file mode 100644 index 0000000000..218a5bad69 --- /dev/null +++ b/tests/unit/consoleViewport.test.js @@ -0,0 +1,41 @@ +// @vitest-environment happy-dom + +import { describe, expect, it } from "vitest"; +import { + applyConsoleViewport, + getConsoleViewportRect, +} from "lib/consoleRuntime"; + +describe("console visual viewport", () => { + it("uses the visual viewport when the mobile keyboard shrinks the screen", () => { + const windowObject = { + innerHeight: 800, + innerWidth: 400, + visualViewport: { + height: 476.4, + width: 400, + offsetTop: 12.2, + offsetLeft: 0, + }, + }; + + expect(getConsoleViewportRect(windowObject)).toEqual({ + height: 476, + width: 400, + top: 12, + left: 0, + }); + + const element = document.createElement("div"); + applyConsoleViewport(element, windowObject); + expect(element.style.getPropertyValue("--console-viewport-height")).toBe( + "476px", + ); + }); + + it("falls back to the layout viewport", () => { + expect( + getConsoleViewportRect({ innerHeight: 720, innerWidth: 360 }), + ).toEqual({ height: 720, width: 360, top: 0, left: 0 }); + }); +}); diff --git a/tests/unit/editorThemes.test.js b/tests/unit/editorThemes.test.js index 0b2dee35e0..30ccb06aa7 100644 --- a/tests/unit/editorThemes.test.js +++ b/tests/unit/editorThemes.test.js @@ -61,4 +61,16 @@ describe("built-in editor themes", () => { ).not.toThrow(); } }); + + it("keeps active-line backgrounds translucent so selections remain visible", () => { + for (const { id } of getThemes()) { + const activeLine = getThemeConfig(id).activeLine; + if (!activeLine) continue; + + expect(activeLine, `${id} active line`).toMatch(/^#[\da-f]{8}$/i); + expect(Number.parseInt(activeLine.slice(-2), 16), `${id} active line`).toBeLessThan( + 255, + ); + } + }); }); diff --git a/tests/unit/lspExternalWebSocketLifecycle.test.js b/tests/unit/lspExternalWebSocketLifecycle.test.js index 65b66dbcbc..227061a14d 100644 --- a/tests/unit/lspExternalWebSocketLifecycle.test.js +++ b/tests/unit/lspExternalWebSocketLifecycle.test.js @@ -197,6 +197,24 @@ afterEach(async () => { }); describe("LSP client idle lifecycle", () => { + it("advertises lazy code-action edit resolution", async () => { + manager = new LspClientManager(); + await manager.getExtensionsForFile({ + uri: "file:///workspace/main.rs", + rootUri: "file:///workspace", + languageId: LANGUAGE_ID, + view, + }); + + const initialize = TestWebSocket.instances[0].sent + .map((data) => JSON.parse(data)) + .find((message) => message.method === "initialize"); + expect(initialize.params.capabilities.textDocument.codeAction).toEqual({ + dataSupport: true, + resolveSupport: {properties: ["edit"]}, + }); + }); + it("reuses an external WebSocket client when a file attaches during the grace period", async () => { const onClientIdle = vi.fn(({dispose}) => void dispose()); manager = new LspClientManager({onClientIdle}); diff --git a/tests/unit/lspLocationUtils.test.ts b/tests/unit/lspLocationUtils.test.ts new file mode 100644 index 0000000000..8a006dd372 --- /dev/null +++ b/tests/unit/lspLocationUtils.test.ts @@ -0,0 +1,38 @@ +import { normalizeLocations } from "cm/lsp/locationUtils"; +import { describe, expect, it } from "vitest"; + +const targetRange = { + start: { line: 4, character: 1 }, + end: { line: 4, character: 8 }, +}; + +describe("normalizeLocations", () => { + it("keeps Location responses unchanged", () => { + const location = { uri: "file:///project/a.ts", range: targetRange }; + expect(normalizeLocations(location)).toEqual([location]); + }); + + it("uses a LocationLink target selection range when present", () => { + const selection = { + start: { line: 4, character: 3 }, + end: { line: 4, character: 6 }, + }; + expect( + normalizeLocations([ + { + targetUri: "file:///project/a.ts", + targetRange, + targetSelectionRange: selection, + }, + ]), + ).toEqual([{ uri: "file:///project/a.ts", range: selection }]); + }); + + it("falls back to the LocationLink target range", () => { + expect( + normalizeLocations([ + { targetUri: "file:///project/a.ts", targetRange }, + ]), + ).toEqual([{ uri: "file:///project/a.ts", range: targetRange }]); + }); +}); diff --git a/tests/unit/lspPositionUtils.test.ts b/tests/unit/lspPositionUtils.test.ts new file mode 100644 index 0000000000..789e4ff250 --- /dev/null +++ b/tests/unit/lspPositionUtils.test.ts @@ -0,0 +1,28 @@ +import { Text } from "@codemirror/state"; +import { safeLspPositionToOffset } from "cm/lsp/positionUtils"; +import { describe, expect, it } from "vitest"; + +describe("safeLspPositionToOffset", () => { + const doc = Text.of(["alpha", "beta"]); + + it("converts valid positions and clamps oversized characters", () => { + expect(safeLspPositionToOffset(doc, { line: 0, character: 2 })).toBe(2); + expect(safeLspPositionToOffset(doc, { line: 1, character: 99 })).toBe( + doc.length, + ); + }); + + it("accepts the exclusive one-past-EOF position used by LSP edits", () => { + expect( + safeLspPositionToOffset(doc, { line: doc.lines, character: 0 }), + ).toBe(doc.length); + expect( + safeLspPositionToOffset(doc, { line: doc.lines + 10, character: 4 }), + ).toBe(doc.length); + }); + + it("clamps negative lines and characters", () => { + expect(safeLspPositionToOffset(doc, { line: -1, character: 20 })).toBe(0); + expect(safeLspPositionToOffset(doc, { line: 1, character: -4 })).toBe(6); + }); +}); diff --git a/tests/unit/openFileCancellation.test.js b/tests/unit/openFileCancellation.test.js new file mode 100644 index 0000000000..4f8cd26a3b --- /dev/null +++ b/tests/unit/openFileCancellation.test.js @@ -0,0 +1,223 @@ +import fs from "node:fs"; +import ts from "typescript"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +// openFile contains app-specific JSX. Compile the actual module for this +// isolated test, supplying its Cordova/UI dependencies without booting the app. +const source = fs.readFileSync( + new URL("../../src/lib/openFile.js", import.meta.url), + "utf8", +); +const { outputText } = ts.transpileModule(source, { + fileName: "openFile.jsx", + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + jsx: ts.JsxEmit.React, + }, +}); + +function deferred() { + let resolve; + const promise = new Promise((done) => { + resolve = done; + }); + return { promise, resolve }; +} + +describe("openFile cancellation", () => { + let openFile; + let manager; + let stat; + let readFile; + let decode; + let detectEncoding; + let handler; + let createEditor; + let recents; + let controller; + let titleLoader; + let loaderVisible; + + beforeEach(() => { + controller = new AbortController(); + loaderVisible = false; + titleLoader = { + showTitleLoader: vi.fn(() => { + loaderVisible = true; + }), + removeTitleLoader: vi.fn(() => { + loaderVisible = false; + }), + }; + manager = { getFile: vi.fn(), activeFile: null }; + stat = vi.fn().mockResolvedValue({ name: "target.txt", length: 10 }); + readFile = vi.fn().mockResolvedValue("bytes"); + decode = vi.fn().mockResolvedValue("target text"); + detectEncoding = vi.fn().mockResolvedValue("UTF-8"); + handler = { getFileHandler: vi.fn() }; + recents = { addFile: vi.fn() }; + createEditor = vi.fn(function (name, options) { + manager.activeFile = { name, ...options }; + }); + const dependencies = { + fileSystem: { default: () => ({ stat, readFile }) }, + "@codemirror/state": {}, + "components/audioPlayer": {}, + "dialogs/alert": {}, + "dialogs/confirm": {}, + "dialogs/loader": { + default: titleLoader, + }, + "palettes/changeEncoding": {}, + "utils/encodings": { decode, detectEncoding }, + "utils/helpers": { + default: { getStatMtime: () => 0, isBinary: () => false }, + }, + "./editorFile": { default: createEditor }, + "./fileSessionPersistence": { promoteSessionPersistence: vi.fn() }, + "./fileTypeHandler": { default: handler }, + "./recents": { default: recents }, + "./settings": { + default: { value: { maxFileSize: 10, defaultFileEncoding: "auto" } }, + }, + }; + const exports = {}; + new Function("require", "exports", "editorManager", outputText)( + (name) => { + if (!(name in dependencies)) throw new Error(`Unexpected import: ${name}`); + return dependencies[name]; + }, + exports, + manager, + ); + openFile = exports.default; + }); + + it("preserves normal file opening without a signal", async () => { + await openFile("target", { render: true }); + expect(createEditor).toHaveBeenCalledOnce(); + expect(manager.activeFile.text).toBe("target text"); + expect(recents.addFile).toHaveBeenCalledWith("target"); + }); + + it("does not activate an existing file with an already-aborted signal", async () => { + const file = { makeActive: vi.fn() }; + manager.getFile.mockReturnValue(file); + controller.abort(); + await openFile("target", { render: true, signal: controller.signal }); + expect(file.makeActive).not.toHaveBeenCalled(); + }); + + it.each(["stat", "read", "detect", "decode"])( + "does not steal focus when cancelled during %s", + async (stage) => { + const waiting = deferred(); + const operation = { stat, read: readFile, detect: detectEncoding, decode }[ + stage + ]; + operation.mockReturnValueOnce(waiting.promise); + const opening = openFile("obsolete", { + render: true, + signal: controller.signal, + }); + await vi.waitFor(() => expect(operation).toHaveBeenCalledOnce()); + controller.abort(); + + // A newer open completes before the obsolete filesystem work does. + await openFile("latest", { render: true }); + const latest = manager.activeFile; + waiting.resolve( + stage === "stat" ? { name: "obsolete.txt", length: 10 } : "text", + ); + await opening; + expect(manager.activeFile).toBe(latest); + expect(createEditor).toHaveBeenCalledOnce(); + expect(recents.addFile).toHaveBeenCalledExactlyOnceWith("latest"); + }, + ); + + it("guards a custom handler's delayed createEditor callback", async () => { + const waiting = deferred(); + const handleFile = vi.fn(async ({ options }) => { + await waiting.promise; + options.createEditor(false, "obsolete text"); + }); + handler.getFileHandler.mockReturnValue({ handleFile }); + const opening = openFile("obsolete", { signal: controller.signal }); + await vi.waitFor(() => expect(handleFile).toHaveBeenCalledOnce()); + controller.abort(); + waiting.resolve(); + await opening; + expect(createEditor).not.toHaveBeenCalled(); + }); + + it("keeps the latest loader visible when an aborted earlier read settles", async () => { + const obsoleteRead = deferred(); + const latestRead = deferred(); + readFile.mockReturnValueOnce(obsoleteRead.promise); + readFile.mockReturnValueOnce(latestRead.promise); + const obsolete = openFile("obsolete", { signal: controller.signal }); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(1)); + controller.abort(); + const latest = openFile("latest"); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(2)); + expect(loaderVisible).toBe(true); + const removals = titleLoader.removeTitleLoader.mock.calls.length; + + obsoleteRead.resolve("obsolete bytes"); + await obsolete; + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledTimes(removals); + latestRead.resolve("latest bytes"); + await latest; + expect(loaderVisible).toBe(false); + }); + + it.each([0, 1])( + "keeps the indicator until both concurrent opens finish (first to finish: %s)", + async (first) => { + const reads = [deferred(), deferred()]; + readFile.mockReturnValueOnce(reads[0].promise); + readFile.mockReturnValueOnce(reads[1].promise); + const opens = [openFile("one"), openFile("two")]; + await vi.waitFor(() => expect(readFile).toHaveBeenCalledTimes(2)); + reads[first].resolve("bytes"); + await opens[first]; + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).not.toHaveBeenCalled(); + reads[1 - first].resolve("bytes"); + await opens[1 - first]; + expect(loaderVisible).toBe(false); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + }, + ); + + it("releases a cancelled open's loader without waiting for its read", async () => { + const reading = deferred(); + readFile.mockReturnValueOnce(reading.promise); + const opening = openFile("target", { signal: controller.signal }); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledOnce()); + expect(loaderVisible).toBe(true); + controller.abort(); + expect(loaderVisible).toBe(false); + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + reading.resolve("bytes"); + await opening; + expect(titleLoader.removeTitleLoader).toHaveBeenCalledOnce(); + }); + + it("does not hide another open's loader when activating an existing tab", async () => { + const reading = deferred(); + readFile.mockReturnValueOnce(reading.promise); + const opening = openFile("loading"); + await vi.waitFor(() => expect(readFile).toHaveBeenCalledOnce()); + manager.getFile.mockReturnValue({ makeActive: vi.fn() }); + await openFile("existing"); + expect(loaderVisible).toBe(true); + expect(titleLoader.removeTitleLoader).not.toHaveBeenCalled(); + reading.resolve("bytes"); + await opening; + expect(loaderVisible).toBe(false); + }); +}); diff --git a/tests/unit/pluginContext.test.js b/tests/unit/pluginContext.test.js new file mode 100644 index 0000000000..2523220c99 --- /dev/null +++ b/tests/unit/pluginContext.test.js @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; + +afterEach(() => { + vi.resetModules(); + vi.unstubAllGlobals(); +}); + +describe("plugin context Cordova bridge", () => { + it("loads before cordova.exec is mapped", async () => { + const nativeExec = vi.fn((resolve, _reject, _service, action) => { + if (action === "establishConnection") { + resolve("trusted-session"); + } else if (action === "requestToken") { + resolve("plugin-token"); + } + }); + const requireModule = vi.fn(() => nativeExec); + vi.stubGlobal("cordova", { require: requireModule }); + + const pluginContext = await import("lib/pluginContext"); + + expect(requireModule).toHaveBeenCalledWith("cordova/exec"); + expect(cordova.exec).toBeUndefined(); + await expect(pluginContext.connect()).resolves.toBe(true); + await expect(pluginContext.default("example.plugin", "{}")).resolves.toBeTruthy(); + }); +}); diff --git a/tests/unit/pluginReview.test.js b/tests/unit/pluginReview.test.js new file mode 100644 index 0000000000..efb70b1bbc --- /dev/null +++ b/tests/unit/pluginReview.test.js @@ -0,0 +1,183 @@ +import { describe, expect, it } from "vitest"; +import { getIntlLocale, getLocaleDirection } from "lib/lang"; +import { + formatReviewDate, + getRatingClass, + getRatingLabel, + hasReviewChanged, + normalizeReviewDraft, + partitionPluginReviews, + resolveReviewAvatarUrl, + updateReviewStats, + validateReviewDraft, +} from "pages/plugin/reviewUtils"; + +describe("plugin review dates", () => { + it("formats database timestamps as website-style relative dates", () => { + const formatted = formatReviewDate( + "2026-08-26 12:00:00", + Date.parse("2026-08-28T12:00:00Z"), + "en-US", + ); + + expect(formatted?.dateTime).toBe("2026-08-26T12:00:00.000Z"); + expect(formatted?.relative).toBe("2 days ago"); + expect(formatted?.title).toBeTruthy(); + }); + + it("uses the selected locale for relative and absolute dates", () => { + const value = "2026-08-26 12:00:00"; + const now = Date.parse("2026-08-28T12:00:00Z"); + const formatted = formatReviewDate(value, now, "fr-FR"); + const date = new Date("2026-08-26T12:00:00Z"); + + expect(formatted?.relative).toBe( + new Intl.RelativeTimeFormat("fr-FR", { numeric: "auto" }).format( + -2, + "day", + ), + ); + expect(formatted?.title).toBe( + date.toLocaleString("fr-FR", { + dateStyle: "medium", + timeStyle: "short", + }), + ); + }); + + it("normalizes Acode-specific locale codes", () => { + expect(getIntlLocale("pu-in")).toBe("pa-IN"); + expect(getIntlLocale("ir-fa")).toBe("fa-IR"); + expect(getIntlLocale("mm-unicode")).toBe("my-MM"); + expect(getIntlLocale("mm-zawgyi")).toBe("my-MM"); + expect(getLocaleDirection("fa-IR")).toBe("rtl"); + expect(getLocaleDirection("ar-YE")).toBe("rtl"); + expect(getLocaleDirection("he-IL")).toBe("rtl"); + expect(getLocaleDirection("de-DE")).toBe("ltr"); + }); + + it("hides missing or invalid review dates", () => { + expect(formatReviewDate()).toBeNull(); + expect(formatReviewDate("not-a-date")).toBeNull(); + }); +}); + +describe("plugin review avatars", () => { + it("prefers an explicit avatar and falls back to GitHub", () => { + expect( + resolveReviewAvatarUrl({ + avatar_url: " https://example.com/avatar.png ", + github: "acode-foundation", + }), + ).toBe("https://example.com/avatar.png"); + expect(resolveReviewAvatarUrl({ github: " acode-foundation " })).toBe( + "https://avatars.githubusercontent.com/acode-foundation", + ); + }); + + it("uses the local placeholder when no avatar is available", () => { + expect(resolveReviewAvatarUrl()).toBeNull(); + expect(resolveReviewAvatarUrl({ avatar_url: " ", github: " " })).toBeNull(); + }); +}); + +describe("plugin review ordering", () => { + it("pins and deduplicates the current user's review across id types", () => { + const reviews = [ + { id: 1, user_id: 10, comment: "First" }, + { id: 2, user_id: "7", comment: "Mine from the list" }, + { id: 3, user_id: 11, comment: "Second" }, + ]; + const currentReview = { + id: "2", + user_id: 7, + comment: "", + vote: 1, + }; + + expect(partitionPluginReviews(reviews, currentReview, "7")).toEqual({ + ownReview: currentReview, + communityReviews: [reviews[0], reviews[2]], + }); + }); +}); + +describe("plugin review draft", () => { + it("normalizes whitespace and preserves valid votes", () => { + expect(normalizeReviewDraft({ comment: " Very useful ", vote: "1" })).toEqual( + { + comment: "Very useful", + vote: 1, + }, + ); + }); + + it("supports an upvote without text and validates negative feedback", () => { + expect(validateReviewDraft({ vote: 1 })).toEqual({ comment: "", vote: 1 }); + expect(validateReviewDraft({ comment: " ", vote: -1 }).errorKey).toBe( + "plugin-review:error-downvote-comment", + ); + expect(validateReviewDraft({ comment: " ", vote: 0 }).errorKey).toBe( + "plugin-review:error-empty", + ); + }); + + it("enforces the 250 character limit", () => { + expect(validateReviewDraft({ comment: "x".repeat(250), vote: 0 })).toEqual({ + comment: "x".repeat(250), + vote: 0, + }); + expect( + validateReviewDraft({ comment: "x".repeat(251), vote: 0 }).errorKey, + ).toBe("plugin-review:error-max-length"); + }); + + it("compares normalized drafts to prevent duplicate submissions", () => { + expect( + hasReviewChanged( + { comment: "Useful", vote: 1 }, + { comment: " Useful ", vote: "1" }, + ), + ).toBe(false); + expect( + hasReviewChanged( + { comment: "Useful", vote: 1 }, + { comment: "Updated", vote: 1 }, + ), + ).toBe(true); + }); +}); + +describe("plugin review metrics", () => { + it("moves votes and comment counts without inflation", () => { + expect( + updateReviewStats( + { votesUp: 8, votesDown: 2, commentCount: 4 }, + { vote: 1, comment: "Old" }, + { vote: -1, comment: "New" }, + ), + ).toEqual({ votesUp: 7, votesDown: 3, commentCount: 4 }); + }); + + it("handles vote-only reviews and deletion", () => { + const added = updateReviewStats( + { votesUp: 0, votesDown: 0, commentCount: 0 }, + null, + { vote: 1, comment: "" }, + ); + expect(added).toEqual({ votesUp: 1, votesDown: 0, commentCount: 0 }); + expect(updateReviewStats(added, { vote: 1 }, null)).toEqual({ + votesUp: 0, + votesDown: 0, + commentCount: 0, + }); + }); + + it("formats rating labels and visual states", () => { + expect(getRatingLabel(0, 0)).toBe("unrated"); + expect(getRatingLabel(8, 2)).toBe("80%"); + expect(getRatingClass("80%")).toContain("rating-high"); + expect(getRatingClass("50%")).toContain("rating-medium"); + expect(getRatingClass("49%")).toContain("rating-low"); + }); +}); diff --git a/tests/unit/restoreFiles.test.js b/tests/unit/restoreFiles.test.js new file mode 100644 index 0000000000..339a347111 --- /dev/null +++ b/tests/unit/restoreFiles.test.js @@ -0,0 +1,70 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const runtime = vi.hoisted(() => ({ + instances: [], +})); + +vi.mock("lib/editorFile", () => ({ + default: class MockEditorFile { + constructor(filename, options) { + this.filename = filename; + this.options = options; + this.loaded = new Promise((resolve) => { + this.resolveLoad = resolve; + }); + runtime.instances.push(this); + } + + load() { + return this.loaded; + } + }, +})); + +import restoreFiles from "lib/restoreFiles"; + +describe("restored file loading", () => { + beforeEach(() => { + runtime.instances.length = 0; + }); + + it("waits for every local tab and activates the last tab by default", async () => { + let completed = false; + const restoration = restoreFiles([ + { id: "one", filename: "one.js", uri: "file:///one.js" }, + { id: "two", filename: "two.js", uri: "file:///two.js" }, + ]).then(() => { + completed = true; + }); + + expect(runtime.instances).toHaveLength(2); + expect(runtime.instances.map((file) => file.options.render)).toEqual([ + false, + true, + ]); + expect(completed).toBe(false); + + runtime.instances[0].resolveLoad(); + await Promise.resolve(); + expect(completed).toBe(false); + + runtime.instances[1].resolveLoad(); + await restoration; + expect(completed).toBe(true); + }); + + it.each(["ftp", "sftp", "http", "https"])( + "does not block startup on an unresolved %s tab", + async (protocol) => { + await restoreFiles([ + { + id: "remote", + filename: "remote.js", + uri: `${protocol}://example.com/remote.js`, + }, + ]); + + expect(runtime.instances).toHaveLength(1); + }, + ); +}); diff --git a/tests/unit/searchMatchHighlighter.test.ts b/tests/unit/searchMatchHighlighter.test.ts new file mode 100644 index 0000000000..7b4fb5ac23 --- /dev/null +++ b/tests/unit/searchMatchHighlighter.test.ts @@ -0,0 +1,161 @@ +// @vitest-environment happy-dom + +import { + openSearchPanel, + search, + SearchQuery, + setSearchQuery, +} from "@codemirror/search"; +import { EditorSelection, EditorState } from "@codemirror/state"; +import { type DecorationSet, EditorView } from "@codemirror/view"; +import searchMatchHighlighter, { + buildSearchMatchDecorations, +} from "cm/searchMatchHighlighter"; +import { afterEach, describe, expect, it } from "vitest"; + +interface HighlightRange { + from: number; + to: number; + className: string; +} + +const views: EditorView[] = []; + +afterEach(() => { + while (views.length) views.pop()?.destroy(); + document.body.replaceChildren(); +}); + +function searchState( + doc: string, + searchText: string, + selection = EditorSelection.cursor(0), + options: Partial[0]> = {}, +): EditorState { + const state = EditorState.create({ + doc, + selection, + extensions: search(), + }); + return state.update({ + effects: setSearchQuery.of( + new SearchQuery({ search: searchText, ...options }), + ), + }).state; +} + +function highlightRanges( + state: EditorState, + visibleRanges: readonly { from: number; to: number }[], +): HighlightRange[] { + return decorationRanges( + buildSearchMatchDecorations(state, visibleRanges), + state.doc.length, + ); +} + +function decorationRanges( + decorations: DecorationSet, + docLength: number, +): HighlightRange[] { + const ranges: HighlightRange[] = []; + decorations.between(0, docLength, (from, to, decoration) => { + ranges.push({ + from, + to, + className: String(decoration.spec.class ?? ""), + }); + }); + return ranges; +} + +describe("custom search match highlighter", () => { + it("reacts to custom query and selection updates without a native panel", () => { + const view = new EditorView({ + state: EditorState.create({ + doc: "foo foo", + extensions: [search(), searchMatchHighlighter], + }), + parent: document.body, + }); + views.push(view); + + view.dispatch({ + effects: setSearchQuery.of(new SearchQuery({ search: "foo" })), + }); + view.dispatch({ selection: EditorSelection.range(4, 7) }); + + const plugin = view.plugin(searchMatchHighlighter); + expect(plugin).not.toBeNull(); + expect( + decorationRanges(plugin!.decorations, view.state.doc.length), + ).toEqual([ + { from: 0, to: 3, className: "cm-searchMatch" }, + { + from: 4, + to: 7, + className: "cm-searchMatch cm-searchMatch-selected", + }, + ]); + }); + + it("highlights every match in the rendered range and marks the selection", () => { + const state = searchState( + "foo foo foo", + "foo", + EditorSelection.range(4, 7), + ); + + expect(highlightRanges(state, [{ from: 0, to: state.doc.length }])).toEqual( + [ + { from: 0, to: 3, className: "cm-searchMatch" }, + { + from: 4, + to: 7, + className: "cm-searchMatch cm-searchMatch-selected", + }, + { from: 8, to: 11, className: "cm-searchMatch" }, + ], + ); + }); + + it("limits work to the viewport instead of scanning a large document", () => { + const padding = "x".repeat(100_000); + const doc = `needle${padding}needle${padding}needle`; + const middleMatch = 6 + padding.length; + const state = searchState(doc, "needle"); + + expect( + highlightRanges(state, [ + { from: middleMatch - 10, to: middleMatch + 16 }, + ]), + ).toEqual([ + { from: middleMatch, to: middleMatch + 6, className: "cm-searchMatch" }, + ]); + }); + + it("merges nearby viewport windows so matches are not decorated twice", () => { + const state = searchState("foo foo foo", "foo"); + + expect( + highlightRanges(state, [ + { from: 0, to: 5 }, + { from: 6, to: 11 }, + ]), + ).toHaveLength(3); + }); + + it("leaves highlighting to CodeMirror when its native panel is open", () => { + const view = new EditorView({ + state: searchState("foo foo", "foo"), + parent: document.body, + }); + views.push(view); + + openSearchPanel(view); + + expect( + highlightRanges(view.state, [{ from: 0, to: view.state.doc.length }]), + ).toEqual([]); + }); +}); diff --git a/tests/unit/searchResultNavigation.test.js b/tests/unit/searchResultNavigation.test.js new file mode 100644 index 0000000000..ace8ed8972 --- /dev/null +++ b/tests/unit/searchResultNavigation.test.js @@ -0,0 +1,229 @@ +import { EditorState } from "@codemirror/state"; +import openFile from "lib/openFile"; +import navigateToResult from "sidebarApps/searchInFiles/navigateToResult"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +vi.mock("lib/openFile", () => ({ default: vi.fn() })); + +function deferred() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} + +const match = { + start: { row: 1, column: 2 }, + end: { row: 1, column: 5 }, +}; + +describe("project search result navigation", () => { + let manager; + let files; + + function addFile(uri, text = "first\n match here\nlast") { + const file = { + uri, + type: "editor", + loaded: true, + loading: false, + session: EditorState.create({ doc: text }), + load: vi.fn().mockResolvedValue(undefined), + }; + files.set(uri, file); + return file; + } + + function activate(file) { + manager.activeFile = file; + manager.editor = { state: file.session }; + } + + beforeEach(() => { + files = new Map(); + manager = { + activeFile: null, + editor: null, + getFile: vi.fn((uri) => files.get(uri)), + revealRange: vi.fn(() => true), + }; + vi.stubGlobal("editorManager", manager); + openFile.mockReset(); + openFile.mockImplementation(async (uri, { signal }) => { + if (signal.aborted) return; + const file = files.get(uri) || addFile(uri); + activate(file); + }); + }); + + afterEach(() => vi.unstubAllGlobals()); + + it.each([false, true])( + "reveals the exact match through the scroll-restore-safe API (existing tab: %s)", + async (existing) => { + if (existing) addFile("target"); + expect(await navigateToResult("target", match)).toBe(true); + expect(openFile).toHaveBeenCalledWith("target", { + render: true, + signal: expect.any(AbortSignal), + }); + expect(manager.revealRange).toHaveBeenCalledWith(8, 11, { + y: "center", + userEvent: "select.search", + }); + }, + ); + + it("waits for a restored tab's final document instead of its preview", async () => { + const file = addFile("target", "preview"); + const loading = deferred(); + file.loaded = false; + file.loading = true; + file.load.mockImplementation(() => loading.promise); + const navigation = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + expect(manager.revealRange).not.toHaveBeenCalled(); + + file.session = EditorState.create({ doc: "first\n match here\nlast" }); + file.loaded = true; + file.loading = false; + activate(file); + loading.resolve(); + expect(await navigation).toBe(true); + expect(manager.revealRange).toHaveBeenCalledWith(8, 11, expect.anything()); + }); + + it("reveals the latest result without waiting for an obsolete open", async () => { + const opening = deferred(); + openFile.mockImplementationOnce(async (uri, { signal }) => { + await opening.promise; + if (!signal.aborted) activate(addFile(uri)); + }); + const first = navigateToResult("slow", match); + await vi.waitFor(() => expect(openFile).toHaveBeenCalledTimes(1)); + const skipped = navigateToResult("intermediate", match); + const last = navigateToResult("latest", match); + await expect(last).resolves.toBe(true); + expect(manager.activeFile.uri).toBe("latest"); + expect(openFile.mock.calls[0][1].signal.aborted).toBe(true); + opening.resolve(); + + expect(await Promise.all([first, skipped, last])).toEqual([ + false, + false, + true, + ]); + expect(openFile.mock.calls.map(([uri]) => uri)).toEqual([ + "slow", + "intermediate", + "latest", + ]); + expect(manager.activeFile.uri).toBe("latest"); + expect(manager.revealRange).toHaveBeenCalledTimes(1); + }); + + it("reveals another file while an obsolete restored tab is still loading", async () => { + const file = addFile("slow"); + const loading = deferred(); + file.loaded = false; + file.loading = true; + file.load.mockImplementation(() => loading.promise); + const first = navigateToResult("slow", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + + await expect(navigateToResult("latest", match)).resolves.toBe(true); + expect(manager.activeFile.uri).toBe("latest"); + file.loaded = true; + file.loading = false; + loading.resolve(); + await expect(first).resolves.toBe(false); + expect(manager.activeFile.uri).toBe("latest"); + expect(manager.revealRange).toHaveBeenCalledTimes(1); + }); + + it("ignores late failures from an obsolete open", async () => { + const opening = deferred(); + openFile.mockImplementationOnce(() => opening.promise); + const first = navigateToResult("slow", match); + await expect(navigateToResult("latest", match)).resolves.toBe(true); + opening.reject(new Error("Obsolete read failed")); + await expect(first).resolves.toBe(false); + expect(manager.activeFile.uri).toBe("latest"); + }); + + it("uses the latest match when the same file is still loading", async () => { + const file = addFile("target"); + const loading = deferred(); + file.load.mockImplementationOnce(() => loading.promise); + const first = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + const last = navigateToResult("target", { + start: { row: 2, column: 0 }, + end: { row: 2, column: 4 }, + }); + loading.resolve(); + expect(await Promise.all([first, last])).toEqual([false, true]); + expect(manager.revealRange).toHaveBeenCalledExactlyOnceWith( + 19, + 23, + expect.anything(), + ); + }); + + it.each(["switched", "closed", "failed"])( + "does not reveal into another document after the target is %s during loading", + async (action) => { + const file = addFile("target"); + const loading = deferred(); + file.load.mockImplementation(() => loading.promise); + const navigation = navigateToResult("target", match); + await vi.waitFor(() => expect(file.load).toHaveBeenCalled()); + if (action === "switched") activate(addFile("other")); + if (action === "closed") files.delete("target"); + if (action === "failed") file.loaded = false; + loading.resolve(); + expect(await navigation).toBe(false); + expect(manager.revealRange).not.toHaveBeenCalled(); + }, + ); + + it.each(["missing", "image"])( + "does not navigate the previous editor when opening a %s target", + async (type) => { + activate(addFile("previous")); + openFile.mockImplementationOnce(async () => { + if (type === "image") { + const file = addFile("target"); + file.type = "image"; + activate(file); + } + }); + expect(await navigateToResult("target", match)).toBe(false); + expect(manager.revealRange).not.toHaveBeenCalled(); + }, + ); + + it("handles multiline ranges and clamps stale coordinates", async () => { + addFile("target", "abc\ndef"); + await navigateToResult("target", { + start: { row: 0, column: 1 }, + end: { row: 1, column: 2 }, + }); + expect(manager.revealRange).toHaveBeenLastCalledWith(1, 6, expect.anything()); + await navigateToResult("target", { + start: { row: -1, column: -2 }, + end: { row: 100, column: 100 }, + }); + expect(manager.revealRange).toHaveBeenLastCalledWith(0, 7, expect.anything()); + }); + + it("continues navigating after an open rejects", async () => { + openFile.mockRejectedValueOnce(new Error("Read failed")); + await expect(navigateToResult("broken", match)).rejects.toThrow("Read failed"); + expect(await navigateToResult("target", match)).toBe(true); + expect(manager.activeFile.uri).toBe("target"); + }); +}); diff --git a/tests/unit/selectionMenuButton.test.ts b/tests/unit/selectionMenuButton.test.ts new file mode 100644 index 0000000000..47e0b26b1b --- /dev/null +++ b/tests/unit/selectionMenuButton.test.ts @@ -0,0 +1,89 @@ +// @vitest-environment happy-dom + +import { bindSelectionMenuButton } from "cm/selectionMenuUtils"; +import { describe, expect, it, vi } from "vitest"; + +function pointerEvent( + type: string, + pointerId = 7, + position: { x: number; y: number } = { x: 0, y: 0 }, +) { + return new PointerEvent(type, { + bubbles: true, + button: 0, + cancelable: true, + clientX: position.x, + clientY: position.y, + isPrimary: true, + pointerId, + pointerType: "touch", + }); +} + +describe("selection menu button interaction", () => { + it("preserves pointer-down and activates exactly once on release", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + const down = pointerEvent("pointerdown"); + button.dispatchEvent(down); + expect(down.defaultPrevented).toBe(true); + expect(button.classList.contains("is-pressed")).toBe(true); + expect(activate).not.toHaveBeenCalled(); + + button.dispatchEvent(pointerEvent("pointerup")); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).toHaveBeenCalledTimes(1); + }); + + it("supports keyboard clicks and cancels interrupted presses", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown")); + button.dispatchEvent(pointerEvent("pointercancel")); + expect(activate).not.toHaveBeenCalled(); + + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 0 }), + ); + expect(activate).toHaveBeenCalledTimes(1); + }); + + it("does not activate an action when the pointer becomes a scroll gesture", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown", 7, { x: 10, y: 10 })); + button.dispatchEvent(pointerEvent("pointermove", 7, { x: 10, y: 30 })); + button.dispatchEvent(pointerEvent("pointerup", 7, { x: 10, y: 30 })); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).not.toHaveBeenCalled(); + }); + + it("checks final pointer displacement when no move event is delivered", () => { + const button = document.createElement("button"); + const activate = vi.fn(); + bindSelectionMenuButton(button, activate); + + button.dispatchEvent(pointerEvent("pointerdown", 7, { x: 10, y: 10 })); + button.dispatchEvent(pointerEvent("pointerup", 7, { x: 30, y: 10 })); + button.dispatchEvent( + new MouseEvent("click", { bubbles: true, cancelable: true, detail: 1 }), + ); + + expect(button.classList.contains("is-pressed")).toBe(false); + expect(activate).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/unit/selectionMenuUtils.test.ts b/tests/unit/selectionMenuUtils.test.ts index 962f912e94..360fafdc57 100644 --- a/tests/unit/selectionMenuUtils.test.ts +++ b/tests/unit/selectionMenuUtils.test.ts @@ -1,4 +1,7 @@ -import { filterSelectionMenuItems } from "cm/selectionMenuUtils"; +import { + filterSelectionMenuItems, + partitionSelectionMenuItems, +} from "cm/selectionMenuUtils"; import { describe, expect, it } from "vitest"; const items = [ @@ -41,3 +44,32 @@ describe("selection menu filtering", () => { ]); }); }); + +describe("selection menu hierarchy", () => { + it("keeps selection essentials in the compact toolbar", () => { + const pluginItem = { id: "plugin-action", mode: "all" } as const; + const { primary, overflow } = partitionSelectionMenuItems( + [...items, pluginItem], + { hasSelection: true }, + ); + + expect(primary.map((item) => item.id)).toEqual([ + "copy", + "cut", + "paste", + "select-all", + ]); + expect(overflow.map((item) => item.id)).toEqual(["plugin-action"]); + }); + + it("keeps caret actions concise and moves plugins into More", () => { + const pluginItem = { mode: "all" } as const; + const { primary, overflow } = partitionSelectionMenuItems( + [...items, pluginItem], + { hasSelection: false }, + ); + + expect(primary.map((item) => item.id)).toEqual(["paste", "select-all"]); + expect(overflow).toEqual([items[0], items[1], pluginItem]); + }); +}); diff --git a/tests/unit/sessionPersistence.test.js b/tests/unit/sessionPersistence.test.js new file mode 100644 index 0000000000..e096148b65 --- /dev/null +++ b/tests/unit/sessionPersistence.test.js @@ -0,0 +1,198 @@ +// @vitest-environment happy-dom + +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const runtime = vi.hoisted(() => { + const settings = { + value: { + rememberFiles: true, + rememberFolders: false, + }, + }; + + return { + settings, + openFile: vi.fn(), + }; +}); + +vi.mock("cm/editorUtils", () => ({ + getAllFolds: vi.fn(() => []), + getScrollPosition: vi.fn(() => ({ scrollTop: 0, scrollLeft: 0 })), + getSelection: vi.fn(() => ({ + ranges: [{ from: 0, to: 0 }], + mainIndex: 0, + })), +})); +vi.mock("dialogs/alert", () => ({ default: vi.fn() })); +vi.mock("fileSystem", () => ({ default: vi.fn() })); +vi.mock("lib/auth", () => ({ default: {} })); +vi.mock("lib/config", () => ({ + default: { DEFAULT_FILE_SESSION: "default-session" }, +})); +vi.mock("lib/openFile", () => ({ default: runtime.openFile })); +vi.mock("lib/openFolder", () => ({ + default: vi.fn(), + addedFolder: [], +})); +vi.mock("lib/settings", () => ({ default: runtime.settings })); +vi.mock("lib/startAd", () => ({ + BANNER_SUPPRESSION_REASON: {}, + setBannerSuppressed: vi.fn(), +})); +vi.mock("utils/helpers", () => ({ + default: { error: vi.fn(), errorMessage: vi.fn() }, +})); + +import HandleIntent from "handlers/intent"; +import { promoteSessionPersistence } from "lib/fileSessionPersistence"; +import saveState from "lib/saveState"; +import FileBrowser from "pages/fileBrowser"; + +describe("file session persistence", () => { + beforeEach(() => { + runtime.openFile.mockReset(); + localStorage.clear(); + sessionStorage.clear(); + sessionStorage.setItem("isfilesRestored", "true"); + globalThis.editorManager = { + editor: {}, + files: [], + activeFile: null, + getFile(value, type = "id") { + return this.files.find((file) => file[type] === value); + }, + }; + runtime.openFile.mockImplementation(async (uri, options = {}) => { + const existingFile = globalThis.editorManager.getFile(uri, "uri"); + if (existingFile) { + promoteSessionPersistence(existingFile, options.persistInSession); + globalThis.editorManager.activeFile = existingFile; + return; + } + + const file = createOpenFile(uri, options); + globalThis.editorManager.files.push(file); + globalThis.editorManager.activeFile = file; + }); + }); + + it("persists only a picker document with durable URI access", async () => { + const selectedUri = "content://documents/document/selected"; + const unpersistableUri = "content://documents/document/no-grant"; + const intentUri = "content://external-app/shared/temporary"; + + await FileBrowser.openFile({ + type: "file", + url: selectedUri, + name: "selected.js", + mode: "single", + persistedUriPermission: true, + }); + await FileBrowser.openFile({ + type: "file", + url: unpersistableUri, + name: "no-grant.js", + mode: "single", + persistedUriPermission: false, + }); + await HandleIntent({ + action: "android.intent.action.VIEW", + data: intentUri, + }); + await HandleIntent({ + action: "android.intent.action.VIEW", + data: selectedUri, + }); + + saveState(); + + const restoredUris = JSON.parse(localStorage.files).map( + (file) => file.uri, + ); + expect(restoredUris).toEqual([selectedUri]); + }); + + it("promotes an intent tab when the same document is later selected", async () => { + const uri = "content://documents/document/shared"; + + await HandleIntent({ + action: "android.intent.action.VIEW", + data: uri, + }); + await FileBrowser.openFile({ + type: "file", + url: uri, + name: "shared.js", + mode: "single", + persistedUriPermission: true, + }); + + saveState(); + + expect(JSON.parse(localStorage.files).map((file) => file.uri)).toEqual([ + uri, + ]); + }); + + it("keeps restored folds until an inactive tab is first rendered", () => { + const file = createOpenFile("file:///restored.js", {}); + file.restoredFolds = [ + { fromLine: 2, fromCol: 0, toLine: 5, toCol: 1 }, + ]; + globalThis.editorManager.files.push(file); + + saveState(); + + expect(JSON.parse(localStorage.files)[0].folds).toEqual(file.restoredFolds); + }); + + it("keeps the restored cursor while a remote tab is still loading", () => { + const file = createOpenFile("sftp://example.com/restored.js", {}); + file.loaded = false; + file.loading = true; + file.restoredSelection = { + ranges: [{ from: 25, to: 25 }], + mainIndex: 0, + }; + file.lastScrollTop = 120; + file.lastScrollLeft = 8; + globalThis.editorManager.files.push(file); + globalThis.editorManager.activeFile = file; + + saveState(); + + const savedFile = JSON.parse(localStorage.files)[0]; + expect(savedFile.cursorPos).toEqual(file.restoredSelection); + expect(savedFile.scrollTop).toBe(120); + expect(savedFile.scrollLeft).toBe(8); + }); +}); + +function createOpenFile(uri, options) { + return { + id: `file-${globalThis.editorManager.files.length + 1}`, + uri, + type: "editor", + filename: options.name || uri.split("/").pop(), + pinned: false, + isUnsaved: false, + docVersion: 0, + savedVersion: 0, + cacheVersion: 0, + savedMtime: 1, + diskMtime: 1, + hasDiskConflict: false, + readOnly: false, + SAFMode: options.mode, + deletedFile: false, + session: { + selection: { ranges: [{ from: 0, to: 0 }], mainIndex: 0 }, + }, + lastScrollTop: 0, + lastScrollLeft: 0, + editable: true, + encoding: "UTF-8", + persistInSession: options.persistInSession, + }; +} diff --git a/tests/unit/sftpProfiles.test.js b/tests/unit/sftpProfiles.test.js index eb160a629e..b66dab3d9d 100644 --- a/tests/unit/sftpProfiles.test.js +++ b/tests/unit/sftpProfiles.test.js @@ -31,6 +31,9 @@ describe("SFTP secure profiles", () => { expect(url).toBe("sftp://profile-123/project/file.js"); expect(getSftpProfileId(url)).toBe("profile-123"); expect(getSftpProfileId("sftp://user:secret@example.com/project")).toBeNull(); + expect( + getSftpProfileId("sftp://user:secret@profile-server/project"), + ).toBeNull(); }); it("passes transient form credentials to the encrypted native profile store", async () => { @@ -104,7 +107,7 @@ describe("SFTP secure profiles", () => { "sftp://profile-abcd/project/app.js", ); expect(localStorage.getItem("storageList")).not.toContain("p%40ss"); - expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("1"); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); const restoredLegacy = "sftp://other:secret@example.net/"; localStorage.setItem("recentFolders", JSON.stringify([restoredLegacy])); @@ -115,21 +118,178 @@ describe("SFTP secure profiles", () => { ); }); - it("fails closed when a legacy URL cannot be encrypted", async () => { + it("reuses the folder profile for legacy expansion-state keys", async () => { + const saveProfile = vi.fn(); + globalThis.sftp = { + saveProfile, + }; + const expandedFolder = + "sftp://user:secret@example.com/project/src/components"; + localStorage.setItem( + "folders", + JSON.stringify([ + { + url: "sftp://profile-existing/project", + opts: { listState: { [expandedFolder]: true } }, + }, + ]), + ); + + await migrateLegacySftpProfiles(); + + const folders = JSON.parse(localStorage.getItem("folders")); + expect(folders[0].opts.listState).toEqual({ + "sftp://profile-existing/project/src/components": true, + }); + expect(saveProfile).not.toHaveBeenCalled(); + expect(localStorage.getItem("folders")).not.toContain("secret"); + }); + + it("uses one new profile for a legacy folder and its expansion state", async () => { + const saveProfile = vi.fn((...args) => args.at(-2)("profile-folder")); + globalThis.sftp = { saveProfile }; + const root = "sftp://user:secret@example.com/project"; + const expandedFolder = + "sftp://user:stale-secret@example.com/project/src"; + localStorage.setItem( + "folders", + JSON.stringify([ + { + opts: { listState: { [expandedFolder]: true } }, + url: root, + }, + ]), + ); + + await migrateLegacySftpProfiles(); + + const folders = JSON.parse(localStorage.getItem("folders")); + expect(folders[0]).toMatchObject({ + url: "sftp://profile-folder/project", + opts: { + listState: { "sftp://profile-folder/project/src": true }, + }, + }); + expect(saveProfile).toHaveBeenCalledTimes(1); + }); + + it("drops URL-shaped object keys when their profile cannot migrate", async () => { globalThis.sftp = { saveProfile: (...args) => args.at(-1)("Keystore unavailable"), }; + const legacyKey = "sftp://user:secret@example.com/project/src"; + localStorage.setItem( + "fileBrowserState", + JSON.stringify([{ [legacyKey]: true }]), + ); + + const result = await migrateLegacySftpProfiles(); + + expect(JSON.parse(localStorage.getItem("fileBrowserState"))).toEqual([{}]); + expect(localStorage.getItem("fileBrowserState")).not.toContain("secret"); + expect(result).toMatchObject({ + removedReferences: 1, + failures: [ + { + hostname: "example.com", + username: "user", + message: "Keystore unavailable", + }, + ], + }); + }); + + it("removes failed connections and recovers unsaved remote files", async () => { + globalThis.sftp = { + saveProfile: (...args) => + args.at(-1)(new Error("Keystore unavailable for secret")), + }; const legacy = "sftp://user:secret@example.com/"; localStorage.setItem( "storageList", JSON.stringify([{ storageType: "sftp", url: legacy }]), ); + localStorage.setItem("recentFiles", JSON.stringify([`${legacy}app.js`])); + localStorage.setItem( + "files", + JSON.stringify([ + { + id: "cached-unsaved-file", + uri: `${legacy}draft.js`, + filename: "draft.js", + isUnsaved: true, + }, + { + id: "clean-remote-file", + uri: `${legacy}saved.js`, + filename: "saved.js", + isUnsaved: false, + }, + ]), + ); + + const result = await migrateLegacySftpProfiles(); + const files = JSON.parse(localStorage.getItem("files")); + + expect(JSON.parse(localStorage.getItem("storageList"))).toEqual([]); + expect(JSON.parse(localStorage.getItem("recentFiles"))).toEqual([]); + expect(files).toHaveLength(1); + expect(files[0]).toMatchObject({ + id: "cached-unsaved-file", + uri: null, + filename: "Recovered draft.js", + isUnsaved: true, + deletedFile: true, + }); + expect(JSON.stringify(files)).not.toContain("secret"); + expect(result).toMatchObject({ + removedReferences: 4, + recoveredFiles: 1, + }); + expect(result.failures).toEqual([ + { + hostname: "example.com", + username: "user", + message: "Keystore unavailable for [redacted]", + }, + ]); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); + }); + + it("scrubs malformed legacy SFTP values instead of marking them migrated", async () => { + globalThis.sftp = { saveProfile: vi.fn() }; + localStorage.setItem( + "recentFiles", + JSON.stringify([ + "sftp:///missing-host", + "sftp://user:%E0%A4%A@example.com/bad-encoding", + ]), + ); - await expect(migrateLegacySftpProfiles()).rejects.toThrow( - "SFTP credentials could not be moved to encrypted native storage", + const result = await migrateLegacySftpProfiles(); + + expect(JSON.parse(localStorage.getItem("recentFiles"))).toEqual([]); + expect(result.failures[0].message).toBe( + "The saved SFTP address is incomplete", ); + expect(result.failures[1].message).toBe("URI malformed"); + expect(localStorage.getItem("sftpNativeProfileMigration")).toBe("2"); + }); + + it("deletes an app-owned legacy key copy when its profile cannot migrate", async () => { + globalThis.sftp = { + saveProfile: (...args) => args.at(-1)("Private key is unreadable"), + }; + const legacy = + "sftp://user@example.com/?keyFile=file%3A%2F%2F%2Fdata%2Fid_rsa&passPhrase=key-secret"; + localStorage.setItem( + "storageList", + JSON.stringify([{ storageType: "sftp", url: legacy }]), + ); + + await migrateLegacySftpProfiles(); - expect(JSON.parse(localStorage.getItem("storageList"))[0].url).toBe(legacy); - expect(localStorage.getItem("sftpNativeProfileMigration")).toBeNull(); + expect(JSON.parse(localStorage.getItem("storageList"))).toEqual([]); + expect(deleteMock).toHaveBeenCalledTimes(1); }); }); diff --git a/tests/unit/variableVirtualList.test.js b/tests/unit/variableVirtualList.test.js new file mode 100644 index 0000000000..ed1e0c70d7 --- /dev/null +++ b/tests/unit/variableVirtualList.test.js @@ -0,0 +1,194 @@ +// @vitest-environment happy-dom + +import { describe, expect, it } from "vitest"; +import VariableVirtualList from "components/virtualList/variable"; + +function createList() { + const container = document.createElement("div"); + Object.defineProperty(container, "clientHeight", { + configurable: true, + value: 200, + }); + document.body.append(container); + return { container, list: new VariableVirtualList(container) }; +} + +describe("VariableVirtualList", () => { + it("retains all items while mounting only the viewport window", () => { + const { container, list } = createList(); + const elements = Array.from({ length: 1000 }, (_, index) => { + const element = document.createElement("div"); + element.textContent = `message-${index}`; + list.append(element); + return element; + }); + + list.render(); + + expect(list.length).toBe(1000); + expect(list.mountedCount).toBeLessThan(40); + expect(elements[999].isConnected).toBe(true); + expect(elements[0].isConnected).toBe(false); + + list.stickToBottom = false; + container.scrollTop = 0; + list.render(); + expect(elements[0].isConnected).toBe(true); + expect(elements[999].isConnected).toBe(false); + + list.destroy(); + container.remove(); + }); + + it("updates variable measurements and clears the retained model", () => { + const { container, list } = createList(); + const element = document.createElement("div"); + list.append(element); + list.render(); + + list.updateHeight(list.items[0], 96); + list.rebuildOffsets(); + expect(list.offsets).toEqual([0, 96]); + + list.clear(); + expect(list.length).toBe(0); + expect(list.mountedCount).toBe(0); + expect(container.scrollTop).toBe(0); + + list.destroy(); + container.remove(); + }); + + it("preserves an inline footer outside the virtualized rows", () => { + const container = document.createElement("div"); + Object.defineProperty(container, "clientHeight", { + configurable: true, + value: 200, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.textContent = "REPL prompt"; + const list = new VariableVirtualList(container, { footer }); + + list.append(document.createElement("div")); + list.render(); + expect(container.lastElementChild).toBe(footer); + + list.clear(); + expect(container.lastElementChild).toBe(footer); + expect(footer.isConnected).toBe(true); + + list.destroy(); + container.remove(); + }); + + it("includes the footer height when pinning and rendering the bottom", () => { + const container = document.createElement("div"); + Object.defineProperties(container, { + clientHeight: { configurable: true, value: 200 }, + scrollHeight: { configurable: true, value: 5304 }, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.getBoundingClientRect = () => ({ height: 104 }); + const list = new VariableVirtualList(container, { + footer, + overscan: 0, + }); + for (let index = 0; index < 100; index++) { + list.append(document.createElement("div")); + } + + list.render(); + + expect(list.renderedRange.start).toBe(98); + expect(list.renderedRange.end).toBe(100); + expect(container.scrollTop).toBe(5104); + expect(container.lastElementChild).toBe(footer); + + list.destroy(); + container.remove(); + }); + + it("keeps a pinned footer visible when the viewport height changes", () => { + let viewportHeight = 200; + const container = document.createElement("div"); + Object.defineProperties(container, { + clientHeight: { + configurable: true, + get: () => viewportHeight, + }, + scrollHeight: { configurable: true, value: 5304 }, + }); + document.body.append(container); + const footer = document.createElement("form"); + footer.getBoundingClientRect = () => ({ height: 104 }); + const list = new VariableVirtualList(container, { footer }); + for (let index = 0; index < 100; index++) { + list.append(document.createElement("div")); + } + list.render(); + expect(container.scrollTop).toBe(5104); + + viewportHeight = 100; + list.onResize([ + { + target: container, + contentRect: { height: viewportHeight }, + }, + ]); + list.render(); + + expect(list.stickToBottom).toBe(true); + expect(container.scrollTop).toBe(5204); + + list.destroy(); + container.remove(); + }); + + it("pre-paints a larger guard before touch momentum starts", () => { + const { container, list } = createList(); + for (let index = 0; index < 1000; index++) { + list.append(document.createElement("div")); + } + list.stickToBottom = false; + container.scrollTop = 10000; + list.render(); + const idleCount = list.mountedCount; + + container.dispatchEvent(new Event("touchstart")); + + expect(list.dynamicOverscan).toBe(list.activeOverscan); + expect(list.mountedCount).toBeGreaterThan(idleCount); + + list.destroy(); + container.remove(); + }); + + it("keeps overlapping rows mounted during incremental scrolling", () => { + const { container, list } = createList(); + Object.defineProperty(container, "scrollHeight", { + configurable: true, + value: 10400, + }); + const elements = Array.from({ length: 200 }, () => { + const element = document.createElement("div"); + list.append(element); + return element; + }); + list.stickToBottom = false; + container.scrollTop = 520; + list.render(); + const retained = elements[10]; + expect(retained.isConnected).toBe(true); + + container.scrollTop = 624; + container.dispatchEvent(new Event("scroll")); + + expect(retained.isConnected).toBe(true); + expect(list.dynamicOverscan).toBeGreaterThan(list.overscan); + + list.destroy(); + container.remove(); + }); +}); diff --git a/tests/unit/webview.test.js b/tests/unit/webview.test.js new file mode 100644 index 0000000000..2d08ea3a81 --- /dev/null +++ b/tests/unit/webview.test.js @@ -0,0 +1,71 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { nativeBridge } = vi.hoisted(() => ({ + nativeBridge: { + setMessageCallback: vi.fn(), + create: vi.fn(), + evaluate: vi.fn(), + destroy: vi.fn(), + }, +})); + +vi.mock("../../src/plugins/webview/www/webview", () => ({ + default: nativeBridge, +})); + +import webviewAPI from "lib/webview"; + +describe("WebView lifecycle", () => { + beforeEach(() => { + vi.clearAllMocks(); + nativeBridge.create.mockResolvedValue("webview-1"); + nativeBridge.evaluate.mockResolvedValue("result"); + nativeBridge.destroy.mockResolvedValue(undefined); + }); + + it("keeps the instance usable when native destruction fails", async () => { + const webview = await webviewAPI.create(); + nativeBridge.destroy.mockRejectedValueOnce(new Error("native failure")); + + await expect(webview.destroy()).rejects.toThrow("native failure"); + await expect(webview.evaluate("1 + 1")).resolves.toBe("result"); + expect(nativeBridge.evaluate).toHaveBeenCalledWith("webview-1", "1 + 1"); + + await expect(webview.destroy()).resolves.toBeUndefined(); + expect(nativeBridge.destroy).toHaveBeenCalledTimes(2); + }); + + it("marks the instance destroyed only after native destruction succeeds", async () => { + const webview = await webviewAPI.create(); + + await webview.destroy(); + + await expect(webview.evaluate("1 + 1")).rejects.toThrow( + "WebView has been destroyed", + ); + }); + + it("shares native destruction between concurrent callers", async () => { + let resolveDestroy; + nativeBridge.destroy.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveDestroy = resolve; + }), + ); + const webview = await webviewAPI.create(); + + const firstDestroy = webview.destroy(); + const secondDestroy = webview.destroy(); + + expect(nativeBridge.destroy).toHaveBeenCalledTimes(1); + resolveDestroy(); + await expect(Promise.all([firstDestroy, secondDestroy])).resolves.toEqual([ + undefined, + undefined, + ]); + await expect(webview.evaluate("1 + 1")).rejects.toThrow( + "WebView has been destroyed", + ); + }); +}); diff --git a/webpack.config.js b/webpack.config.js index 8767eaa8f6..2fbead728b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -110,6 +110,7 @@ module.exports = (env, options) => { entry: { main: './src/main.js', console: './src/lib/console.js', + consoleWorker: './src/lib/consoleWorker.js', searchInFilesWorker: './src/sidebarApps/searchInFiles/worker.js', searchIndexWorker: './src/sidebarApps/searchInFiles/indexWorker.js', }, diff --git a/www/index.html b/www/index.html index 07f170909f..78fbbfd2b2 100644 --- a/www/index.html +++ b/www/index.html @@ -141,12 +141,26 @@ ); } + function isStorageError(reason) { + if (!reason) return false; + return ( + reason.name === "FileError" || + reason.name === "NotFoundError" || + reason.name === "SecurityError" || + (typeof window.FileError !== "undefined" && + reason instanceof window.FileError) + ); + } + function handleStartupError(event) { if (!isStartupLoading()) return; var message = event && event.message ? event.message : "Startup error"; setStartupMessage( - "Acode failed to start. Update Android System WebView or Chrome. " + - message + isStorageError(event && event.error) + ? "Acode failed to start: storage is unavailable. Try restarting your device, or clearing the app data. " + + message + : "Acode failed to start. Update Android System WebView or Chrome. " + + message ); } @@ -156,8 +170,11 @@ var message = reason && reason.message ? reason.message : "Startup promise failed"; setStartupMessage( - "Acode failed to start. Update Android System WebView or Chrome. " + - message + isStorageError(reason) + ? "Acode failed to start: storage is unavailable. Try restarting your device, or clearing the app data. " + + message + : "Acode failed to start. Update Android System WebView or Chrome. " + + message ); }